From 22aa0df1e880f3f3953bcbe25f3b8b661e711a73 Mon Sep 17 00:00:00 2001 From: Mohammad Rameen Date: Thu, 11 Sep 2025 06:03:58 +0530 Subject: [PATCH] Added venv environment --- .../venv/bin/Activate.ps1 | 247 + Visual Studio Code Projects/venv/bin/activate | 70 + .../venv/bin/activate.csh | 27 + .../venv/bin/activate.fish | 69 + Visual Studio Code Projects/venv/bin/flask | 10 + Visual Studio Code Projects/venv/bin/pip | 10 + Visual Studio Code Projects/venv/bin/pip3 | 10 + Visual Studio Code Projects/venv/bin/pip3.12 | 10 + Visual Studio Code Projects/venv/bin/python | 1 + Visual Studio Code Projects/venv/bin/python3 | 1 + .../venv/bin/python3.12 | 1 + .../Bootstrap_Flask-2.2.0.dist-info/INSTALLER | 1 + .../Bootstrap_Flask-2.2.0.dist-info/LICENSE | 234 + .../Bootstrap_Flask-2.2.0.dist-info/METADATA | 43 + .../Bootstrap_Flask-2.2.0.dist-info/RECORD | 241 + .../Bootstrap_Flask-2.2.0.dist-info/REQUESTED | 0 .../Bootstrap_Flask-2.2.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../Flask-2.3.2.dist-info/INSTALLER | 1 + .../Flask-2.3.2.dist-info/LICENSE.rst | 28 + .../Flask-2.3.2.dist-info/METADATA | 118 + .../Flask-2.3.2.dist-info/RECORD | 54 + .../Flask-2.3.2.dist-info/REQUESTED | 0 .../site-packages/Flask-2.3.2.dist-info/WHEEL | 5 + .../Flask-2.3.2.dist-info/entry_points.txt | 2 + .../Flask-2.3.2.dist-info/top_level.txt | 1 + .../MarkupSafe-3.0.2.dist-info/INSTALLER | 1 + .../MarkupSafe-3.0.2.dist-info/LICENSE.txt | 28 + .../MarkupSafe-3.0.2.dist-info/METADATA | 92 + .../MarkupSafe-3.0.2.dist-info/RECORD | 14 + .../MarkupSafe-3.0.2.dist-info/WHEEL | 6 + .../MarkupSafe-3.0.2.dist-info/top_level.txt | 1 + .../WTForms-3.0.1.dist-info/INSTALLER | 1 + .../WTForms-3.0.1.dist-info/LICENSE.rst | 28 + .../WTForms-3.0.1.dist-info/METADATA | 88 + .../WTForms-3.0.1.dist-info/RECORD | 107 + .../WTForms-3.0.1.dist-info/REQUESTED | 0 .../WTForms-3.0.1.dist-info/WHEEL | 5 + .../WTForms-3.0.1.dist-info/top_level.txt | 1 + .../blinker-1.9.0.dist-info/INSTALLER | 1 + .../blinker-1.9.0.dist-info/LICENSE.txt | 20 + .../blinker-1.9.0.dist-info/METADATA | 60 + .../blinker-1.9.0.dist-info/RECORD | 12 + .../blinker-1.9.0.dist-info/WHEEL | 4 + .../site-packages/blinker/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 527 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 0 -> 2754 bytes .../blinker/__pycache__/base.cpython-312.pyc | Bin 0 -> 22031 bytes .../site-packages/blinker/_utilities.py | 64 + .../python3.12/site-packages/blinker/base.py | 512 + .../python3.12/site-packages/blinker/py.typed | 0 .../click-8.2.1.dist-info/INSTALLER | 1 + .../click-8.2.1.dist-info/METADATA | 82 + .../click-8.2.1.dist-info/RECORD | 38 + .../site-packages/click-8.2.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/click/__init__.py | 123 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4099 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 24221 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 0 -> 31560 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 0 -> 2452 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 0 -> 11797 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 0 -> 127697 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 22164 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 14803 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 0 -> 13699 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 0 -> 2992 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 0 -> 20232 bytes .../shell_completion.cpython-312.pyc | Bin 0 -> 23199 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 0 -> 34550 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 0 -> 26926 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 0 -> 48986 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 0 -> 24906 bytes .../python3.12/site-packages/click/_compat.py | 622 + .../site-packages/click/_termui_impl.py | 839 ++ .../site-packages/click/_textwrap.py | 51 + .../site-packages/click/_winconsole.py | 296 + .../python3.12/site-packages/click/core.py | 3135 ++++ .../site-packages/click/decorators.py | 551 + .../site-packages/click/exceptions.py | 308 + .../site-packages/click/formatting.py | 301 + .../python3.12/site-packages/click/globals.py | 67 + .../python3.12/site-packages/click/parser.py | 532 + .../python3.12/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 644 + .../python3.12/site-packages/click/termui.py | 877 ++ .../python3.12/site-packages/click/testing.py | 565 + .../python3.12/site-packages/click/types.py | 1165 ++ .../python3.12/site-packages/click/utils.py | 627 + .../site-packages/flask/__init__.py | 102 + .../site-packages/flask/__main__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3269 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 267 bytes .../flask/__pycache__/app.cpython-312.pyc | Bin 0 -> 83201 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 0 -> 30787 bytes .../flask/__pycache__/cli.cpython-312.pyc | Bin 0 -> 39732 bytes .../flask/__pycache__/config.cpython-312.pyc | Bin 0 -> 15399 bytes .../flask/__pycache__/ctx.cpython-312.pyc | Bin 0 -> 19583 bytes .../__pycache__/debughelpers.cpython-312.pyc | Bin 0 -> 8583 bytes .../flask/__pycache__/globals.cpython-312.pyc | Bin 0 -> 3659 bytes .../flask/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 28011 bytes .../flask/__pycache__/logging.cpython-312.pyc | Bin 0 -> 3288 bytes .../__pycache__/scaffold.cpython-312.pyc | Bin 0 -> 34893 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 15937 bytes .../flask/__pycache__/signals.cpython-312.pyc | Bin 0 -> 1759 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 9941 bytes .../flask/__pycache__/testing.cpython-312.pyc | Bin 0 -> 13243 bytes .../flask/__pycache__/typing.cpython-312.pyc | Bin 0 -> 3806 bytes .../flask/__pycache__/views.cpython-312.pyc | Bin 0 -> 6870 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 0 -> 6108 bytes .../lib/python3.12/site-packages/flask/app.py | 2213 +++ .../site-packages/flask/blueprints.py | 626 + .../lib/python3.12/site-packages/flask/cli.py | 1067 ++ .../python3.12/site-packages/flask/config.py | 345 + .../lib/python3.12/site-packages/flask/ctx.py | 440 + .../site-packages/flask/debughelpers.py | 160 + .../python3.12/site-packages/flask/globals.py | 96 + .../python3.12/site-packages/flask/helpers.py | 693 + .../site-packages/flask/json/__init__.py | 170 + .../json/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6719 bytes .../json/__pycache__/provider.cpython-312.pyc | Bin 0 -> 9270 bytes .../json/__pycache__/tag.cpython-312.pyc | Bin 0 -> 13368 bytes .../site-packages/flask/json/provider.py | 216 + .../site-packages/flask/json/tag.py | 314 + .../python3.12/site-packages/flask/logging.py | 76 + .../python3.12/site-packages/flask/py.typed | 0 .../site-packages/flask/scaffold.py | 923 ++ .../site-packages/flask/sessions.py | 367 + .../python3.12/site-packages/flask/signals.py | 33 + .../site-packages/flask/templating.py | 220 + .../python3.12/site-packages/flask/testing.py | 282 + .../python3.12/site-packages/flask/typing.py | 82 + .../python3.12/site-packages/flask/views.py | 190 + .../site-packages/flask/wrappers.py | 173 + .../site-packages/flask_bootstrap/__init__.py | 288 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 13154 bytes .../flask_bootstrap/static/.DS_Store | Bin 0 -> 6148 bytes .../static/bootstrap4/.DS_Store | Bin 0 -> 8196 bytes .../static/bootstrap4/css/.DS_Store | Bin 0 -> 6148 bytes .../static/bootstrap4/css/bootstrap.min.css | 7 + .../bootstrap4/css/bootstrap.min.css.map | 1 + .../bootstrap4/css/bootswatch/.DS_Store | Bin 0 -> 8196 bytes .../css/bootswatch/cerulean/_bootswatch.scss | 102 + .../css/bootswatch/cerulean/_variables.scss | 57 + .../css/bootswatch/cerulean/bootstrap.css | 10435 ++++++++++++++ .../css/bootswatch/cerulean/bootstrap.min.css | 12 + .../css/bootswatch/cosmo/_bootswatch.scss | 27 + .../css/bootswatch/cosmo/_variables.scss | 67 + .../css/bootswatch/cosmo/bootstrap.css | 10058 +++++++++++++ .../css/bootswatch/cosmo/bootstrap.min.css | 12 + .../css/bootswatch/cyborg/_bootswatch.scss | 330 + .../css/bootswatch/cyborg/_variables.scss | 169 + .../css/bootswatch/cyborg/bootstrap.css | 10623 ++++++++++++++ .../css/bootswatch/cyborg/bootstrap.min.css | 12 + .../css/bootswatch/darkly/_bootswatch.scss | 247 + .../css/bootswatch/darkly/_variables.scss | 164 + .../css/bootswatch/darkly/bootstrap.css | 10527 ++++++++++++++ .../css/bootswatch/darkly/bootstrap.min.css | 12 + .../css/bootswatch/flatly/_bootswatch.scss | 274 + .../css/bootswatch/flatly/_variables.scss | 106 + .../css/bootswatch/flatly/bootstrap.css | 10533 ++++++++++++++ .../css/bootswatch/flatly/bootstrap.min.css | 12 + .../css/bootswatch/journal/_bootswatch.scss | 62 + .../css/bootswatch/journal/_variables.scss | 60 + .../css/bootswatch/journal/bootstrap.css | 10367 +++++++++++++ .../css/bootswatch/journal/bootstrap.min.css | 12 + .../css/bootswatch/litera/_bootswatch.scss | 268 + .../css/bootswatch/litera/_variables.scss | 96 + .../css/bootswatch/litera/bootstrap.css | 10556 ++++++++++++++ .../css/bootswatch/litera/bootstrap.min.css | 12 + .../css/bootswatch/lumen/_bootswatch.scss | 532 + .../css/bootswatch/lumen/_variables.scss | 85 + .../css/bootswatch/lumen/bootstrap.css | 10746 ++++++++++++++ .../css/bootswatch/lumen/bootstrap.min.css | 12 + .../css/bootswatch/lux/_bootswatch.scss | 191 + .../css/bootswatch/lux/_variables.scss | 103 + .../css/bootswatch/lux/bootstrap.css | 10190 +++++++++++++ .../css/bootswatch/lux/bootstrap.min.css | 12 + .../css/bootswatch/materia/_bootswatch.scss | 747 + .../css/bootswatch/materia/_variables.scss | 129 + .../css/bootswatch/materia/bootstrap.css | 11790 +++++++++++++++ .../css/bootswatch/materia/bootstrap.min.css | 12 + .../css/bootswatch/minty/_bootswatch.scss | 380 + .../css/bootswatch/minty/_variables.scss | 94 + .../css/bootswatch/minty/bootstrap.css | 10619 ++++++++++++++ .../css/bootswatch/minty/bootstrap.min.css | 12 + .../css/bootswatch/pulse/_bootswatch.scss | 145 + .../css/bootswatch/pulse/_variables.scss | 96 + .../css/bootswatch/pulse/bootstrap.css | 10163 +++++++++++++ .../css/bootswatch/pulse/bootstrap.min.css | 12 + .../css/bootswatch/sandstone/_bootswatch.scss | 243 + .../css/bootswatch/sandstone/_variables.scss | 129 + .../css/bootswatch/sandstone/bootstrap.css | 10481 ++++++++++++++ .../bootswatch/sandstone/bootstrap.min.css | 12 + .../css/bootswatch/simplex/_bootswatch.scss | 129 + .../css/bootswatch/simplex/_variables.scss | 103 + .../css/bootswatch/simplex/bootstrap.css | 10449 ++++++++++++++ .../css/bootswatch/simplex/bootstrap.min.css | 12 + .../css/bootswatch/sketchy/_bootswatch.scss | 498 + .../css/bootswatch/sketchy/_variables.scss | 159 + .../css/bootswatch/sketchy/bootstrap.css | 10759 ++++++++++++++ .../css/bootswatch/sketchy/bootstrap.min.css | 12 + .../css/bootswatch/slate/_bootswatch.scss | 531 + .../css/bootswatch/slate/_variables.scss | 163 + .../css/bootswatch/slate/bootstrap.css | 10820 ++++++++++++++ .../css/bootswatch/slate/bootstrap.min.css | 12 + .../css/bootswatch/solar/_bootswatch.scss | 243 + .../css/bootswatch/solar/_variables.scss | 171 + .../css/bootswatch/solar/bootstrap.css | 10589 ++++++++++++++ .../css/bootswatch/solar/bootstrap.min.css | 12 + .../css/bootswatch/spacelab/_bootswatch.scss | 98 + .../css/bootswatch/spacelab/_variables.scss | 62 + .../css/bootswatch/spacelab/bootstrap.css | 10526 ++++++++++++++ .../css/bootswatch/spacelab/bootstrap.min.css | 12 + .../css/bootswatch/superhero/_bootswatch.scss | 302 + .../css/bootswatch/superhero/_variables.scss | 151 + .../css/bootswatch/superhero/bootstrap.css | 10594 ++++++++++++++ .../bootswatch/superhero/bootstrap.min.css | 12 + .../css/bootswatch/united/_bootswatch.scss | 10 + .../css/bootswatch/united/_variables.scss | 54 + .../css/bootswatch/united/bootstrap.css | 10322 +++++++++++++ .../css/bootswatch/united/bootstrap.min.css | 12 + .../css/bootswatch/yeti/_bootswatch.scss | 586 + .../css/bootswatch/yeti/_variables.scss | 110 + .../css/bootswatch/yeti/bootstrap.css | 10795 ++++++++++++++ .../css/bootswatch/yeti/bootstrap.min.css | 12 + .../static/bootstrap4/icons/.DS_Store | Bin 0 -> 6148 bytes .../bootstrap4/icons/bootstrap-icons.svg | 1 + .../static/bootstrap4/jquery.min.js | 2 + .../static/bootstrap4/jquery.min.map | 1 + .../static/bootstrap4/js/.DS_Store | Bin 0 -> 6148 bytes .../static/bootstrap4/js/bootstrap.min.js | 7 + .../static/bootstrap4/js/bootstrap.min.js.map | 1 + .../static/bootstrap4/umd/popper.min.js | 5 + .../static/bootstrap4/umd/popper.min.js.map | 1 + .../static/bootstrap5/.DS_Store | Bin 0 -> 8196 bytes .../static/bootstrap5/css/.DS_Store | Bin 0 -> 6148 bytes .../static/bootstrap5/css/bootstrap.min.css | 7 + .../bootstrap5/css/bootstrap.min.css.map | 1 + .../bootstrap5/css/bootswatch/.DS_Store | Bin 0 -> 10244 bytes .../css/bootswatch/cerulean/_bootswatch.scss | 88 + .../css/bootswatch/cerulean/_variables.scss | 61 + .../css/bootswatch/cerulean/bootstrap.css | 11046 ++++++++++++++ .../css/bootswatch/cerulean/bootstrap.min.css | 12 + .../css/bootswatch/cosmo/_bootswatch.scss | 39 + .../css/bootswatch/cosmo/_variables.scss | 69 + .../css/bootswatch/cosmo/bootstrap.css | 10629 ++++++++++++++ .../css/bootswatch/cosmo/bootstrap.min.css | 12 + .../css/bootswatch/cyborg/_bootswatch.scss | 147 + .../css/bootswatch/cyborg/_variables.scss | 181 + .../css/bootswatch/cyborg/bootstrap.css | 11025 ++++++++++++++ .../css/bootswatch/cyborg/bootstrap.min.css | 12 + .../css/bootswatch/darkly/_bootswatch.scss | 80 + .../css/bootswatch/darkly/_variables.scss | 173 + .../css/bootswatch/darkly/bootstrap.css | 10961 ++++++++++++++ .../css/bootswatch/darkly/bootstrap.min.css | 12 + .../css/bootswatch/flatly/_bootswatch.scss | 91 + .../css/bootswatch/flatly/_variables.scss | 113 + .../css/bootswatch/flatly/bootstrap.css | 10958 ++++++++++++++ .../css/bootswatch/flatly/bootstrap.min.css | 12 + .../css/bootswatch/journal/_bootswatch.scss | 67 + .../css/bootswatch/journal/_variables.scss | 64 + .../css/bootswatch/journal/bootstrap.css | 10931 ++++++++++++++ .../css/bootswatch/journal/bootstrap.min.css | 12 + .../css/bootswatch/litera/_bootswatch.scss | 119 + .../css/bootswatch/litera/_variables.scss | 100 + .../css/bootswatch/litera/bootstrap.css | 11040 ++++++++++++++ .../css/bootswatch/litera/bootstrap.min.css | 12 + .../css/bootswatch/lumen/_bootswatch.scss | 330 + .../css/bootswatch/lumen/_variables.scss | 93 + .../css/bootswatch/lumen/bootstrap.css | 11181 ++++++++++++++ .../css/bootswatch/lumen/bootstrap.min.css | 12 + .../css/bootswatch/lux/_bootswatch.scss | 178 + .../css/bootswatch/lux/_variables.scss | 103 + .../css/bootswatch/lux/bootstrap.css | 10748 ++++++++++++++ .../css/bootswatch/lux/bootstrap.min.css | 12 + .../css/bootswatch/materia/_bootswatch.scss | 648 + .../css/bootswatch/materia/_variables.scss | 114 + .../css/bootswatch/materia/bootstrap.css | 12008 ++++++++++++++++ .../css/bootswatch/materia/bootstrap.min.css | 12 + .../css/bootswatch/minty/_bootswatch.scss | 148 + .../css/bootswatch/minty/_variables.scss | 106 + .../css/bootswatch/minty/bootstrap.css | 11002 ++++++++++++++ .../css/bootswatch/minty/bootstrap.min.css | 12 + .../css/bootswatch/morph/_bootswatch.scss | 464 + .../css/bootswatch/morph/_variables.scss | 228 + .../css/bootswatch/morph/bootstrap.css | 11559 +++++++++++++++ .../css/bootswatch/morph/bootstrap.min.css | 12 + .../css/bootswatch/pulse/_bootswatch.scss | 149 + .../css/bootswatch/pulse/_variables.scss | 96 + .../css/bootswatch/pulse/bootstrap.css | 10709 ++++++++++++++ .../css/bootswatch/pulse/bootstrap.min.css | 12 + .../css/bootswatch/quartz/_bootswatch.scss | 291 + .../css/bootswatch/quartz/_variables.scss | 229 + .../css/bootswatch/quartz/bootstrap.css | 11425 +++++++++++++++ .../css/bootswatch/quartz/bootstrap.min.css | 12 + .../css/bootswatch/sandstone/_bootswatch.scss | 236 + .../css/bootswatch/sandstone/_variables.scss | 139 + .../css/bootswatch/sandstone/bootstrap.css | 11017 ++++++++++++++ .../bootswatch/sandstone/bootstrap.min.css | 12 + .../css/bootswatch/simplex/_bootswatch.scss | 143 + .../css/bootswatch/simplex/_variables.scss | 104 + .../css/bootswatch/simplex/bootstrap.css | 10998 ++++++++++++++ .../css/bootswatch/simplex/bootstrap.min.css | 12 + .../css/bootswatch/sketchy/_bootswatch.scss | 482 + .../css/bootswatch/sketchy/_variables.scss | 160 + .../css/bootswatch/sketchy/bootstrap.css | 11258 +++++++++++++++ .../css/bootswatch/sketchy/bootstrap.min.css | 12 + .../css/bootswatch/slate/_bootswatch.scss | 366 + .../css/bootswatch/slate/_variables.scss | 168 + .../css/bootswatch/slate/bootstrap.css | 11183 ++++++++++++++ .../css/bootswatch/slate/bootstrap.min.css | 12 + .../css/bootswatch/solar/_bootswatch.scss | 66 + .../css/bootswatch/solar/_variables.scss | 189 + .../css/bootswatch/solar/bootstrap.css | 10958 ++++++++++++++ .../css/bootswatch/solar/bootstrap.min.css | 12 + .../css/bootswatch/spacelab/_bootswatch.scss | 99 + .../css/bootswatch/spacelab/_variables.scss | 64 + .../css/bootswatch/spacelab/bootstrap.css | 11083 ++++++++++++++ .../css/bootswatch/spacelab/bootstrap.min.css | 12 + .../css/bootswatch/superhero/_bootswatch.scss | 146 + .../css/bootswatch/superhero/_variables.scss | 176 + .../css/bootswatch/superhero/bootstrap.css | 11019 ++++++++++++++ .../bootswatch/superhero/bootstrap.min.css | 12 + .../css/bootswatch/united/_bootswatch.scss | 22 + .../css/bootswatch/united/_variables.scss | 56 + .../css/bootswatch/united/bootstrap.css | 10893 ++++++++++++++ .../css/bootswatch/united/bootstrap.min.css | 12 + .../css/bootswatch/vapor/_bootswatch.scss | 330 + .../css/bootswatch/vapor/_variables.scss | 162 + .../css/bootswatch/vapor/bootstrap.css | 11360 +++++++++++++++ .../css/bootswatch/vapor/bootstrap.min.css | 12 + .../css/bootswatch/yeti/_bootswatch.scss | 363 + .../css/bootswatch/yeti/_variables.scss | 123 + .../css/bootswatch/yeti/bootstrap.css | 11155 ++++++++++++++ .../css/bootswatch/yeti/bootstrap.min.css | 12 + .../css/bootswatch/zephyr/_bootswatch.scss | 215 + .../css/bootswatch/zephyr/_variables.scss | 163 + .../css/bootswatch/zephyr/bootstrap.css | 11100 ++++++++++++++ .../css/bootswatch/zephyr/bootstrap.min.css | 12 + .../static/bootstrap5/icons/.DS_Store | Bin 0 -> 6148 bytes .../bootstrap5/icons/bootstrap-icons.svg | 1 + .../static/bootstrap5/js/.DS_Store | Bin 0 -> 6148 bytes .../static/bootstrap5/js/bootstrap.min.js | 7 + .../static/bootstrap5/js/bootstrap.min.js.map | 1 + .../static/bootstrap5/umd/.DS_Store | Bin 0 -> 6148 bytes .../static/bootstrap5/umd/popper.min.js | 6 + .../static/bootstrap5/umd/popper.min.js.map | 1 + .../flask_bootstrap/templates/.DS_Store | Bin 0 -> 6148 bytes .../flask_bootstrap/templates/base/nav.html | 21 + .../templates/base/pagination.html | 76 + .../flask_bootstrap/templates/base/table.html | 171 + .../flask_bootstrap/templates/base/utils.html | 32 + .../templates/bootstrap/form.html | 2 + .../templates/bootstrap/nav.html | 2 + .../templates/bootstrap/pagination.html | 2 + .../templates/bootstrap/table.html | 2 + .../templates/bootstrap/utils.html | 2 + .../templates/bootstrap4/form.html | 340 + .../templates/bootstrap4/nav.html | 1 + .../templates/bootstrap4/pagination.html | 7 + .../templates/bootstrap4/table.html | 1 + .../templates/bootstrap4/utils.html | 44 + .../templates/bootstrap5/form.html | 343 + .../templates/bootstrap5/nav.html | 1 + .../templates/bootstrap5/pagination.html | 7 + .../templates/bootstrap5/table.html | 1 + .../templates/bootstrap5/utils.html | 40 + .../flask_wtf-1.2.1.dist-info/INSTALLER | 1 + .../flask_wtf-1.2.1.dist-info/METADATA | 72 + .../flask_wtf-1.2.1.dist-info/RECORD | 26 + .../flask_wtf-1.2.1.dist-info/REQUESTED | 0 .../flask_wtf-1.2.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.rst | 28 + .../site-packages/flask_wtf/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 477 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 666 bytes .../__pycache__/csrf.cpython-312.pyc | Bin 0 -> 14058 bytes .../__pycache__/file.cpython-312.pyc | Bin 0 -> 7476 bytes .../__pycache__/form.cpython-312.pyc | Bin 0 -> 6540 bytes .../__pycache__/i18n.cpython-312.pyc | Bin 0 -> 1834 bytes .../site-packages/flask_wtf/_compat.py | 11 + .../site-packages/flask_wtf/csrf.py | 329 + .../site-packages/flask_wtf/file.py | 147 + .../site-packages/flask_wtf/form.py | 127 + .../site-packages/flask_wtf/i18n.py | 47 + .../flask_wtf/recaptcha/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 368 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 986 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 3424 bytes .../__pycache__/widgets.cpython-312.pyc | Bin 0 -> 2632 bytes .../flask_wtf/recaptcha/fields.py | 17 + .../flask_wtf/recaptcha/validators.py | 75 + .../flask_wtf/recaptcha/widgets.py | 43 + .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 + .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 + .../itsdangerous-2.2.0.dist-info/METADATA | 60 + .../itsdangerous-2.2.0.dist-info/RECORD | 22 + .../itsdangerous-2.2.0.dist-info/WHEEL | 4 + .../site-packages/itsdangerous/__init__.py | 38 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1658 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 1212 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2712 bytes .../__pycache__/exc.cpython-312.pyc | Bin 0 -> 3972 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 0 -> 15453 bytes .../__pycache__/signer.cpython-312.pyc | Bin 0 -> 11318 bytes .../__pycache__/timed.cpython-312.pyc | Bin 0 -> 8766 bytes .../__pycache__/url_safe.cpython-312.pyc | Bin 0 -> 3562 bytes .../site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 106 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 + .../site-packages/itsdangerous/signer.py | 266 + .../site-packages/itsdangerous/timed.py | 228 + .../site-packages/itsdangerous/url_safe.py | 83 + .../jinja2-3.1.6.dist-info/INSTALLER | 1 + .../jinja2-3.1.6.dist-info/METADATA | 84 + .../jinja2-3.1.6.dist-info/RECORD | 57 + .../jinja2-3.1.6.dist-info/WHEEL | 4 + .../jinja2-3.1.6.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/jinja2/__init__.py | 38 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1683 bytes .../__pycache__/_identifier.cpython-312.pyc | Bin 0 -> 2164 bytes .../__pycache__/async_utils.cpython-312.pyc | Bin 0 -> 5004 bytes .../__pycache__/bccache.cpython-312.pyc | Bin 0 -> 19375 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 0 -> 104090 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 1586 bytes .../jinja2/__pycache__/debug.cpython-312.pyc | Bin 0 -> 6611 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 1636 bytes .../__pycache__/environment.cpython-312.pyc | Bin 0 -> 76712 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7750 bytes .../jinja2/__pycache__/ext.cpython-312.pyc | Bin 0 -> 41943 bytes .../__pycache__/filters.cpython-312.pyc | Bin 0 -> 72360 bytes .../__pycache__/idtracking.cpython-312.pyc | Bin 0 -> 19225 bytes .../jinja2/__pycache__/lexer.cpython-312.pyc | Bin 0 -> 32106 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 0 -> 32385 bytes .../jinja2/__pycache__/meta.cpython-312.pyc | Bin 0 -> 5520 bytes .../__pycache__/nativetypes.cpython-312.pyc | Bin 0 -> 7041 bytes .../jinja2/__pycache__/nodes.cpython-312.pyc | Bin 0 -> 58303 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 0 -> 2719 bytes .../jinja2/__pycache__/parser.cpython-312.pyc | Bin 0 -> 61233 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 0 -> 48921 bytes .../__pycache__/sandbox.cpython-312.pyc | Bin 0 -> 18137 bytes .../jinja2/__pycache__/tests.cpython-312.pyc | Bin 0 -> 9080 bytes .../jinja2/__pycache__/utils.cpython-312.pyc | Bin 0 -> 34893 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 0 -> 5395 bytes .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 +++ .../site-packages/jinja2/constants.py | 20 + .../python3.12/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 +++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.12/site-packages/jinja2/ext.py | 870 ++ .../site-packages/jinja2/filters.py | 1873 +++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.12/site-packages/jinja2/lexer.py | 868 ++ .../site-packages/jinja2/loaders.py | 693 + .../python3.12/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.12/site-packages/jinja2/nodes.py | 1206 ++ .../site-packages/jinja2/optimizer.py | 48 + .../python3.12/site-packages/jinja2/parser.py | 1049 ++ .../python3.12/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 ++ .../site-packages/jinja2/sandbox.py | 436 + .../python3.12/site-packages/jinja2/tests.py | 256 + .../python3.12/site-packages/jinja2/utils.py | 766 + .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 395 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 20958 bytes .../__pycache__/_native.cpython-312.pyc | Bin 0 -> 645 bytes .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 204 + .../_speedups.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 43432 bytes .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../pip-24.0.dist-info/AUTHORS.txt | 760 + .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1005 ++ .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 720 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 876 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2239 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 822 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14329 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12700 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17701 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33319 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 705 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 5006 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10587 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13684 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 313 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8500 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10490 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30409 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1816 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2333 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4940 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15057 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2655 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18887 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7875 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 410 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 505 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4037 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9746 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2125 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5227 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13247 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10196 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7624 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4451 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 3018 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1708 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6755 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 4010 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28948 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15691 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7656 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9763 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4761 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8991 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 109 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 774 + .../pip/_internal/commands/list.py | 370 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 976 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2897 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1735 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8523 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2283 bytes .../pip/_internal/distributions/base.py | 51 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 156 + .../pip/_internal/distributions/wheel.py | 40 + .../site-packages/pip/_internal/exceptions.py | 728 + .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 267 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21921 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40770 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12639 bytes .../pip/_internal/index/collector.py | 507 + .../pip/_internal/index/package_finder.py | 1027 ++ .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16811 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6891 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8046 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3816 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5917 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2910 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35747 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15825 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 + .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 393 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3368 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13460 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11215 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 227 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 278 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 301 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1940 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11234 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4262 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1729 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2307 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26037 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1204 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5123 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1886 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4989 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5815 bytes .../pip/_internal/models/candidate.py | 30 + .../pip/_internal/models/direct_url.py | 235 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 579 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 289 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 22031 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6553 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8588 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11698 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18809 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2288 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2984 bytes .../pip/_internal/network/auth.py | 561 + .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 520 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 232 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7614 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10152 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25782 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 238 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7858 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1915 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1949 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3100 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1719 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2060 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3964 bytes .../operations/build/build_tracker.py | 139 + .../_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 | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 301 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1852 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 33894 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 734 + .../pip/_internal/operations/prepare.py | 730 + .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3778 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21617 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21496 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38449 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7253 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 33012 bytes .../pip/_internal/req/constructors.py | 576 + .../pip/_internal/req/req_file.py | 554 + .../pip/_internal/req/req_install.py | 923 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 649 + .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 232 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1220 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 239 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22474 bytes .../_internal/resolution/legacy/resolver.py | 598 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 243 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8372 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 30433 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32149 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6243 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10413 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4970 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 11464 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12386 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 597 + .../resolution/resolvelib/factory.py | 812 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 248 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 227 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4568 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1898 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2442 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2245 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5593 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 716 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4218 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3595 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3258 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2190 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4025 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7490 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1196 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2374 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7586 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13589 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 34153 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2744 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2615 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4582 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8750 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12094 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11140 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2437 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4512 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5958 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 151 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 783 + .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 566 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5058 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19027 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7647 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12519 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29045 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 + .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4728 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41305 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122085 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 938 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2682 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6500 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3845 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16203 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4383 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6730 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 6441 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1710 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 -> 471 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7746 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2774 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 494 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/serialize.py | 206 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 354 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 681 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3363 bytes .../pip/_vendor/certifi/cacert.pem | 4635 ++++++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4604 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27235 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1423 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9674 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4158 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5054 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3914 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 825 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1432 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 3032 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4602 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15346 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4419 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12118 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1426 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27240 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1426 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19162 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1439 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5858 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22191 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 83039 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1430 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39585 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83158 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 77024 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77535 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83112 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105287 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77713 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77552 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 7038 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7218 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3939 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1624 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38681 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 668 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6423 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2393 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4531 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12305 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 10015 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3211 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 524 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 231 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4048 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 ++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 ++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 ++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 ++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 ++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 ++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 ++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 + .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 236 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9791 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 528 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3986 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16457 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3586 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8162 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9124 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 234 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5503 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18139 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11784 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4940 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2524 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6648 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1305 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45641 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 66063 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24402 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60194 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15161 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7718 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41835 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17361 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19616 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88292 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30402 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 51897 bytes .../pip/_vendor/distlib/compat.py | 1138 ++ .../pip/_vendor/distlib/database.py | 1359 ++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1303 ++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 167 + .../pip/_vendor/distlib/metadata.py | 1068 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 452 + .../site-packages/pip/_vendor/distlib/util.py | 2025 +++ .../pip/_vendor/distlib/version.py | 751 + .../pip/_vendor/distlib/wheel.py | 1099 ++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 996 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 328 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53790 bytes .../pip/_vendor/distro/distro.py | 1399 ++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 917 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4669 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 923 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16318 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 38418 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2674 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 252 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158906 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 +++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1867 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2061 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8704 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43612 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-312.pyc | Bin 0 -> 666 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 502 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12112 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6946 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3277 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14094 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6982 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31283 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 18992 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5904 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19975 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 146510 bytes .../pip/_vendor/platformdirs/__init__.py | 566 + .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18065 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1982 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9480 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9708 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5673 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12477 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 347 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13035 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3525 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 771 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26642 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2663 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3269 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4606 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38366 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1605 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3433 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4118 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4793 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11083 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6711 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8179 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 33025 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14018 bytes .../pip/_vendor/pygments/cmdline.py | 668 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37973 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6963 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4252 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4231 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7301 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40609 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27080 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6102 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 19991 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6921 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2967 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6163 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9103 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5866 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15194 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 + .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14689 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64441 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42676 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 + .../pip/_vendor/pygments/lexers/python.py | 1198 ++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4485 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7948 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8432 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13451 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267745 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13031 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48538 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34147 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17225 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13221 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14941 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 ++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26850 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 ++ .../pip/_vendor/pyparsing/results.py | 796 + .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 650 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 411 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14762 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 -> 1117 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14434 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5490 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 621 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2061 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21317 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7241 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13960 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 959 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1544 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25283 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7084 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4349 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1089 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35485 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 809 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27794 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 5996 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5654 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36306 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 + .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1094 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6888 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2691 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25934 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10543 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 237 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 457 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 + .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7052 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10341 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7858 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 206013 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1766 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2358 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 574 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 892 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12114 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4184 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1922 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3657 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5197 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 763 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6616 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13216 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 1002 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 902 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 29013 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2527 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3610 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2397 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1645 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12359 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9143 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4309 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11895 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5655 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26607 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1738 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8624 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113830 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2295 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9263 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10966 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10410 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1524 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4246 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1882 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3614 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3119 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9935 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6072 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5246 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20257 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19180 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4931 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13591 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9335 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6413 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7171 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1857 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5351 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12134 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40093 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75115 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10426 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14818 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1829 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 604 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6663 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6605 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3867 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2521 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28198 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6101 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6105 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33551 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2176 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39649 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43621 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3385 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 59000 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6377 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 351 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31585 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11476 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 + .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 ++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 ++ .../pip/_vendor/rich/progress.py | 1702 +++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 + .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 + .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 ++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 + .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27123 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4843 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2352 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1661 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1501 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2339 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1449 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14318 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5605 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2623 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12450 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 421 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26964 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3945 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 403 bytes .../pip/_vendor/tomli/_parser.py | 691 + .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 655 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 15834 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 16699 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2252 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1136 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15543 bytes .../pip/_vendor/truststore/_api.py | 302 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 + .../pip/_vendor/typing_extensions.py | 3072 ++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3442 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 15968 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 255 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20444 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36316 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13530 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10450 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4055 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20667 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7331 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 34005 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 + .../pip/_vendor/urllib3/connectionpool.py | 1132 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 235 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1885 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11601 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5756 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24487 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35593 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7548 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 252 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17464 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14838 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 236 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41356 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 246 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1862 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7368 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 | 553 + .../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 -> 1183 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4793 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1589 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1389 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4220 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3026 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21755 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15140 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5108 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10809 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11176 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15832 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4440 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 + .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 12038 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7169 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2736 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9288 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3332 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../werkzeug-3.0.0.dist-info/INSTALLER | 1 + .../werkzeug-3.0.0.dist-info/LICENSE.rst | 28 + .../werkzeug-3.0.0.dist-info/METADATA | 118 + .../werkzeug-3.0.0.dist-info/RECORD | 126 + .../werkzeug-3.0.0.dist-info/REQUESTED | 0 .../werkzeug-3.0.0.dist-info/WHEEL | 4 + .../site-packages/werkzeug/__init__.py | 25 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1117 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 0 -> 9797 bytes .../__pycache__/_reloader.cpython-312.pyc | Bin 0 -> 20287 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 32961 bytes .../__pycache__/formparser.cpython-312.pyc | Bin 0 -> 16723 bytes .../werkzeug/__pycache__/http.cpython-312.pyc | Bin 0 -> 49398 bytes .../__pycache__/local.cpython-312.pyc | Bin 0 -> 28237 bytes .../__pycache__/security.cpython-312.pyc | Bin 0 -> 6994 bytes .../__pycache__/serving.cpython-312.pyc | Bin 0 -> 45787 bytes .../werkzeug/__pycache__/test.cpython-312.pyc | Bin 0 -> 59804 bytes .../__pycache__/testapp.cpython-312.pyc | Bin 0 -> 8607 bytes .../werkzeug/__pycache__/urls.cpython-312.pyc | Bin 0 -> 8975 bytes .../__pycache__/user_agent.cpython-312.pyc | Bin 0 -> 2183 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 28225 bytes .../werkzeug/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 25246 bytes .../site-packages/werkzeug/_internal.py | 214 + .../site-packages/werkzeug/_reloader.py | 458 + .../werkzeug/datastructures/__init__.py | 34 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1632 bytes .../__pycache__/accept.cpython-312.pyc | Bin 0 -> 13849 bytes .../__pycache__/auth.cpython-312.pyc | Bin 0 -> 14450 bytes .../__pycache__/cache_control.cpython-312.pyc | Bin 0 -> 7919 bytes .../__pycache__/csp.cpython-312.pyc | Bin 0 -> 5290 bytes .../__pycache__/etag.cpython-312.pyc | Bin 0 -> 5074 bytes .../__pycache__/file_storage.cpython-312.pyc | Bin 0 -> 7950 bytes .../__pycache__/headers.cpython-312.pyc | Bin 0 -> 23296 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 0 -> 11423 bytes .../__pycache__/range.cpython-312.pyc | Bin 0 -> 8280 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 48375 bytes .../werkzeug/datastructures/accept.py | 326 + .../werkzeug/datastructures/accept.pyi | 54 + .../werkzeug/datastructures/auth.py | 318 + .../werkzeug/datastructures/cache_control.py | 175 + .../werkzeug/datastructures/cache_control.pyi | 109 + .../werkzeug/datastructures/csp.py | 94 + .../werkzeug/datastructures/csp.pyi | 169 + .../werkzeug/datastructures/etag.py | 95 + .../werkzeug/datastructures/etag.pyi | 30 + .../werkzeug/datastructures/file_storage.py | 196 + .../werkzeug/datastructures/file_storage.pyi | 47 + .../werkzeug/datastructures/headers.py | 515 + .../werkzeug/datastructures/headers.pyi | 109 + .../werkzeug/datastructures/mixins.py | 242 + .../werkzeug/datastructures/mixins.pyi | 97 + .../werkzeug/datastructures/range.py | 180 + .../werkzeug/datastructures/range.pyi | 57 + .../werkzeug/datastructures/structures.py | 1006 ++ .../werkzeug/datastructures/structures.pyi | 208 + .../site-packages/werkzeug/debug/__init__.py | 534 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 22197 bytes .../debug/__pycache__/console.cpython-312.pyc | Bin 0 -> 11638 bytes .../debug/__pycache__/repr.cpython-312.pyc | Bin 0 -> 13913 bytes .../debug/__pycache__/tbtools.cpython-312.pyc | Bin 0 -> 16691 bytes .../site-packages/werkzeug/debug/console.py | 219 + .../site-packages/werkzeug/debug/repr.py | 283 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 360 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 437 + .../site-packages/werkzeug/exceptions.py | 879 ++ .../site-packages/werkzeug/formparser.py | 421 + .../python3.12/site-packages/werkzeug/http.py | 1372 ++ .../site-packages/werkzeug/local.py | 643 + .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 227 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 0 -> 3345 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 0 -> 9437 bytes .../__pycache__/lint.cpython-312.pyc | Bin 0 -> 17734 bytes .../__pycache__/profiler.cpython-312.pyc | Bin 0 -> 7231 bytes .../__pycache__/proxy_fix.cpython-312.pyc | Bin 0 -> 7228 bytes .../__pycache__/shared_data.cpython-312.pyc | Bin 0 -> 12742 bytes .../werkzeug/middleware/dispatcher.py | 80 + .../werkzeug/middleware/http_proxy.py | 235 + .../site-packages/werkzeug/middleware/lint.py | 420 + .../werkzeug/middleware/profiler.py | 154 + .../werkzeug/middleware/proxy_fix.py | 182 + .../werkzeug/middleware/shared_data.py | 282 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 133 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4700 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 10883 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7874 bytes .../routing/__pycache__/map.cpython-312.pyc | Bin 0 -> 39395 bytes .../__pycache__/matcher.cpython-312.pyc | Bin 0 -> 8255 bytes .../routing/__pycache__/rules.cpython-312.pyc | Bin 0 -> 38336 bytes .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 148 + .../site-packages/werkzeug/routing/map.py | 946 ++ .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 909 ++ .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 223 bytes .../sansio/__pycache__/http.cpython-312.pyc | Bin 0 -> 5650 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 0 -> 13928 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 21895 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 31363 bytes .../sansio/__pycache__/utils.cpython-312.pyc | Bin 0 -> 6047 bytes .../site-packages/werkzeug/sansio/http.py | 171 + .../werkzeug/sansio/multipart.py | 313 + .../site-packages/werkzeug/sansio/request.py | 536 + .../site-packages/werkzeug/sansio/response.py | 751 + .../site-packages/werkzeug/sansio/utils.py | 159 + .../site-packages/werkzeug/security.py | 157 + .../site-packages/werkzeug/serving.py | 1109 ++ .../python3.12/site-packages/werkzeug/test.py | 1462 ++ .../site-packages/werkzeug/testapp.py | 181 + .../python3.12/site-packages/werkzeug/urls.py | 216 + .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 690 + .../werkzeug/wrappers/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 347 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 26004 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 34694 bytes .../werkzeug/wrappers/request.py | 650 + .../werkzeug/wrappers/response.py | 835 ++ .../python3.12/site-packages/werkzeug/wsgi.py | 595 + .../site-packages/wtforms/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 455 bytes .../wtforms/__pycache__/form.cpython-312.pyc | Bin 0 -> 15976 bytes .../wtforms/__pycache__/i18n.cpython-312.pyc | Bin 0 -> 3403 bytes .../wtforms/__pycache__/meta.cpython-312.pyc | Bin 0 -> 5041 bytes .../wtforms/__pycache__/utils.cpython-312.pyc | Bin 0 -> 3711 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 27163 bytes .../site-packages/wtforms/csrf/__init__.py | 0 .../csrf/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 220 bytes .../csrf/__pycache__/core.cpython-312.pyc | Bin 0 -> 4652 bytes .../csrf/__pycache__/session.cpython-312.pyc | Bin 0 -> 5056 bytes .../site-packages/wtforms/csrf/core.py | 96 + .../site-packages/wtforms/csrf/session.py | 92 + .../site-packages/wtforms/fields/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 656 bytes .../__pycache__/choices.cpython-312.pyc | Bin 0 -> 10733 bytes .../fields/__pycache__/core.cpython-312.pyc | Bin 0 -> 19369 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 5976 bytes .../fields/__pycache__/form.cpython-312.pyc | Bin 0 -> 4400 bytes .../fields/__pycache__/list.cpython-312.pyc | Bin 0 -> 9530 bytes .../__pycache__/numeric.cpython-312.pyc | Bin 0 -> 9170 bytes .../fields/__pycache__/simple.cpython-312.pyc | Bin 0 -> 6756 bytes .../site-packages/wtforms/fields/choices.py | 215 + .../site-packages/wtforms/fields/core.py | 449 + .../site-packages/wtforms/fields/datetime.py | 127 + .../site-packages/wtforms/fields/form.py | 97 + .../site-packages/wtforms/fields/list.py | 201 + .../site-packages/wtforms/fields/numeric.py | 212 + .../site-packages/wtforms/fields/simple.py | 164 + .../python3.12/site-packages/wtforms/form.py | 329 + .../python3.12/site-packages/wtforms/i18n.py | 72 + .../site-packages/wtforms/locale/README.md | 53 + .../wtforms/locale/ar/LC_MESSAGES/wtforms.mo | Bin 0 -> 4551 bytes .../wtforms/locale/ar/LC_MESSAGES/wtforms.po | 182 + .../wtforms/locale/bg/LC_MESSAGES/wtforms.mo | Bin 0 -> 4080 bytes .../wtforms/locale/bg/LC_MESSAGES/wtforms.po | 171 + .../wtforms/locale/ca/LC_MESSAGES/wtforms.mo | Bin 0 -> 3314 bytes .../wtforms/locale/ca/LC_MESSAGES/wtforms.po | 169 + .../locale/cs_CZ/LC_MESSAGES/wtforms.mo | Bin 0 -> 3518 bytes .../locale/cs_CZ/LC_MESSAGES/wtforms.po | 172 + .../wtforms/locale/cy/LC_MESSAGES/wtforms.mo | Bin 0 -> 3276 bytes .../wtforms/locale/cy/LC_MESSAGES/wtforms.po | 171 + .../wtforms/locale/de/LC_MESSAGES/wtforms.mo | Bin 0 -> 3295 bytes .../wtforms/locale/de/LC_MESSAGES/wtforms.po | 171 + .../locale/de_CH/LC_MESSAGES/wtforms.mo | Bin 0 -> 3289 bytes .../locale/de_CH/LC_MESSAGES/wtforms.po | 171 + .../wtforms/locale/el/LC_MESSAGES/wtforms.mo | Bin 0 -> 4120 bytes .../wtforms/locale/el/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/en/LC_MESSAGES/wtforms.mo | Bin 0 -> 3321 bytes .../wtforms/locale/en/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/es/LC_MESSAGES/wtforms.mo | Bin 0 -> 3151 bytes .../wtforms/locale/es/LC_MESSAGES/wtforms.po | 171 + .../wtforms/locale/et/LC_MESSAGES/wtforms.mo | Bin 0 -> 3331 bytes .../wtforms/locale/et/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/fa/LC_MESSAGES/wtforms.mo | Bin 0 -> 3933 bytes .../wtforms/locale/fa/LC_MESSAGES/wtforms.po | 168 + .../wtforms/locale/fi/LC_MESSAGES/wtforms.mo | Bin 0 -> 3287 bytes .../wtforms/locale/fi/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/fr/LC_MESSAGES/wtforms.mo | Bin 0 -> 3548 bytes .../wtforms/locale/fr/LC_MESSAGES/wtforms.po | 173 + .../wtforms/locale/he/LC_MESSAGES/wtforms.mo | Bin 0 -> 3412 bytes .../wtforms/locale/he/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/hu/LC_MESSAGES/wtforms.mo | Bin 0 -> 3409 bytes .../wtforms/locale/hu/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/it/LC_MESSAGES/wtforms.mo | Bin 0 -> 3382 bytes .../wtforms/locale/it/LC_MESSAGES/wtforms.po | 171 + .../wtforms/locale/ja/LC_MESSAGES/wtforms.mo | Bin 0 -> 3633 bytes .../wtforms/locale/ja/LC_MESSAGES/wtforms.po | 166 + .../wtforms/locale/ko/LC_MESSAGES/wtforms.mo | Bin 0 -> 3647 bytes .../wtforms/locale/ko/LC_MESSAGES/wtforms.po | 166 + .../wtforms/locale/nb/LC_MESSAGES/wtforms.mo | Bin 0 -> 3211 bytes .../wtforms/locale/nb/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/nl/LC_MESSAGES/wtforms.mo | Bin 0 -> 3224 bytes .../wtforms/locale/nl/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/pl/LC_MESSAGES/wtforms.mo | Bin 0 -> 3551 bytes .../wtforms/locale/pl/LC_MESSAGES/wtforms.po | 173 + .../wtforms/locale/pt/LC_MESSAGES/wtforms.mo | Bin 0 -> 3327 bytes .../wtforms/locale/pt/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/ru/LC_MESSAGES/wtforms.mo | Bin 0 -> 4556 bytes .../wtforms/locale/ru/LC_MESSAGES/wtforms.po | 175 + .../wtforms/locale/sk/LC_MESSAGES/wtforms.mo | Bin 0 -> 3376 bytes .../wtforms/locale/sk/LC_MESSAGES/wtforms.po | 172 + .../wtforms/locale/sv/LC_MESSAGES/wtforms.mo | Bin 0 -> 3272 bytes .../wtforms/locale/sv/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/tr/LC_MESSAGES/wtforms.mo | Bin 0 -> 3261 bytes .../wtforms/locale/tr/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/uk/LC_MESSAGES/wtforms.mo | Bin 0 -> 4404 bytes .../wtforms/locale/uk/LC_MESSAGES/wtforms.po | 173 + .../site-packages/wtforms/locale/wtforms.pot | 168 + .../wtforms/locale/zh/LC_MESSAGES/wtforms.mo | Bin 0 -> 3413 bytes .../wtforms/locale/zh/LC_MESSAGES/wtforms.po | 169 + .../locale/zh_TW/LC_MESSAGES/wtforms.mo | Bin 0 -> 3219 bytes .../locale/zh_TW/LC_MESSAGES/wtforms.po | 166 + .../python3.12/site-packages/wtforms/meta.py | 132 + .../python3.12/site-packages/wtforms/utils.py | 89 + .../site-packages/wtforms/validators.py | 689 + .../site-packages/wtforms/widgets/__init__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 329 bytes .../widgets/__pycache__/core.cpython-312.pyc | Bin 0 -> 20762 bytes .../site-packages/wtforms/widgets/core.py | 517 + Visual Studio Code Projects/venv/lib64 | 1 + Visual Studio Code Projects/venv/pyvenv.cfg | 5 + 1711 files changed, 777886 insertions(+) create mode 100644 Visual Studio Code Projects/venv/bin/Activate.ps1 create mode 100644 Visual Studio Code Projects/venv/bin/activate create mode 100644 Visual Studio Code Projects/venv/bin/activate.csh create mode 100644 Visual Studio Code Projects/venv/bin/activate.fish create mode 100755 Visual Studio Code Projects/venv/bin/flask create mode 100755 Visual Studio Code Projects/venv/bin/pip create mode 100755 Visual Studio Code Projects/venv/bin/pip3 create mode 100755 Visual Studio Code Projects/venv/bin/pip3.12 create mode 120000 Visual Studio Code Projects/venv/bin/python create mode 120000 Visual Studio Code Projects/venv/bin/python3 create mode 120000 Visual Studio Code Projects/venv/bin/python3.12 create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/LICENSE create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/REQUESTED create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/top_level.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/LICENSE.rst create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/REQUESTED create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/entry_points.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/top_level.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/LICENSE.rst create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/REQUESTED create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/top_level.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/base.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/_utilities.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/base.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_termui_impl.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_textwrap.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_winconsole.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/core.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/decorators.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/formatting.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/globals.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/parser.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/shell_completion.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/termui.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/testing.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/types.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/cli.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/globals.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/helpers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/scaffold.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/sessions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/views.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/app.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/blueprints.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/cli.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/config.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/ctx.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/debughelpers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/globals.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/helpers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/provider.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/tag.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/logging.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/scaffold.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/sessions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/signals.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/templating.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/testing.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/typing.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/views.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/wrappers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/journal/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/journal/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/journal/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/journal/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/litera/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/litera/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/litera/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/litera/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lux/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lux/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lux/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/lux/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/materia/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/materia/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/materia/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/materia/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/minty/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/minty/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/minty/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/minty/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/slate/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/slate/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/slate/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/slate/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/solar/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/solar/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/solar/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/solar/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/united/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/united/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/united/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/united/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/icons/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/icons/bootstrap-icons.svg create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/jquery.min.js create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/jquery.min.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/js/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/js/bootstrap.min.js create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/js/bootstrap.min.js.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/umd/popper.min.js create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/umd/popper.min.js.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootstrap.min.css.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/journal/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/journal/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/journal/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/journal/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/litera/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/litera/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/litera/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/litera/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lux/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lux/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lux/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/lux/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/materia/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/materia/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/materia/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/materia/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/minty/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/minty/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/minty/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/minty/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/morph/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/morph/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/morph/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/morph/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/slate/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/slate/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/slate/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/slate/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/solar/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/solar/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/solar/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/solar/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/united/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/united/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/united/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/united/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/_bootswatch.scss create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/_variables.scss create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/bootstrap.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/bootstrap.min.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/icons/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/icons/bootstrap-icons.svg create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/js/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/js/bootstrap.min.js create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/js/bootstrap.min.js.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/umd/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/umd/popper.min.js create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap5/umd/popper.min.js.map create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/.DS_Store create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/base/nav.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/base/pagination.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/base/table.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/base/utils.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap/form.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap/nav.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap/pagination.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap/table.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap/utils.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap4/form.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap4/nav.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap4/pagination.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap4/table.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap4/utils.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/form.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/nav.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/pagination.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/table.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/utils.html create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/REQUESTED create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/licenses/LICENSE.rst create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/_compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/csrf.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/file.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/form.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/i18n.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/_compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/csrf.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/file.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/form.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/i18n.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/fields.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/validators.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/widgets.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/fields.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/serializer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/url_safe.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/_json.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/encoding.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/exc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/serializer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/signer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/timed.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/_identifier.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/async_utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/defaults.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/environment.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/loaders.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/meta.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/nodes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/sandbox.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/visitor.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/_identifier.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/async_utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/bccache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/compiler.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/constants.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/debug.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/defaults.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/environment.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/ext.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/filters.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/idtracking.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/lexer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/loaders.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/meta.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/nativetypes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/nodes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/optimizer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/parser.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/runtime.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/sandbox.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/tests.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/visitor.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/__pycache__/_native.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/_native.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/_speedups.c create mode 100755 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/_speedups.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/markupsafe/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug-3.0.0.dist-info/INSTALLER create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug-3.0.0.dist-info/LICENSE.rst create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug-3.0.0.dist-info/METADATA create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug-3.0.0.dist-info/RECORD create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug-3.0.0.dist-info/REQUESTED create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug-3.0.0.dist-info/WHEEL create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/_internal.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/_reloader.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/formparser.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/http.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/local.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/security.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/serving.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/test.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/testapp.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/urls.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/user_agent.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/__pycache__/wsgi.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/_internal.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/_reloader.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/range.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/auth.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/cache_control.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/cache_control.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/csp.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/csp.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/etag.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/etag.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/headers.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/headers.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/mixins.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/mixins.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/range.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/structures.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/datastructures/structures.pyi create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/console.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/repr.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/console.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/repr.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/shared/console.png create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/shared/less.png create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/shared/more.png create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/shared/style.css create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/debug/tbtools.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/formparser.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/http.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/local.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/lint.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/profiler.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/middleware/shared_data.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/py.typed create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/converters.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/map.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/matcher.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/__pycache__/rules.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/converters.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/exceptions.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/map.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/matcher.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/routing/rules.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/http.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/request.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/response.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/http.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/multipart.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/request.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/response.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/sansio/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/security.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/serving.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/test.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/testapp.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/urls.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/user_agent.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wrappers/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/request.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wrappers/__pycache__/response.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wrappers/request.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/werkzeug/wsgi.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__pycache__/form.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__pycache__/i18n.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__pycache__/meta.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__pycache__/utils.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/__pycache__/validators.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/csrf/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/csrf/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/csrf/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/csrf/__pycache__/session.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/csrf/core.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/csrf/session.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/choices.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/datetime.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/form.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/list.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/numeric.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/__pycache__/simple.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/choices.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/core.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/datetime.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/form.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/list.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/numeric.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/fields/simple.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/form.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/i18n.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/README.md create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/wtforms.pot create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/meta.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/utils.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/validators.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/widgets/__init__.py create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/widgets/__pycache__/__init__.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/widgets/__pycache__/core.cpython-312.pyc create mode 100644 Visual Studio Code Projects/venv/lib/python3.12/site-packages/wtforms/widgets/core.py create mode 120000 Visual Studio Code Projects/venv/lib64 create mode 100644 Visual Studio Code Projects/venv/pyvenv.cfg diff --git a/Visual Studio Code Projects/venv/bin/Activate.ps1 b/Visual Studio Code Projects/venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/Visual Studio Code Projects/venv/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/Visual Studio Code Projects/venv/bin/activate b/Visual Studio Code Projects/venv/bin/activate new file mode 100644 index 0000000..29c26f4 --- /dev/null +++ b/Visual Studio Code Projects/venv/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/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv') +else + # use the path as-is + export VIRTUAL_ENV='/home/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv' +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(venv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(venv) ' + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/Visual Studio Code Projects/venv/bin/activate.csh b/Visual Studio Code Projects/venv/bin/activate.csh new file mode 100644 index 0000000..8bb068b --- /dev/null +++ b/Visual Studio Code Projects/venv/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/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv' + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(venv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(venv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/Visual Studio Code Projects/venv/bin/activate.fish b/Visual Studio Code Projects/venv/bin/activate.fish new file mode 100644 index 0000000..7701f12 --- /dev/null +++ b/Visual Studio Code Projects/venv/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/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv' + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(venv) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(venv) ' +end diff --git a/Visual Studio Code Projects/venv/bin/flask b/Visual Studio Code Projects/venv/bin/flask new file mode 100755 index 0000000..b7fa579 --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/flask @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/home/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv/bin/python3" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from flask.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Visual Studio Code Projects/venv/bin/pip b/Visual Studio Code Projects/venv/bin/pip new file mode 100755 index 0000000..d589b4d --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/pip @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/home/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv/bin/python3" "$0" "$@" +' ''' +# -*- 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/Visual Studio Code Projects/venv/bin/pip3 b/Visual Studio Code Projects/venv/bin/pip3 new file mode 100755 index 0000000..d589b4d --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/pip3 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/home/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv/bin/python3" "$0" "$@" +' ''' +# -*- 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/Visual Studio Code Projects/venv/bin/pip3.12 b/Visual Studio Code Projects/venv/bin/pip3.12 new file mode 100755 index 0000000..d589b4d --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/pip3.12 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/home/mohamad/repos/100-Days-Of-Code/Visual Studio Code Projects/venv/bin/python3" "$0" "$@" +' ''' +# -*- 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/Visual Studio Code Projects/venv/bin/python b/Visual Studio Code Projects/venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/Visual Studio Code Projects/venv/bin/python3 b/Visual Studio Code Projects/venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/Visual Studio Code Projects/venv/bin/python3.12 b/Visual Studio Code Projects/venv/bin/python3.12 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/Visual Studio Code Projects/venv/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/LICENSE b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/LICENSE new file mode 100644 index 0000000..0bc9d52 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/LICENSE @@ -0,0 +1,234 @@ +MIT License + +Copyright (c) 2018 Grey Li + +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. + +----------------------------------------------------------------- + +The Flask-Bootstrap portions of the code are distributed under the following license: + +Copyright (c) 2013, Marc Brinkmann +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the name of the {organization} 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. + +----------------------------------------------------------------- + +The original Bootstrap files, which are Copyright 2013 Twitter, Inc., are distributed under the Apache 2.0 license: + +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 \ No newline at end of file diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/METADATA new file mode 100644 index 0000000..7db96f4 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/METADATA @@ -0,0 +1,43 @@ +Metadata-Version: 2.1 +Name: Bootstrap-Flask +Version: 2.2.0 +Summary: Bootstrap 4 & 5 helper for your Flask projects. +Home-page: https://github.com/helloflask/bootstrap-flask +Author: Grey Li +Author-email: withlihui@gmail.com +License: MIT +Keywords: flask extension development +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 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: Framework :: Flask +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Description-Content-Type: text/markdown +Requires-Dist: Flask +Requires-Dist: WTForms + + +Bootstrap-Flask +--------------- + +Bootstrap-Flask is a collection of Jinja macros for Bootstrap 4 & 5 and Flask. +It helps you to render Flask-related objects and data to Bootstrap HTML more easily. + +If you come from Flask-Bootstrap, check out +[this tutorial](https://bootstrap-flask.readthedocs.io/en/stable/migrate/) +on how to migrate to this extension. + +Go to [GitHub page](https://github.com/helloflask/bootstrap-flask), which you +can check for more details. + + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/RECORD new file mode 100644 index 0000000..130b125 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/RECORD @@ -0,0 +1,241 @@ +Bootstrap_Flask-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Bootstrap_Flask-2.2.0.dist-info/LICENSE,sha256=Wp1gXrLmVW__3ArB-df0VBJKNFGEo2nT1aKxDBl-IRQ,13017 +Bootstrap_Flask-2.2.0.dist-info/METADATA,sha256=qgesC5TLvN6IPGmWli2pajHMFpFO_G4yUfR3068jMoU,1535 +Bootstrap_Flask-2.2.0.dist-info/RECORD,, +Bootstrap_Flask-2.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Bootstrap_Flask-2.2.0.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110 +Bootstrap_Flask-2.2.0.dist-info/top_level.txt,sha256=MciQXyAHKn_wilxUmaTOoErpzRvGPoqHsBHQwGSp4sY,16 +flask_bootstrap/__init__.py,sha256=e4MMNCWkrTwUEccVWPW8SnBYq0qOfEMOn1CX3Fl5EEA,10782 +flask_bootstrap/__pycache__/__init__.cpython-312.pyc,, +flask_bootstrap/static/.DS_Store,sha256=bcLIz2kU2wWVb9irp63OKuJtgovQ61Y1d1BX6AH1Rsw,6148 +flask_bootstrap/static/bootstrap4/.DS_Store,sha256=gSU3fjl4EKr2dFWvaYKXmf9_sBdRdvGb7TpdSySDZz8,8196 +flask_bootstrap/static/bootstrap4/css/.DS_Store,sha256=zW8zT7nPiWd-9_NQ5Li3zGJTrTPsXqM1R3QrhiSG30E,6148 +flask_bootstrap/static/bootstrap4/css/bootstrap.min.css,sha256=DF7Zhf293AJxJNTmh5zhoYYIMs2oXitRfBjY-9L__AY,162017 +flask_bootstrap/static/bootstrap4/css/bootstrap.min.css.map,sha256=rZXEOOCqDqlD9c1-e6uLCAjKj483LaQTMP59aZmfHJ0,653535 +flask_bootstrap/static/bootstrap4/css/bootswatch/.DS_Store,sha256=1bmraQhat95sswy_fx74ChPIld99ujnCsapwgQmAWFA,8196 +flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/_bootswatch.scss,sha256=vXim8qVQ_77HkmqrqhGoDC0kDudsBAHFBe21fBO-U8Q,1672 +flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/_variables.scss,sha256=UNmzm-iELP-hmZjHjVL-sttog0TtFcJxT2d4jv0gkMU,1308 +flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/bootstrap.css,sha256=kgVLKWi4QXD81DsF8DFCx2LY7b5shCE5pWJ9Mabvng4,202288 +flask_bootstrap/static/bootstrap4/css/bootswatch/cerulean/bootstrap.min.css,sha256=RW_ojwB9sS6DzIfFEaDiahxVPN_MupUlrbKrKVkgA9M,163958 +flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/_bootswatch.scss,sha256=jsHWN6DBo0Wq7S16luasohJpUmHK4X6X_tIOx2EjKKE,604 +flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/_variables.scss,sha256=icDHjuinolHUNDQraX88VBjgHrCSKwNGwSCdUGBai4I,1678 +flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/bootstrap.css,sha256=dvZwcCX_tqbf9VQsMERgltYU_-0EoI-vkGjWYTMFDzU,191772 +flask_bootstrap/static/bootstrap4/css/bootswatch/cosmo/bootstrap.min.css,sha256=_H81OfRt8XcW5i6dfB86YU8k0XTUbj2ezDqejIrXWs4,154777 +flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/_bootswatch.scss,sha256=TGKMHXok5dRr8sixsINwoiwNsBz7hmOw-J7wep623bI,4793 +flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/_variables.scss,sha256=zXTe82K1dJ0Jgl1F20RLO54IJEqVkJvXqJNIUfPOmQM,4998 +flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/bootstrap.css,sha256=OHoU2JCNmli2nIoCj78ge_Tgn99MQrFQhBsNOb41zQA,203947 +flask_bootstrap/static/bootstrap4/css/bootswatch/cyborg/bootstrap.min.css,sha256=3FdPvyIyBF62iTAVS30syY0eik-vm4G1fiCPErB7IbQ,165201 +flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/_bootswatch.scss,sha256=GXpe2Vjfw3w76ZPT820YCh-2NpSsHaHJnOxtwbbCItU,3726 +flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/_variables.scss,sha256=yYsMekKb-cycOXg_7gTP6Br91UONmWFe7Afw4LLxDBU,5117 +flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/bootstrap.css,sha256=D3eposjV7vIxXBHHPxzuZq2xhte3POvPYlOyksMDB58,203307 +flask_bootstrap/static/bootstrap4/css/bootswatch/darkly/bootstrap.min.css,sha256=0tZXz4Wl0mk302PbATyRKjsHT1tI5FwnK5gY8DB5SeY,164810 +flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/_bootswatch.scss,sha256=LHt8YT3gf3DmrwBs75UBFL58IHVzorJ8om9tU-qVTXo,4182 +flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/_variables.scss,sha256=6nHf1fjWISSnANGSrar-rmexPx1vWGU_c6aYK9Kb7xU,3331 +flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/bootstrap.css,sha256=3yMe_Gk8u-W6ntv2h72sMV94yIBVxod5hgN6HMw2M9Y,204024 +flask_bootstrap/static/bootstrap4/css/bootswatch/flatly/bootstrap.min.css,sha256=K0Q0THV-T7huqMhZI87-P0A_uy-tbcyC751i8ScYytw,165463 +flask_bootstrap/static/bootstrap4/css/bootswatch/journal/_bootswatch.scss,sha256=ZYYDhKxg9DEYOvE5OV26Wdm83FmJASupuaXkMUOdYlI,1225 +flask_bootstrap/static/bootstrap4/css/bootswatch/journal/_variables.scss,sha256=tUTh-87vmNrZHweJjvCl_ltKElsL6Lm1Cm1oGQFeMg4,1492 +flask_bootstrap/static/bootstrap4/css/bootswatch/journal/bootstrap.css,sha256=EIpvpC8Jleb964_hTEjD5MEAZ2HudvLo_yic2OFWNLI,200515 +flask_bootstrap/static/bootstrap4/css/bootswatch/journal/bootstrap.min.css,sha256=b9ANi-bPfqDaEOG9y_CZ2-cs5WlO6MdZ85ZEDwp99aw,162339 +flask_bootstrap/static/bootstrap4/css/bootswatch/litera/_bootswatch.scss,sha256=nAMZuvvNiTVojPxGEhHsobmVJtj-ntKplUWVrbGLuXs,3830 +flask_bootstrap/static/bootstrap4/css/bootswatch/litera/_variables.scss,sha256=KixiDutrnBteVo0-wIbq2yOZTG2GuG369ZBXgjILqiA,2656 +flask_bootstrap/static/bootstrap4/css/bootswatch/litera/bootstrap.css,sha256=XfzoWfU5mWbhw5kWiNCIxA-gtHzwQEI0IXjMHqwQ6hA,204433 +flask_bootstrap/static/bootstrap4/css/bootswatch/litera/bootstrap.min.css,sha256=YwRe9tp_LgR_N_G0wb0GXHfupruWc0Pf6Juel_cY-G8,165760 +flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/_bootswatch.scss,sha256=PbVvasac2lrKowlCd9wqidUi8sVP8p13yrpJ9mSSoOg,8266 +flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/_variables.scss,sha256=7jUb7TvFp19j_9RYcgeQsKx2-rC4J4_CSv46WCcbZLA,2395 +flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/bootstrap.css,sha256=jp29naMtERqj5b9_yZb1aBmzsbgq4t5-ZhMzFGRJiBE,207845 +flask_bootstrap/static/bootstrap4/css/bootswatch/lumen/bootstrap.min.css,sha256=jlJkgYQWWRqOYNoAJrtSPAgJ8XzAB5oW8G8_ovdz_x0,168551 +flask_bootstrap/static/bootstrap4/css/bootswatch/lux/_bootswatch.scss,sha256=D2xnHeVH2lo71MnYMSrmQuTQZvS0CrxxVcF8KjXmzW0,3055 +flask_bootstrap/static/bootstrap4/css/bootswatch/lux/_variables.scss,sha256=pUuNjacO7AdW8s5D81300302VP_Sws-QyyaWu4AOrK0,3039 +flask_bootstrap/static/bootstrap4/css/bootswatch/lux/bootstrap.css,sha256=23CUOVuKpzByAlbfBea2d17YMqz2g0EApCpTJrIqkxw,193784 +flask_bootstrap/static/bootstrap4/css/bootswatch/lux/bootstrap.min.css,sha256=v2HsAdJ0L9YjVjheYom4BSraR-nwJDgYj6wI73QIedI,156467 +flask_bootstrap/static/bootstrap4/css/bootswatch/materia/_bootswatch.scss,sha256=5BAjlqqdi-ieDF8lx4zKmrB_PTY8-MsSvYZkTa7VF2E,14835 +flask_bootstrap/static/bootstrap4/css/bootswatch/materia/_variables.scss,sha256=vDPiMUSbGS07JgEGBtOqBAGx3J4SAI4vn2tXujajM4A,3988 +flask_bootstrap/static/bootstrap4/css/bootswatch/materia/bootstrap.css,sha256=3tNEjEs1XQPcXZ7lmqgKZBhtLLMZSpCScTsfvZdvt_M,240391 +flask_bootstrap/static/bootstrap4/css/bootswatch/materia/bootstrap.min.css,sha256=MEhiSVHcxsJGoCn_OncBKfjYzl8Z-gHOA_TJ0s4oTP8,197232 +flask_bootstrap/static/bootstrap4/css/bootswatch/minty/_bootswatch.scss,sha256=TxjTzkv-QvphSROMbc4BMjRsfSnZlsDAGJJ5t2fzcjA,5054 +flask_bootstrap/static/bootstrap4/css/bootswatch/minty/_variables.scss,sha256=hAFBX41y2SnJQadFUq0koqxAMB1JGXGTX6Vxf_LGtoc,2848 +flask_bootstrap/static/bootstrap4/css/bootswatch/minty/bootstrap.css,sha256=Knjll2rX5xJoU1XjuvzlgxDmgyUknpcdUAvDAuPOgaU,205400 +flask_bootstrap/static/bootstrap4/css/bootswatch/minty/bootstrap.min.css,sha256=dH_ZJzNkhrTqLl30dAJ0pIDbuNWlF2Fht9I2Q8jhrcs,166554 +flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/_bootswatch.scss,sha256=R_jD9oNTv0e8auLglK1Eqg_VNkn2ernKA3NfMCN6UZo,2483 +flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/_variables.scss,sha256=zFz8WoHDpJfR87hMtp4QQrkQGcfaE5loahyhA8Vq1as,2481 +flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/bootstrap.css,sha256=2KdNjG8xpewq6x6_iJsmWdOXjxc71krB7Lr1zRUNUM4,193530 +flask_bootstrap/static/bootstrap4/css/bootswatch/pulse/bootstrap.min.css,sha256=1vQy0iTuGRchdjqh8TwEkCeFn81PyVt9KofS69uQxKs,156210 +flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/_bootswatch.scss,sha256=sdc01MLr2EZjar6mVNLj67OfxHuXEYoo8hCrrfowMzM,3505 +flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/_variables.scss,sha256=UOlPF4_HtjlZXmCVhI42Mtg66gJTYzIeTmsT1xcqR-Q,4132 +flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/bootstrap.css,sha256=35o4Q2B7EFPNnLdj4-S2Mg9AtRkAS6OXZ1nvrHZRO8o,202572 +flask_bootstrap/static/bootstrap4/css/bootswatch/sandstone/bootstrap.min.css,sha256=Wj8Vq1ER7uigVDcLe8Kfwxu4ieW867kr9HQihUUfnQA,164151 +flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/_bootswatch.scss,sha256=Qw2PO-zr95atsHEs_xxd_VS8SU20IDtVRaXLN5AWnIo,2449 +flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/_variables.scss,sha256=PWbqo6dHXIl5rFeXrxidvfi7n6WpKbMHiEwHv8QYkC4,2774 +flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/bootstrap.css,sha256=0T96l1EKwP8NgXe8ivPFX_1z4JbIL_LQ7IpydBVYnkI,202308 +flask_bootstrap/static/bootstrap4/css/bootswatch/simplex/bootstrap.min.css,sha256=Xsqt9TSw-DbYFdZSxbG_pMRF_JLdDeG6xFFRU3JwWxs,163842 +flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/_bootswatch.scss,sha256=DrV9A5YTcmpm7Evl3bAqTChqSm7T0X89S6Mk5MjPA3M,8430 +flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/_variables.scss,sha256=h9W-95BHiKQv2TS1v5Z1ivtiSTy5nXYkCR14tgFojiY,4574 +flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/bootstrap.css,sha256=7Ij2XDQQppqkkouKeDZPiTEgjca1SY5INqzLhLNoRJc,206630 +flask_bootstrap/static/bootstrap4/css/bootswatch/sketchy/bootstrap.min.css,sha256=tT30p4dCoDHNDmxveHbPJQSFVn_7a7pDBqplXFNWff4,167654 +flask_bootstrap/static/bootstrap4/css/bootswatch/slate/_bootswatch.scss,sha256=JpBWtpJKZbc59w1gQZHdoY62JjNyk7Nt1jXm4DCYzwQ,9314 +flask_bootstrap/static/bootstrap4/css/bootswatch/slate/_variables.scss,sha256=WFOW2n_v8ywuvgZ3NAnrcCD6kx6qrURiCj40o6ZjoSc,5011 +flask_bootstrap/static/bootstrap4/css/bootswatch/slate/bootstrap.css,sha256=fNSl15Yn39bedmhpc4F1_SxIcz6DSgJkrPSDuybbgBg,211917 +flask_bootstrap/static/bootstrap4/css/bootswatch/slate/bootstrap.min.css,sha256=qdwWE5kCHBJrfGXA4BRFz6ixKw9PCpaYzJWA9260DzY,172236 +flask_bootstrap/static/bootstrap4/css/bootswatch/solar/_bootswatch.scss,sha256=RxR9GNZTUr_urmH7slkp-eKBi-LKhoPMSSM7trjz7iA,3961 +flask_bootstrap/static/bootstrap4/css/bootswatch/solar/_variables.scss,sha256=ocpaRP50uAh9g8RY7hQ0eBn6M4BA_oinB4G7Df9C_es,5542 +flask_bootstrap/static/bootstrap4/css/bootswatch/solar/bootstrap.css,sha256=BBsqVZ7AhHmofnulmMRfY3tiddpUxxYycm_N6OIKl7k,208810 +flask_bootstrap/static/bootstrap4/css/bootswatch/solar/bootstrap.min.css,sha256=eeFZTjMs-Fz5lW8l5wrcJztSyJmQNRFu9FtwqSDOcaY,169827 +flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/_bootswatch.scss,sha256=2Uef3k3MG-WOjX208LS2da6lBiDCLfz6mYMK1UTusL8,1929 +flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/_variables.scss,sha256=2zMsbY_J52JrZbmQP8MAOYATlyJZg7_kQHTNx_JuBvM,1673 +flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/bootstrap.css,sha256=KcPB_DJYMagrSc-ZZuonGQcGuiVi1ABak9rPcYAQHcg,204173 +flask_bootstrap/static/bootstrap4/css/bootswatch/spacelab/bootstrap.min.css,sha256=VdSljf9GE8Znxpt5oe70r3Yffh2TuRl1m-vMztZP2_4,165502 +flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/_bootswatch.scss,sha256=QdEwn45fAg05Ydv3PJQX4veip9NSP8bBoqFEiCycq_s,4646 +flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/_variables.scss,sha256=3g-z2GmQF1xBz5ubxgl-fMBJumxxp9ZFlKvWr2yfY2E,4895 +flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/bootstrap.css,sha256=mMq6IjLEXcZXiSwojACk_Yl-pMIYovOEImV9V3BURUM,203906 +flask_bootstrap/static/bootstrap4/css/bootswatch/superhero/bootstrap.min.css,sha256=ADi3Xne8BjmmGG8K4lQWmU7SegWM4B2xWeapboEdA18,165185 +flask_bootstrap/static/bootstrap4/css/bootswatch/united/_bootswatch.scss,sha256=XWO6_aHbrDYwPQOC2xjIG_ZnhUOVp8Z4jiC6vw8y3GY,270 +flask_bootstrap/static/bootstrap4/css/bootswatch/united/_variables.scss,sha256=pE3poBCUfL0Vj3WHXirXAKWr_SLIM-GUEAFO4Usb8rk,1390 +flask_bootstrap/static/bootstrap4/css/bootswatch/united/bootstrap.css,sha256=5js32PPDhOakWxAk79fvIvLYlfLBxtCVnPVZjjHgCy8,200037 +flask_bootstrap/static/bootstrap4/css/bootswatch/united/bootstrap.min.css,sha256=7gdx77MsYTQV0shn-8C0CP7lc6xQRexoNubpaigHL6c,161975 +flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/_bootswatch.scss,sha256=HgyLcj4CGYsSXdcax32gcqfbaqMZ_mx9OI3rJSDO5uU,9191 +flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/_variables.scss,sha256=t4h3o29N0vo56FM6BvzTlsxFp5hEaP3nfbW_QINPz28,2969 +flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/bootstrap.css,sha256=tKf5b4rLrMPFMf383I9vHkF0q57c4ohWqUGaetEYHMU,208339 +flask_bootstrap/static/bootstrap4/css/bootswatch/yeti/bootstrap.min.css,sha256=hqMfmPlwrJpRN1EanXFcujx-vGhMfBbeKVyT09X3mIw,169119 +flask_bootstrap/static/bootstrap4/icons/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148 +flask_bootstrap/static/bootstrap4/icons/bootstrap-icons.svg,sha256=AJrEdnY4Ht7hFuIG2DKx5V2eiNwn2kPDTaupaTln7Vg,768258 +flask_bootstrap/static/bootstrap4/jquery.min.js,sha256=9_aliU8dGd2tb6OSsuzixeV4y_faTqgFtohetphbbj0,89476 +flask_bootstrap/static/bootstrap4/jquery.min.map,sha256=PVB97BePQ5JED6qSU7EvSun5iseF5FinCKtqsv5X9uA,137974 +flask_bootstrap/static/bootstrap4/js/.DS_Store,sha256=mxHnkOv1j5DZGioxbqZDjXeoYzRtC0YCF8css1GHUJU,6148 +flask_bootstrap/static/bootstrap4/js/bootstrap.min.js,sha256=SyTu6CwrfOhaznYZPoolVw2rxoY7lKYKQvqbtqN93HI,62440 +flask_bootstrap/static/bootstrap4/js/bootstrap.min.js.map,sha256=7YLu91YTF_jv1ztPq2G47QLHzMmQt9f65-PS8wKkrzE,187646 +flask_bootstrap/static/bootstrap4/umd/popper.min.js,sha256=_ijcOLwFf26xEYAjW75FizKVo5tnTYiQddPZoLUHHZ8,21233 +flask_bootstrap/static/bootstrap4/umd/popper.min.js.map,sha256=Cd2weQ_ol_ezwrmUzCXQWJQqHT8wHt-3qr4a0LghtTU,123754 +flask_bootstrap/static/bootstrap5/.DS_Store,sha256=_PPNeEHImOW7XJKQ5yqnX5PeT_g2Xg_HONi7STmfOoM,8196 +flask_bootstrap/static/bootstrap5/css/.DS_Store,sha256=VnDXlDhqr37GzfQVcJ2zrbCV-arCRV6aZlVRpeW5elo,6148 +flask_bootstrap/static/bootstrap5/css/bootstrap.min.css,sha256=IUOUHAPazai08QFs7W4MbzTlwEWFo7z_4zw8YmxEiko,194901 +flask_bootstrap/static/bootstrap5/css/bootstrap.min.css.map,sha256=DeQ_E9sCysPjOIMV2S_0pBftVbM6LAbCOf8jWjwsOn8,522721 +flask_bootstrap/static/bootstrap5/css/bootswatch/.DS_Store,sha256=ZYfeSLd3IYgQTUt2RNB1VvBO61PC31DzClygXGAthDM,10244 +flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/_bootswatch.scss,sha256=5p2G9MRqsnB3YkgkP_fBDRliXB3Gw18WOQO2FAQ28BU,1038 +flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/_variables.scss,sha256=wrj3u-Vs-XNtXPeDZ4ISgD1NS3Xl1CFvK7SSpcPpWuA,1377 +flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/bootstrap.css,sha256=9gZbbRcuiF8zZUOKdDDduApLVhr4QqOc6jYHyK_1nnU,241013 +flask_bootstrap/static/bootstrap5/css/bootswatch/cerulean/bootstrap.min.css,sha256=_OcP0ljQDtCUI-zf8KZho6GYKR24hOmmbRkTrvb6Jwk,197590 +flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/_bootswatch.scss,sha256=N_VLMgTFDOMhlTz9KTR2B_GNh8meCrkJv79iBuqiYOo,503 +flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/_variables.scss,sha256=f18RZdB98A3Jh7haWSWIBhrxMZjqpvmpcxW8WeSm7Ng,1636 +flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/bootstrap.css,sha256=vf1-elTg97p7Tq2RX0T6Rx19Zf2L9O6wVlbqLMrxHxs,228110 +flask_bootstrap/static/bootstrap5/css/bootswatch/cosmo/bootstrap.min.css,sha256=5t--JZpgVLzo9vF7snO5Qw0y3fA5_NkoJENWB7kpg0E,186041 +flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/_bootswatch.scss,sha256=LnpxDh9tzlaLeTju5RVhvckoiO8wvGU_STjpxOyEcHg,2001 +flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/_variables.scss,sha256=zibrJraVdJ16Rse466xtNo7ZI2wND0aVawaGOydjKsU,5459 +flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/bootstrap.css,sha256=7RYSzRKGaBRuwNYppwJCknABxCsugZVHU2R7ISY4mcg,239309 +flask_bootstrap/static/bootstrap5/css/bootswatch/cyborg/bootstrap.min.css,sha256=Z8BSCy0P2lxqdAJLcEQfxUcFGQHrqe2HYVKna0buJbc,195855 +flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/_bootswatch.scss,sha256=JEw36fKgyqCIIlGz2hxDpGbH5HCAyPLxVNO27-nT4kk,1146 +flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/_variables.scss,sha256=UNtSuv19cSN0OhflkTOQXUMN1cWhJNll75QcOkndjAg,5481 +flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/bootstrap.css,sha256=E61wU0yEZaeuTRFpWGO9Byoo22XtujocxiWgde25gCU,238830 +flask_bootstrap/static/bootstrap5/css/bootswatch/darkly/bootstrap.min.css,sha256=o0HIFCT80mlwmD9WyaZ15WwfdUK5A-gMvVWv8J04lKc,195568 +flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/_bootswatch.scss,sha256=ED-LRqBCebUusDto-3zNafY5llnJHObx7iB1QPW8pcg,1656 +flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/_variables.scss,sha256=-t4KWuuRtL1Saidnkw-rOFjw6JOn56cgAtVGxGPsXtU,3438 +flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/bootstrap.css,sha256=JxCEpeDO5sZ2UwYpyc1810rDKnCscWdz61jzDbLJPrc,239642 +flask_bootstrap/static/bootstrap5/css/bootswatch/flatly/bootstrap.min.css,sha256=Jb_KeGy7y_Qft8APyjU0xwdlwz2Wo9nxOhXV-8Wazho,196382 +flask_bootstrap/static/bootstrap5/css/bootswatch/journal/_bootswatch.scss,sha256=xafRxqBc-_tnGFllJxrqGvhlafH2yqS5IR40cvyzMoI,978 +flask_bootstrap/static/bootstrap5/css/bootswatch/journal/_variables.scss,sha256=S5pA4kRH8qqiuCcdAwCLye3wT_omkNiT_zpexIPp_OY,1560 +flask_bootstrap/static/bootstrap5/css/bootswatch/journal/bootstrap.css,sha256=Cpkrdymf6icExb50IZ_HLruVN0qV31rp3gyIniDgSdc,238521 +flask_bootstrap/static/bootstrap5/css/bootswatch/journal/bootstrap.min.css,sha256=KErI_zqZ-8aBlYvIwcw6KYBceNlzqUeefufNi0r2ukk,195288 +flask_bootstrap/static/bootstrap5/css/bootswatch/litera/_bootswatch.scss,sha256=a6cOYzKsZS5F21CdRjb8PZtIJZMMDL9wXq_kOPnRG54,1472 +flask_bootstrap/static/bootstrap5/css/bootswatch/litera/_variables.scss,sha256=fVNs9QwNPbiV5ZGiDH1P88BBbvUKYOZ-GucxujglLnM,2721 +flask_bootstrap/static/bootstrap5/css/bootswatch/litera/bootstrap.css,sha256=zCXeTYwjAoRpZfCSI_pfZVOlF42lxJWJfC5PFqHl1NQ,240983 +flask_bootstrap/static/bootstrap5/css/bootswatch/litera/bootstrap.min.css,sha256=GZfATRvVlvjE2dXyzSArrp07IRuJkyNzX8kjV9WJodM,197400 +flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/_bootswatch.scss,sha256=Ls-lQAZz4erH8YMhAj_gHiUiEYe_LnKAFLJCvMml_Ak,5290 +flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/_variables.scss,sha256=1EzEeme4ef_ITTxwynQTHF9L1c2rqlgXgz54TANBnUA,2575 +flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/bootstrap.css,sha256=G6SBFnSTA41TeVUXsE8vFuXOfKrYtUhfaHoug0QPcEw,244911 +flask_bootstrap/static/bootstrap5/css/bootswatch/lumen/bootstrap.min.css,sha256=utfliVFLcw4J-tDumVR12vEWVcTRWRqE-Xi0-jZBW00,200839 +flask_bootstrap/static/bootstrap5/css/bootswatch/lux/_bootswatch.scss,sha256=oYxDO7ZmxXvDMw5JZgnO4lWtU0LK8xFV_LD-bGO2ie0,2182 +flask_bootstrap/static/bootstrap5/css/bootswatch/lux/_variables.scss,sha256=cqLvtREn1uURQu8cb1JQUQweeZS_WFC61mJucfVj5kI,2998 +flask_bootstrap/static/bootstrap5/css/bootswatch/lux/bootstrap.css,sha256=15_WNQuG0WvvHJ-54-kKyRifvCVOOLqBVSraF6Hl9U8,229576 +flask_bootstrap/static/bootstrap5/css/bootswatch/lux/bootstrap.min.css,sha256=d9VHi1uYLOWSQc6DHsKU7vumA0JWcK5y2zjPKxf4Ehk,187271 +flask_bootstrap/static/bootstrap5/css/bootswatch/materia/_bootswatch.scss,sha256=142Sps83y2HA6xlC4wQVjjHC5N3tlymPZfbbRgTS1Rk,12032 +flask_bootstrap/static/bootstrap5/css/bootswatch/materia/_variables.scss,sha256=_5PLnc-Wlwrtf90gmMikxNtRLg7wPWXqcfvngNF-Pbc,3053 +flask_bootstrap/static/bootstrap5/css/bootswatch/materia/bootstrap.css,sha256=WkR8fMZbiMc54O7S1kuFWN6Hf1a5cnQbe29aJAUZrCI,266672 +flask_bootstrap/static/bootstrap5/css/bootswatch/materia/bootstrap.min.css,sha256=U3vNrFp_GOZlq7KDCxKJRX2aPzZVApD9UaXbbEqcxLA,220098 +flask_bootstrap/static/bootstrap5/css/bootswatch/minty/_bootswatch.scss,sha256=vnzmZi4CKovxSo2fYQjAOXag_WJNDU9WwSiMW71TgBw,1641 +flask_bootstrap/static/bootstrap5/css/bootswatch/minty/_variables.scss,sha256=UY11NN7rGqWjkASU8KypmWUBIwfA3Z94hT4GHLKI0n0,3184 +flask_bootstrap/static/bootstrap5/css/bootswatch/minty/bootstrap.css,sha256=gamh4tS0mDfyYV5I1mKxTscGzqQ2uA7yg-HLN2rk-PQ,240152 +flask_bootstrap/static/bootstrap5/css/bootswatch/minty/bootstrap.min.css,sha256=OzB38SWBzjB6YrYedFmeqQXM5DRXT6LJB5I8woVQEKo,196720 +flask_bootstrap/static/bootstrap5/css/bootswatch/morph/_bootswatch.scss,sha256=G1qRBvDSsiqRFglFQ5muxnY44pVrSoBKVm-4749wKpo,9052 +flask_bootstrap/static/bootstrap5/css/bootswatch/morph/_variables.scss,sha256=RskgGJsMk24j92x6WheWuQK9uI1uMc5kdPjx6dx-Cwg,7226 +flask_bootstrap/static/bootstrap5/css/bootswatch/morph/bootstrap.css,sha256=dOGKwbrrUYqs43o1SeiboKNf0hsX98O6fOk4tevgZ00,260921 +flask_bootstrap/static/bootstrap5/css/bootswatch/morph/bootstrap.min.css,sha256=9FeFeyvjytlt2F0dqa4grxG8jj-4xy18x3LBlWi1nRc,214804 +flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/_bootswatch.scss,sha256=HB0ueUoOcbSlGroLXks5pR5yMm_qikn0nTEwgfVZJMA,2029 +flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/_variables.scss,sha256=OpmC2etsHJMwIdN5KPItwysXfaZ2SStqFk0pZ6ql2C8,2487 +flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/bootstrap.css,sha256=Q-BP850amQx-yi0wht2Rysg8HLh9DX7hCuKdvZLJOaM,229514 +flask_bootstrap/static/bootstrap5/css/bootswatch/pulse/bootstrap.min.css,sha256=igwjA-WT3NjBCowovTrz7sqKzNsJK6cm4nagBjX9s10,187227 +flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/_bootswatch.scss,sha256=CBJKRxpQbadCiy2q_gFmNkCVxrbKMnfHquSOJavq7qg,4707 +flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/_variables.scss,sha256=9SR71TbSPI_-LC5Q1wklqYt5Sj37igVV9wJYYRB7_Ng,6659 +flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/bootstrap.css,sha256=qWxsVCSULJb6CWoeqKUmUlnrKqB74mmQ6e4DmqQQbkc,252603 +flask_bootstrap/static/bootstrap5/css/bootswatch/quartz/bootstrap.min.css,sha256=DYBkEgiMRXVf-f-osR5C29CTYpQI56TJv6CCNq8KhBI,207334 +flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/_bootswatch.scss,sha256=WO50LUki5pycjNcYZU-X0nMa4uN7tz6lx1_e1IKyJEY,3185 +flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/_variables.scss,sha256=_QE8hbXnPnaxziaGalFwihoMMW32X3QrMotvco1JsGU,4424 +flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/bootstrap.css,sha256=Ym2GPsixSspS5GqpQXPOxUeSt4dgZWjMAx5wWd4_Wlg,240625 +flask_bootstrap/static/bootstrap5/css/bootswatch/sandstone/bootstrap.min.css,sha256=EyZ77JDY9eCld22MpGtmdNBA2CYrh1xhIwPQR8LR-XY,197188 +flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/_bootswatch.scss,sha256=bNsxqRoD1Zo7VxTU8sYA1ML40slXbFgQ9f5xBt22phA,2126 +flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/_variables.scss,sha256=idS8YCqs_AijFL4vspWgnSbZt1CqhX_kQBffvEeEz5o,2815 +flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/bootstrap.css,sha256=iMc81a9B3vFzz-2UFxffL0Eu-cckKH1IcU_kem1mPnk,239900 +flask_bootstrap/static/bootstrap5/css/bootswatch/simplex/bootstrap.min.css,sha256=JZVF71l8vl1gS9BwZxjnu-YuHQzOuuLHNRxecEPBNio,196464 +flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/_bootswatch.scss,sha256=HTSFhGIsAfjvJVSYuASYQKDlbLsGXgIuT8ztWnGrHXA,7643 +flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/_variables.scss,sha256=1OiuIfqc0clY_WV-ssnUHL-V1MzIouHKwirQC2dON-U,4652 +flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/bootstrap.css,sha256=sfH3e_7YDYk30b-43-JpTGi8xI2X55sKC3PZuFK8AqE,244787 +flask_bootstrap/static/bootstrap5/css/bootswatch/sketchy/bootstrap.min.css,sha256=lQr-Nw6vZSzsdCznCwmOArW7vTDIoJ4lpv0_rArLQiA,200614 +flask_bootstrap/static/bootstrap5/css/bootswatch/slate/_bootswatch.scss,sha256=EQuzDtL-7AyODcwmrFXRpMKfjcGZrRkNXDmomI97J9s,6603 +flask_bootstrap/static/bootstrap5/css/bootswatch/slate/_variables.scss,sha256=Xh5DGilry_-3DtROquj31M04cu8PPadFd_dqp6IG3nY,5268 +flask_bootstrap/static/bootstrap5/css/bootswatch/slate/bootstrap.css,sha256=A86omlh-ySmQnSLXg32jNY5DzNyzj-8TLozfP0OWJuU,245581 +flask_bootstrap/static/bootstrap5/css/bootswatch/slate/bootstrap.min.css,sha256=KEjddyKPy7ocflyfb5NGJ9goudA7_sStN4lr8yngxI4,201501 +flask_bootstrap/static/bootstrap5/css/bootswatch/solar/_bootswatch.scss,sha256=d6VO8-zRxH8EYD9XPddkgol-xG2JRLS7BSOgbFcf5J0,1051 +flask_bootstrap/static/bootstrap5/css/bootswatch/solar/_variables.scss,sha256=MO8eTwRWJn1rozQyeAf7eLWsCNxdc7fVNElYpCYpqcU,6298 +flask_bootstrap/static/bootstrap5/css/bootswatch/solar/bootstrap.css,sha256=2sqJtezpWuRs__2M4NfKNOBsz69wZIsDczlxJ5OYbX4,239324 +flask_bootstrap/static/bootstrap5/css/bootswatch/solar/bootstrap.min.css,sha256=dvtewEQRD19Nq6RTlx5sBmkCsuM7uqp8zQIxa62kySg,196028 +flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/_bootswatch.scss,sha256=MMAGniQ0HCaP33AwMggI_8ss-iiQ-PRcvYyU8VL9iCs,1463 +flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/_variables.scss,sha256=wYr0b4i6wYpjw7-orxm2VF779sAiKNvm8zjcrDLZ2cw,1700 +flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/bootstrap.css,sha256=dMVd1_iIcYjFwSlFe8PdFlV_batrV2vWz01tTgvBiCM,242125 +flask_bootstrap/static/bootstrap5/css/bootswatch/spacelab/bootstrap.min.css,sha256=qXd5_Qe_7ewEaR_IPyKnUoAIe4406vpICsf8Mjsa_cE,198445 +flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/_bootswatch.scss,sha256=zpFrGNkgLpUa1Ej1Y65cVWXiBDdcijzcrhf24UCP1d8,1984 +flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/_variables.scss,sha256=J2CisiNkCFij_yuqTvSU6z48QkqzR7Xn-eibZ-uRhuQ,5597 +flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/bootstrap.css,sha256=lK5w_fFuWbnKEWTjgs94yaPClikWtTYEJqiE86EXESU,239668 +flask_bootstrap/static/bootstrap5/css/bootswatch/superhero/bootstrap.min.css,sha256=VyyY3Y6wlcQjL9oOyFzv6RK86XV4Q5GhhE_koyDfvcU,196240 +flask_bootstrap/static/bootstrap5/css/bootswatch/united/_bootswatch.scss,sha256=GsAWNlsOEh9AAiHIPlAB80Y_0A-sO8BhIIiYo3AWkHI,306 +flask_bootstrap/static/bootstrap5/css/bootswatch/united/_variables.scss,sha256=7OQ73Oc9RuzIkfBzVrap1jXqNDm1jg5gPrB5qgICs_8,1414 +flask_bootstrap/static/bootstrap5/css/bootswatch/united/bootstrap.css,sha256=SMLYkZrLsHGx04SOkjc6y1MaDSG9r54Rb8N5208_wmE,238156 +flask_bootstrap/static/bootstrap5/css/bootswatch/united/bootstrap.min.css,sha256=jaKh1HNOKo9o6lvc34Y8SMWHrGhH8-duEyUutgHif-4,195043 +flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/_bootswatch.scss,sha256=OeFQIhg7Zntc_P0VnHeph3zl-rvHdnc38VthKEIoGTs,5440 +flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/_variables.scss,sha256=l_vNacZkf0BXKRuR3ptUSBdG4hiV9xcdK5sBnoljujM,4280 +flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/bootstrap.css,sha256=bSragkHTUmxQHystjZFC-0YoEj6ATudrTXYKMjHAc8w,254929 +flask_bootstrap/static/bootstrap5/css/bootswatch/vapor/bootstrap.min.css,sha256=cUnKi12Y3y_VKGe8N27oEBNLf-rOY9Xe0UUrx738pXM,209132 +flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/_bootswatch.scss,sha256=TmemOFM0v7-8rEyvwgM6g9kUMYjf-4U2-xh_IPIqo8w,6268 +flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/_variables.scss,sha256=Pl1sjY5ccdiH63fMS_JTMfdX-WqnYDI7Ltx2lQ9L59k,3178 +flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/bootstrap.css,sha256=kRy4WUG5OO6jBeLgv9WHtV_wsx0chC7zhZ47go3w_Go,243958 +flask_bootstrap/static/bootstrap5/css/bootswatch/yeti/bootstrap.min.css,sha256=5DZseKPlnUBCsNwgzU3dMheMvnwWkgGMhx33lzIkEso,200122 +flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/_bootswatch.scss,sha256=Wiq8gwoWhB_5PNAGZdFiNlQIXKxZlwmWhxAhxe8bvVg,2875 +flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/_variables.scss,sha256=zGBwqXPmebVDPtWETMMZAzHEOzwrxYK01wsEILtxlu8,4579 +flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/bootstrap.css,sha256=y3ITCzL-K5m_Kenh1Ct4g9mQSKakOg7Vvl8n0Fhbeo8,242053 +flask_bootstrap/static/bootstrap5/css/bootswatch/zephyr/bootstrap.min.css,sha256=yZpjeMecRI-jXfJ_6hgz2vb12592soiMWCxI_5d65wY,198288 +flask_bootstrap/static/bootstrap5/icons/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148 +flask_bootstrap/static/bootstrap5/icons/bootstrap-icons.svg,sha256=BwQM2_4IyX-Kpjw1BeWniZr8piTIDwS7B5gJOXGUZp8,972583 +flask_bootstrap/static/bootstrap5/js/.DS_Store,sha256=tFfyxJryvPP4deCT7AzYDSZDNFDFpbHj7oL_GkkrHCQ,6148 +flask_bootstrap/static/bootstrap5/js/bootstrap.min.js,sha256=h1OMS35Ij1pJ0S-Y1qBK_GHQDyankPMZVpeZrNQ062U,60480 +flask_bootstrap/static/bootstrap5/js/bootstrap.min.js.map,sha256=-_D-vV0yHUquPnlJV18Ut_2SIfN_SzcXMCjw0fabotE,217134 +flask_bootstrap/static/bootstrap5/umd/.DS_Store,sha256=CfcHGBSNOLJfgvLxWJcObKl07aKenPPnmKvhYj7bfmI,6148 +flask_bootstrap/static/bootstrap5/umd/popper.min.js,sha256=Jt4Ksn1jloGVv5eC0on2b-cd2pk0KVcQvSa8UveEN90,20096 +flask_bootstrap/static/bootstrap5/umd/popper.min.js.map,sha256=n5LpGPcdExBpgYVZs-G_jpHtwK1eiE2LhiHrBMH0GP4,114779 +flask_bootstrap/templates/.DS_Store,sha256=91qR0xLJXQ2m2G8EAMOQX8AxCVi0Zh1DjW1y4_3KjkU,6148 +flask_bootstrap/templates/base/nav.html,sha256=jogjj6HBsxdGrrFOt-cPyF9yfmbgDC0P9yHisc8KtSY,948 +flask_bootstrap/templates/base/pagination.html,sha256=Kqmzy_3a96O0CGqQEhO-Aec79UUQNtDTAdJB8LkQScA,4118 +flask_bootstrap/templates/base/table.html,sha256=neUpuDCtnChfQg8zhw0hVM4Hb2mH8qx3UZHdSZsDi6E,6739 +flask_bootstrap/templates/base/utils.html,sha256=OG98Ydves_er0MgUruF7IzHjzkkZWutJ0IGitmkYgQA,1550 +flask_bootstrap/templates/bootstrap/form.html,sha256=Q7wuSI8SE_qkvmmNEDlXnuSIfGLWVP189kfcbfHjgHE,258 +flask_bootstrap/templates/bootstrap/nav.html,sha256=v4jmI2Wqs7UooAnA4x0ax4eQOM88m8kGZC9IsKiq8W4,260 +flask_bootstrap/templates/bootstrap/pagination.html,sha256=vbdFUhbxx14WQnh4Ftq8MQBaENSllvcxyOOwMbIm0iQ,271 +flask_bootstrap/templates/bootstrap/table.html,sha256=L4OJptSRLlEUrZDx8hMyE9iPwmSsKW9-f5BX0aAdTBw,261 +flask_bootstrap/templates/bootstrap/utils.html,sha256=hcvpoB6zXuaQVkYuMczccZgTgG5nMDxr30T7yuX9KRs,260 +flask_bootstrap/templates/bootstrap4/form.html,sha256=gbL0DS1QwJb3CVzVyj1TvBMcPwVJumheo-zcW9DnF2A,16604 +flask_bootstrap/templates/bootstrap4/nav.html,sha256=_dD1Xdz-htSVUUnq00ViyhIvb0dSaksOOaOrcvWXfuM,30 +flask_bootstrap/templates/bootstrap4/pagination.html,sha256=EEA04-GMfCByN63rp3OZJBVK75UXr3PXk0c3jIf6Tjo,212 +flask_bootstrap/templates/bootstrap4/table.html,sha256=7e34x6aMlCCIAQNM31F4iBPyjmtUdxbY69TFsoqvQ0Y,32 +flask_bootstrap/templates/bootstrap4/utils.html,sha256=AW20cnN0YC6xzjWbiWxZXD0WqzzHR_8xermANCl1T04,1547 +flask_bootstrap/templates/bootstrap5/form.html,sha256=oE95SDRcIzMLBKz0pT7z1bcgYmH2Lz9RN1lHcN7HouA,16708 +flask_bootstrap/templates/bootstrap5/nav.html,sha256=_dD1Xdz-htSVUUnq00ViyhIvb0dSaksOOaOrcvWXfuM,30 +flask_bootstrap/templates/bootstrap5/pagination.html,sha256=O6egci_Ws5Zwl7IY1IuAigPBomcSV8Twau0XzSbxYV4,193 +flask_bootstrap/templates/bootstrap5/table.html,sha256=7e34x6aMlCCIAQNM31F4iBPyjmtUdxbY69TFsoqvQ0Y,32 +flask_bootstrap/templates/bootstrap5/utils.html,sha256=9GEZT_V5LWsdYO7vrjso2iuRcah5SHI7KaBNjKydyHw,1321 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/REQUESTED b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/WHEEL new file mode 100644 index 0000000..9d8f872 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.38.4) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/top_level.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/top_level.txt new file mode 100644 index 0000000..534fb44 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Bootstrap_Flask-2.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_bootstrap diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/LICENSE.rst b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/METADATA new file mode 100644 index 0000000..a99e52f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/METADATA @@ -0,0 +1,118 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 2.3.2 +Summary: A simple framework for building complex web applications. +Author-email: Armin Ronacher +Maintainer-email: Pallets +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: Werkzeug (>=2.3.3) +Requires-Dist: Jinja2 (>=3.1.2) +Requires-Dist: itsdangerous (>=2.1.2) +Requires-Dist: click (>=8.1.3) +Requires-Dist: blinker (>=1.6.2) +Requires-Dist: importlib-metadata (>=3.6.0) ; python_version < "3.10" +Provides-Extra: async +Requires-Dist: asgiref (>=3.2) ; extra == 'async' +Provides-Extra: dotenv +Requires-Dist: python-dotenv ; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Chat: https://discord.gg/pallets diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/RECORD new file mode 100644 index 0000000..329680d --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/RECORD @@ -0,0 +1,54 @@ +../../../bin/flask,sha256=2uFW_3Te3o5unpo2JrzRpF8Y2p9ejtUyWVi_p-mQCtc,308 +Flask-2.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-2.3.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask-2.3.2.dist-info/METADATA,sha256=o20FsyHfhQR8TMWB_QrtQN2PHyzacLRUAgol_quBBvA,3716 +Flask-2.3.2.dist-info/RECORD,, +Flask-2.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask-2.3.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 +Flask-2.3.2.dist-info/entry_points.txt,sha256=s3MqQpduU25y4dq3ftBYD6bMVdVnbMpZP-sUNw0zw0k,41 +Flask-2.3.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=yeirfdSGPoM3Ylc9FWWJfy2gEQlHfiZCKrxBiPefACM,3731 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-312.pyc,, +flask/__pycache__/__main__.cpython-312.pyc,, +flask/__pycache__/app.cpython-312.pyc,, +flask/__pycache__/blueprints.cpython-312.pyc,, +flask/__pycache__/cli.cpython-312.pyc,, +flask/__pycache__/config.cpython-312.pyc,, +flask/__pycache__/ctx.cpython-312.pyc,, +flask/__pycache__/debughelpers.cpython-312.pyc,, +flask/__pycache__/globals.cpython-312.pyc,, +flask/__pycache__/helpers.cpython-312.pyc,, +flask/__pycache__/logging.cpython-312.pyc,, +flask/__pycache__/scaffold.cpython-312.pyc,, +flask/__pycache__/sessions.cpython-312.pyc,, +flask/__pycache__/signals.cpython-312.pyc,, +flask/__pycache__/templating.cpython-312.pyc,, +flask/__pycache__/testing.cpython-312.pyc,, +flask/__pycache__/typing.cpython-312.pyc,, +flask/__pycache__/views.cpython-312.pyc,, +flask/__pycache__/wrappers.cpython-312.pyc,, +flask/app.py,sha256=ht3Qx9U9z0I1qUfLoS7bYhJcubdpk-i54eHq37LDlN8,87620 +flask/blueprints.py,sha256=ZpVrwa8UY-YnVDsX_1K10XQjDwCUp7Qn2hmKln5icEQ,24332 +flask/cli.py,sha256=wRxX61jRDKQM4iZsYaVwcgGbpN2_2DmntLMWjVeiAx4,33720 +flask/config.py,sha256=yqdiN7TLOs2EChJ0uhTz3SICA3-QBG6l5wHTIUnANpc,12800 +flask/ctx.py,sha256=x2kGzUXtPzVyi2YSKrU_PV1AvtxTmh2iRdriJRTSPGM,14841 +flask/debughelpers.py,sha256=BR0xkd-sAyFuFW07D6NfrqNwSZxk1IrkG5n8zem-3sw,5547 +flask/globals.py,sha256=KUzVvSPh8v28kUasVDi_aQKB9hI2jZSYQHqaDU2P414,2945 +flask/helpers.py,sha256=QDxFmBW9GGXQDLuXrcxQRL0Ldo-_q11zEt3ZVgfINlI,24957 +flask/json/__init__.py,sha256=pdtpoK2b0b1u7Sxbx3feM7VWhsI20l1yGAvbYWxaxvc,5572 +flask/json/__pycache__/__init__.cpython-312.pyc,, +flask/json/__pycache__/provider.cpython-312.pyc,, +flask/json/__pycache__/tag.cpython-312.pyc,, +flask/json/provider.py,sha256=Os0frb8oGfyWKL-TDxb0Uy-MY6gDhPdJkRaUl5xAOXI,7637 +flask/json/tag.py,sha256=ihb7QWrNEr0YC3KD4TolZbftgSPCuLk7FAvK49huYC0,8871 +flask/logging.py,sha256=lArx2Bq9oTtUJ-DnZL9t88xU2zytzp4UWSM9Bd72NDQ,2327 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/scaffold.py,sha256=0tYQN98sC93YkIEw9g8BiIwceFZ27tNqBtBtFhFy5tY,35231 +flask/sessions.py,sha256=rFH2QKXG24dEazkKGxAHqUpAUh_30hDHrddhVYgAcY0,14169 +flask/signals.py,sha256=s1H4yKjf3c5dgVr41V6sJpE9dLJvmTJMYuK0rkqx3sw,1146 +flask/templating.py,sha256=XdP2hMFnZ5FCZOG7HUaLjC2VC-b4uHSWlDjwv_1p3qc,7503 +flask/testing.py,sha256=52-m5GecDcA-F2dFEYe8eDwApusxdg6S1suBaSC85N0,9768 +flask/typing.py,sha256=4Lj-YTxUoYvPYofC9GKu-1o0Ht8lyjp9z3I336J13_o,3005 +flask/views.py,sha256=V5hOGZLx0Bn99QGcM6mh5x_uM-MypVT0-RysEFU84jc,6789 +flask/wrappers.py,sha256=PhMp3teK3SnEmIdog59cO_DHiZ9Btn0qI1EifrTdwP8,5709 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/REQUESTED b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/WHEEL new file mode 100644 index 0000000..1f37c02 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/entry_points.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/entry_points.txt new file mode 100644 index 0000000..137232d --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +flask = flask.cli:main diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/top_level.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/Flask-2.3.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA new file mode 100644 index 0000000..82261f2 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/METADATA @@ -0,0 +1,92 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 3.0.2 +Summary: Safely add untrusted strings to HTML/XML markup. +Maintainer-email: Pallets +License: Copyright 2010 Pallets + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source, https://github.com/pallets/markupsafe/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: LICENSE.txt + +# MarkupSafe + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +## Examples + +```pycon +>>> from markupsafe import Markup, escape + +>>> # escape replaces special characters and wraps in Markup +>>> escape("") +Markup('<script>alert(document.cookie);</script>') + +>>> # wrap in Markup to mark text "safe" and prevent escaping +>>> Markup("Hello") +Markup('hello') + +>>> escape(Markup("Hello")) +Markup('hello') + +>>> # Markup is a str subclass +>>> # methods and operators escape their arguments +>>> template = Markup("Hello {name}") +>>> template.format(name='"World"') +Markup('Hello "World"') +``` + +## Donate + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD new file mode 100644 index 0000000..b7ba0b7 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/RECORD @@ -0,0 +1,14 @@ +MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-3.0.2.dist-info/METADATA,sha256=aAwbZhSmXdfFuMM-rEHpeiHRkBOGESyVLJIuwzHP-nw,3975 +MarkupSafe-3.0.2.dist-info/RECORD,, +MarkupSafe-3.0.2.dist-info/WHEEL,sha256=OVgtqZzfzIXXtylXP90gxCZ6CKBCwKYyHM8PpMEjN1M,151 +MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214 +markupsafe/__pycache__/__init__.cpython-312.pyc,, +markupsafe/__pycache__/_native.cpython-312.pyc,, +markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 +markupsafe/_speedups.c,sha256=O7XulmTo-epI6n2FtMVOrJXl8EAaIwD2iNYmBI5SEoQ,4149 +markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so,sha256=t1DBZlpsjFA30BOOvXfXfT1wvO_4cS16VbHz1-49q5U,43432 +markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL new file mode 100644 index 0000000..057fef6 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/LICENSE.rst b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/LICENSE.rst new file mode 100644 index 0000000..30cbc2b --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2008 WTForms + +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/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/METADATA new file mode 100644 index 0000000..0a5cdb4 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/METADATA @@ -0,0 +1,88 @@ +Metadata-Version: 2.1 +Name: WTForms +Version: 3.0.1 +Summary: Form validation and rendering for Python web development. +Home-page: https://wtforms.readthedocs.io/ +Maintainer: WTForms +Maintainer-email: davidism@gmail.com +License: BSD-3-Clause +Project-URL: Documentation, https://wtforms.readthedocs.io/ +Project-URL: Code, https://github.com/wtforms/wtforms +Project-URL: Issue Tracker, https://github.com/wtforms/wtforms/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe +Provides-Extra: email +Requires-Dist: email-validator ; extra == 'email' + +WTForms +======= + +WTForms is a flexible forms validation and rendering library for Python +web development. It can work with whatever web framework and template +engine you choose. It supports data validation, CSRF protection, +internationalization (I18N), and more. There are various community +libraries that provide closer integration with popular frameworks. + + +Installation +------------ + +Install and update using pip: + +.. code-block:: text + + pip install -U WTForms + + +Third-Party Library Integrations +-------------------------------- + +WTForms is designed to work with any web framework and template engine. +There are a number of community-provided libraries that make integrating +with frameworks even better. + +- `Flask-WTF`_ integrates with the Flask framework. It can + automatically load data from the request, uses Flask-Babel to + translate based on user-selected locale, provides full-application + CSRF, and more. +- `WTForms-Alchemy`_ provides rich support for generating forms from + SQLAlchemy models, including an expanded set of fields and + validators. +- `WTForms-SQLAlchemy`_ provides ORM-backed fields and form generation + from SQLAlchemy models. +- `WTForms-AppEngine`_ provides ORM-backed fields and form generation + from AppEnding db/ndb schema +- `WTForms-Django`_ provides ORM-backed fields and form generation + from Django models, as well as integration with Django's I18N + support. +- `Starlette-WTF`_ integrates with Starlette and the FastAPI + framework, based on the features of Flask-WTF. + +.. _Flask-WTF: https://flask-wtf.readthedocs.io/ +.. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/ +.. _WTForms-SQLAlchemy: https://github.com/wtforms/wtforms-sqlalchemy +.. _WTForms-AppEngine: https://github.com/wtforms/wtforms-appengine +.. _WTForms-Django: https://github.com/wtforms/wtforms-django +.. _Starlette-WTF: https://github.com/muicss/starlette-wtf + + +Links +----- + +- Documentation: https://wtforms.readthedocs.io/ +- Releases: https://pypi.org/project/WTForms/ +- Code: https://github.com/wtforms/wtforms +- Issue tracker: https://github.com/wtforms/wtforms/issues +- Discord Chat: https://discord.gg/F65P7Z9 + + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/RECORD new file mode 100644 index 0000000..bb71e7c --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/RECORD @@ -0,0 +1,107 @@ +WTForms-3.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +WTForms-3.0.1.dist-info/LICENSE.rst,sha256=z0DWD_NPaytopT0iD4tmVntayN0RGbN7Yv0V6VGP5Zs,1475 +WTForms-3.0.1.dist-info/METADATA,sha256=2ZMOu_TyFipA9yv2MXu8l4nbqOHnhgH3HCfc1sV6xC8,3156 +WTForms-3.0.1.dist-info/RECORD,, +WTForms-3.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +WTForms-3.0.1.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +WTForms-3.0.1.dist-info/top_level.txt,sha256=k5K62RAEkLEN23p118t3tRgvL6I_k56NiIU7Hk8Phv8,8 +wtforms/__init__.py,sha256=u1wrq_KsqFRKop4Jz2U8VZnKNgbgH108PSmWvG3f25k,188 +wtforms/__pycache__/__init__.cpython-312.pyc,, +wtforms/__pycache__/form.cpython-312.pyc,, +wtforms/__pycache__/i18n.cpython-312.pyc,, +wtforms/__pycache__/meta.cpython-312.pyc,, +wtforms/__pycache__/utils.cpython-312.pyc,, +wtforms/__pycache__/validators.cpython-312.pyc,, +wtforms/csrf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wtforms/csrf/__pycache__/__init__.cpython-312.pyc,, +wtforms/csrf/__pycache__/core.cpython-312.pyc,, +wtforms/csrf/__pycache__/session.cpython-312.pyc,, +wtforms/csrf/core.py,sha256=8Ka3ZATvo9I1WqreP1Y_i1r0t7m8Wcw5cKynVvJNXes,3097 +wtforms/csrf/session.py,sha256=d-roaNYuBxN2QACwkz1_UIuAdtYyTzJTmcJ3UPe1jks,3091 +wtforms/fields/__init__.py,sha256=Peqt-1SMp4e83FGdjd_imearbY8CYMBHquUC4AHgpkg,435 +wtforms/fields/__pycache__/__init__.cpython-312.pyc,, +wtforms/fields/__pycache__/choices.cpython-312.pyc,, +wtforms/fields/__pycache__/core.cpython-312.pyc,, +wtforms/fields/__pycache__/datetime.cpython-312.pyc,, +wtforms/fields/__pycache__/form.cpython-312.pyc,, +wtforms/fields/__pycache__/list.cpython-312.pyc,, +wtforms/fields/__pycache__/numeric.cpython-312.pyc,, +wtforms/fields/__pycache__/simple.cpython-312.pyc,, +wtforms/fields/choices.py,sha256=8bKBFg1JLTZG5Uytf8aS3DpceQvyEoDnQENJEUJgqbE,6387 +wtforms/fields/core.py,sha256=4sSjD35Hev5DmRbU22zoWGHgyrOvg7WbB9uNGc_cYZ8,14552 +wtforms/fields/datetime.py,sha256=lCDG_ynV0P9ae5o6m4rzuGl0xxecsTPhT1dkgUEiKcg,3709 +wtforms/fields/form.py,sha256=KsEX4NTQsr3nwULTC2gxbDvC5PQWoLdMdFwsm-l6rW4,2896 +wtforms/fields/list.py,sha256=htcVonFLsQfo3iibZyvoCBIq9mOr_GHe-85aU3TeflU,6470 +wtforms/fields/numeric.py,sha256=fPnhuzRq52YeRTPqD2IpaDUoONwdRwoNqQHC_IAWrf0,6096 +wtforms/fields/simple.py,sha256=GP6oaDMzhHr2Xj2p35julnkQ0uk-ah3ksf-nhIbQtLI,3929 +wtforms/form.py,sha256=CsRwZKHup6H4yfBzVlJJqf7PdMy1KTQRrn9BL9kTtqs,12571 +wtforms/i18n.py,sha256=8AMTTSpQ5d-hONeVN8rt3RH0gRc3Mvl4zUum8Hyif88,1958 +wtforms/locale/README.md,sha256=nLAfg-CR03vxtvB_sCU2c31TzmPYKBnisuAOJX7B1DQ,1124 +wtforms/locale/ar/LC_MESSAGES/wtforms.mo,sha256=zP7lPdeEdoxr-phLLSF_B7qAyO9Qi3o8X8sKin_yTE4,4551 +wtforms/locale/ar/LC_MESSAGES/wtforms.po,sha256=gLaJsy0BpVYqkmeYFQIKno-b0lo18IbFmha4c6upxoA,5853 +wtforms/locale/bg/LC_MESSAGES/wtforms.mo,sha256=OT-t0CSpBiCj89bTqt8vLQeGyHTlDcnnNT-R5INFU-o,4080 +wtforms/locale/bg/LC_MESSAGES/wtforms.po,sha256=I7DktNgy6xKOt94RFlAdr8cESo3egppilw6juH9HMgo,5815 +wtforms/locale/ca/LC_MESSAGES/wtforms.mo,sha256=x4iIe79yjSHSFoH4vKoYzlUJdgv1wUMbqzmI-Bn39FA,3314 +wtforms/locale/ca/LC_MESSAGES/wtforms.po,sha256=kiWRyNd3QSWJJERKwmAqA_auviAhBGm6CE_Fc-SapHE,5030 +wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo,sha256=luz58W1AUXMT4GSw7L5RTZLWZfpUeuR51GxOJaBKpUM,3518 +wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po,sha256=RPgJZt8rG-03RhSkvioH1q_bQOMcq7vS_-nteRHTmTk,5138 +wtforms/locale/cy/LC_MESSAGES/wtforms.mo,sha256=4KbUdETDw9u1XbYlSXQ7YjxyAOADE1nKUgYn7rOKqWw,3276 +wtforms/locale/cy/LC_MESSAGES/wtforms.po,sha256=0nxfVYPye3e4eqaEQo-Ns21WvzHMjfJvlYzeJBcuNCI,4996 +wtforms/locale/de/LC_MESSAGES/wtforms.mo,sha256=Axga1WgtQhZhhhVHxjFTmHpjStIt414ol98IznsmrLo,3295 +wtforms/locale/de/LC_MESSAGES/wtforms.po,sha256=OcK2gP1gp-dH5uzhkRmUGfvEaZ9mxgVQ8d35Cduk7JU,5016 +wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo,sha256=U8JgLOCp7E1tGhguhw2Azdh_X64OJRO8CXdDsIk2kd8,3289 +wtforms/locale/de_CH/LC_MESSAGES/wtforms.po,sha256=fI_mJrEPaaM6DymYOLiaxMJUB_0hQEHw_-2GPfZxJqA,5024 +wtforms/locale/el/LC_MESSAGES/wtforms.mo,sha256=k9AQ2Hl4nQMZIRDSG9KwNealxkXUdn8A86FBcz-7woM,4120 +wtforms/locale/el/LC_MESSAGES/wtforms.po,sha256=SAK3VrouHVAQRjyGaQJZrMgHIs-Fp0b_0mut5AucoeE,5834 +wtforms/locale/en/LC_MESSAGES/wtforms.mo,sha256=FMUpXXZwc5LKHv9cxwLhRRkYmXwlwIk_CBsLhsk6jGM,3321 +wtforms/locale/en/LC_MESSAGES/wtforms.po,sha256=Yn7Pb4rFmGxwp3emJW_aAqCBBZZw-E-JTGClfL78DY8,5046 +wtforms/locale/es/LC_MESSAGES/wtforms.mo,sha256=eSguaFLnIUiOdwgnYaibqDjvZWNW_sN1exWU9GpNQPI,3151 +wtforms/locale/es/LC_MESSAGES/wtforms.po,sha256=aC22ipSFKvQp5jQsks77AZ71yvdik8wKWXPQOJjG7Ck,4959 +wtforms/locale/et/LC_MESSAGES/wtforms.mo,sha256=fmRgAIMgNwrkv9OyxkDW6lwnl73sAgGaKFXpuRZZ6tY,3331 +wtforms/locale/et/LC_MESSAGES/wtforms.po,sha256=qlOBNQaY_86qbwm4SpzTFE8o4GIswQhGy0cOMWUyoRQ,5048 +wtforms/locale/fa/LC_MESSAGES/wtforms.mo,sha256=hnlvsHuX0p9f_oj3qAb-UPtCAso8F17oSNs3pnPjBts,3933 +wtforms/locale/fa/LC_MESSAGES/wtforms.po,sha256=HV6mUzdGwu7vu1Hs0KvttD7q9rc1CBtVMguCQEc0hGQ,5645 +wtforms/locale/fi/LC_MESSAGES/wtforms.mo,sha256=bXn4NeHM9onLtZryB6dvD82ZsmZ2lOLomlub7H3ZFQY,3287 +wtforms/locale/fi/LC_MESSAGES/wtforms.po,sha256=2oUu945K8kUvKq6cBCDNiPnk_4dRFZBZmomlKtNb68A,5003 +wtforms/locale/fr/LC_MESSAGES/wtforms.mo,sha256=hoiGEBeNi1NPuZYlKMhziHGiT7OVNF2bBzpPHGkKKXk,3548 +wtforms/locale/fr/LC_MESSAGES/wtforms.po,sha256=8SCprXPHHbVqKP_u5FFU-LaZvb-3pi2nflhOZlPyf0s,5374 +wtforms/locale/he/LC_MESSAGES/wtforms.mo,sha256=6wX6RvmUqFfMRzIP8-sNtJtnNFVwMBIWxGULRjGbgu0,3412 +wtforms/locale/he/LC_MESSAGES/wtforms.po,sha256=7J6a9S2cTrYnAOaZtImcXqQcRSrFQnmwC8tNanIRYHY,5179 +wtforms/locale/hu/LC_MESSAGES/wtforms.mo,sha256=W7QMHq0XCA17hG19YNnpTzYJzs2nBnj3a9EWDOXzPoM,3409 +wtforms/locale/hu/LC_MESSAGES/wtforms.po,sha256=Yv7hnAfJyIl6buVLIa8yi7QU7xBllzn5XmLGBEWQAhA,5033 +wtforms/locale/it/LC_MESSAGES/wtforms.mo,sha256=cGjU2HIXHLP6-JGXwWdhopTzpJuk4egkRTOOJOI0t2Y,3382 +wtforms/locale/it/LC_MESSAGES/wtforms.po,sha256=fu90GAVHdJYrhzpqf4E0MD3nXAcVCVaaX-7_lgJtb4k,5104 +wtforms/locale/ja/LC_MESSAGES/wtforms.mo,sha256=0Z4MS0VR2Qsz0ehToM8TSaYvb9quhApCqLU8fHOaxEg,3633 +wtforms/locale/ja/LC_MESSAGES/wtforms.po,sha256=fA1OdUbMgviHb8Pu9spTJ9s8QQWfoWmdFmYn230h-5Q,5319 +wtforms/locale/ko/LC_MESSAGES/wtforms.mo,sha256=wtdttiggtN1d1MO7SmKxOScsTogwUbYfhsuFK4-ssXc,3647 +wtforms/locale/ko/LC_MESSAGES/wtforms.po,sha256=pL0S6T2CyVgaGcVWaG0sDK7EYB6QqGX8YorbM12NDmE,5372 +wtforms/locale/nb/LC_MESSAGES/wtforms.mo,sha256=AVcRr1_s4qC_5wk5nyk103Z9Bp74waR9kqB3BwuL1Ac,3211 +wtforms/locale/nb/LC_MESSAGES/wtforms.po,sha256=95QSZchtnJ-OUvtr0bXM8u6A_O7hV9bqVjvFM0NsTmU,4937 +wtforms/locale/nl/LC_MESSAGES/wtforms.mo,sha256=E9pntd-uqy_Rw1GTPE9dUKRAzyTgGcrrpKdX3K8jlsc,3224 +wtforms/locale/nl/LC_MESSAGES/wtforms.po,sha256=SCDFClD9BGgJhJcJrsudyq_XnroGs8E6cT0XV0PYEk0,4938 +wtforms/locale/pl/LC_MESSAGES/wtforms.mo,sha256=aD3GLBPalbsrk9e37ebgaUZGuxm1qNQglPdLdvqCRrY,3551 +wtforms/locale/pl/LC_MESSAGES/wtforms.po,sha256=QoidDHH2xX1bMCG9a4NNOF9v5cZkQhpNl2Ml9V2RG-4,5259 +wtforms/locale/pt/LC_MESSAGES/wtforms.mo,sha256=uljUJcn7oHTdbnbh3bBfBLJ78Y9cQMA0cfdAbQCp0oQ,3327 +wtforms/locale/pt/LC_MESSAGES/wtforms.po,sha256=lYoe5_sHhmrjU5qkyTrsKeUK68EMHjU1LEvxOVvy38E,5046 +wtforms/locale/ru/LC_MESSAGES/wtforms.mo,sha256=OJCHyWqyF24oEbx9xii7xQAG_qHIL8jp1wyZm4akYUE,4556 +wtforms/locale/ru/LC_MESSAGES/wtforms.po,sha256=wcqNSIH2tMsa-eXElSNjzUBtbePC9vqny96zMqJf3tU,6326 +wtforms/locale/sk/LC_MESSAGES/wtforms.mo,sha256=NTZwNcD-JZMeMTNXKvpaV7YMdkjJtWijuovdBTlAVXU,3376 +wtforms/locale/sk/LC_MESSAGES/wtforms.po,sha256=xsBvRagw6ugxNCXc0FfnUp8T18Y_E-n7jJVi2g3G9lM,5125 +wtforms/locale/sv/LC_MESSAGES/wtforms.mo,sha256=dlLYzem2A8SSQB1IDRe7aYf8BiqdJo-N0gyPogVHMr4,3272 +wtforms/locale/sv/LC_MESSAGES/wtforms.po,sha256=uZ8o1GyCty5e57qeqKM4fEMrhKowJ7-TJaKwaf9UepI,4988 +wtforms/locale/tr/LC_MESSAGES/wtforms.mo,sha256=sozmbS29uddWsIXfmH4fOoW231l3tFp8jMjwM1iIF7c,3261 +wtforms/locale/tr/LC_MESSAGES/wtforms.po,sha256=gVaKY1yLTpviYqD0rkiYYdBJE9wk0l75_k2W3lJtCU4,4977 +wtforms/locale/uk/LC_MESSAGES/wtforms.mo,sha256=uQOgUQH0DMYHtCO0vUE4EmRTTZIb0ZDhrIDeSUw0Mss,4404 +wtforms/locale/uk/LC_MESSAGES/wtforms.po,sha256=tY8UgyoELky1dI2vyRtQQEERiflnJ4ZOBIDKSDKLBfY,6074 +wtforms/locale/wtforms.pot,sha256=MY1ym6Rf2ierh-bpE-JXK_g4PffJTwMx0exJdBHBXWw,3840 +wtforms/locale/zh/LC_MESSAGES/wtforms.mo,sha256=ueO6eXWFvjux9syVtyABt9pv8nsScFsI66np2VhhCpw,3413 +wtforms/locale/zh/LC_MESSAGES/wtforms.po,sha256=hocVeIcX1llKjQcsaPIPzd_UvRmEFpd33KVRPMfUj2U,5138 +wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo,sha256=AjQ4UHfdqt6rTF_3Q_0qpZjeftEKnZ_5n8I4W8Z_6sg,3219 +wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po,sha256=EfJgTBvRT0OTnCvkLZEcxjaG-LtVKm4If8KMdftJfcY,4930 +wtforms/meta.py,sha256=SU8A6gDcd2wDkVzNmSGMLBBly_fMBTKVB7BD6GCfxYo,4097 +wtforms/utils.py,sha256=Z_Tofq8IfbJm2yAx30Tr2DVeFQ2bvDfz-rBhVuMOWqo,2311 +wtforms/validators.py,sha256=jKuyOk6rONdFphhH_ORyd7m18LTS2TdmlqJJWjCauEM,20544 +wtforms/widgets/__init__.py,sha256=4UXr1cMvil5x9zQp4dlXpo52mEQHeSKKRfmiXyS-u5Y,119 +wtforms/widgets/__pycache__/__init__.cpython-312.pyc,, +wtforms/widgets/__pycache__/core.cpython-312.pyc,, +wtforms/widgets/core.py,sha256=l71Zewkcw1oiMGNveSgUGx9gbivZgEniJ-IdKclwnwU,14280 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/REQUESTED b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/WHEEL new file mode 100644 index 0000000..5bad85f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.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/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/top_level.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..26d80fd --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/WTForms-3.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +wtforms diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..79c9825 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright 2010 Jason Kirtland + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA new file mode 100644 index 0000000..6d343f5 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.3 +Name: blinker +Version: 1.9.0 +Summary: Fast, simple object-to-object and broadcast signaling +Author: Jason Kirtland +Maintainer-email: Pallets Ecosystem +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://blinker.readthedocs.io +Project-URL: Source, https://github.com/pallets-eco/blinker/ + +# Blinker + +Blinker provides a fast dispatching system that allows any number of +interested parties to subscribe to events, or "signals". + + +## Pallets Community Ecosystem + +> [!IMPORTANT]\ +> This project is part of the Pallets Community Ecosystem. Pallets is the open +> source organization that maintains Flask; Pallets-Eco enables community +> maintenance of related projects. If you are interested in helping maintain +> this project, please reach out on [the Pallets Discord server][discord]. +> +> [discord]: https://discord.gg/pallets + + +## Example + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + +```pycon +>>> from blinker import signal +>>> started = signal('round-started') +>>> def each(round): +... print(f"Round {round}") +... +>>> started.connect(each) + +>>> def round_two(round): +... print("This is round two.") +... +>>> started.connect(round_two, sender=2) + +>>> for round in range(1, 4): +... started.send(round) +... +Round 1! +Round 2! +This is round two. +Round 3! +``` + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD new file mode 100644 index 0000000..7cfb714 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD @@ -0,0 +1,12 @@ +blinker-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.9.0.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 +blinker-1.9.0.dist-info/METADATA,sha256=uIRiM8wjjbHkCtbCyTvctU37IAZk0kEe5kxAld1dvzA,1633 +blinker-1.9.0.dist-info/RECORD,, +blinker-1.9.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +blinker/__init__.py,sha256=I2EdZqpy4LyjX17Hn1yzJGWCjeLaVaPzsMgHkLfj_cQ,317 +blinker/__pycache__/__init__.cpython-312.pyc,, +blinker/__pycache__/_utilities.cpython-312.pyc,, +blinker/__pycache__/base.cpython-312.pyc,, +blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 +blinker/base.py,sha256=QpDuvXXcwJF49lUBcH5BiST46Rz9wSG7VW_p7N_027M,19132 +blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL new file mode 100644 index 0000000..e3c6fee --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker-1.9.0.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/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__init__.py new file mode 100644 index 0000000..1772fa4 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__init__.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from .base import ANY +from .base import default_namespace +from .base import NamedSignal +from .base import Namespace +from .base import Signal +from .base import signal + +__all__ = [ + "ANY", + "default_namespace", + "NamedSignal", + "Namespace", + "Signal", + "signal", +] diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..370cce05217f826fa2a18c491a7065e5487e59f6 GIT binary patch literal 527 zcmaKoF>4z!6vv-@=ex5_2pIx}QgEBegQKKflR#-_HxMZF7DbL^TZv9GlFr~UpQ3xW zevPjE28LS_I%F%!mZ?t{(lHP5*Y7>OCq2F2TU&iVyV?G=I3@tM(RsGc6Oe~z0=Xy)0&@_(AEfN9`=h~K zd~QTG18$5BJSc1Y9rhGs$;Zhz+;)VV@mdFFcqRRkU&xq0K}Vdax#1e!UUZ+&vj5@C zKP6WsGVfYB^cYJQ|{%qFaYYxl zlC-i5UU5O4Tv|^L4-Uqk`Pz@a%*LOrko2qaHP^$lPzz;;F*H1N_EKI1Pgl~cs8&meEu!U--Hm- dz`H-N+rVA}ZyI>rz$;w$X+G#&=WZLb{sBjBhm`;T literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/__pycache__/_utilities.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74e2dbe040633fa011d331f7ef8a6180bc1783d9 GIT binary patch literal 2754 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�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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/_utilities.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/_utilities.py new file mode 100644 index 0000000..000c902 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/_utilities.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import collections.abc as c +import inspect +import typing as t +from weakref import ref +from weakref import WeakMethod + +T = t.TypeVar("T") + + +class Symbol: + """A constant symbol, nicer than ``object()``. Repeated calls return the + same instance. + + >>> Symbol('foo') is Symbol('foo') + True + >>> Symbol('foo') + foo + """ + + symbols: t.ClassVar[dict[str, Symbol]] = {} + + def __new__(cls, name: str) -> Symbol: + if name in cls.symbols: + return cls.symbols[name] + + obj = super().__new__(cls) + cls.symbols[name] = obj + return obj + + def __init__(self, name: str) -> None: + self.name = name + + def __repr__(self) -> str: + return self.name + + def __getnewargs__(self) -> tuple[t.Any, ...]: + return (self.name,) + + +def make_id(obj: object) -> c.Hashable: + """Get a stable identifier for a receiver or sender, to be used as a dict + key or in a set. + """ + if inspect.ismethod(obj): + # The id of a bound method is not stable, but the id of the unbound + # function and instance are. + return id(obj.__func__), id(obj.__self__) + + if isinstance(obj, (str, int)): + # Instances with the same value always compare equal and have the same + # hash, even if the id may change. + return obj + + # Assume other types are not hashable but will always be the same instance. + return id(obj) + + +def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]: + if inspect.ismethod(obj): + return WeakMethod(obj, callback) # type: ignore[arg-type, return-value] + + return ref(obj, callback) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/base.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/base.py new file mode 100644 index 0000000..d051b94 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/base.py @@ -0,0 +1,512 @@ +from __future__ import annotations + +import collections.abc as c +import sys +import typing as t +import weakref +from collections import defaultdict +from contextlib import contextmanager +from functools import cached_property +from inspect import iscoroutinefunction + +from ._utilities import make_id +from ._utilities import make_ref +from ._utilities import Symbol + +F = t.TypeVar("F", bound=c.Callable[..., t.Any]) + +ANY = Symbol("ANY") +"""Symbol for "any sender".""" + +ANY_ID = 0 + + +class Signal: + """A notification emitter. + + :param doc: The docstring for the signal. + """ + + ANY = ANY + """An alias for the :data:`~blinker.ANY` sender symbol.""" + + set_class: type[set[t.Any]] = set + """The set class to use for tracking connected receivers and senders. + Python's ``set`` is unordered. If receivers must be dispatched in the order + they were connected, an ordered set implementation can be used. + + .. versionadded:: 1.7 + """ + + @cached_property + def receiver_connected(self) -> Signal: + """Emitted at the end of each :meth:`connect` call. + + The signal sender is the signal instance, and the :meth:`connect` + arguments are passed through: ``receiver``, ``sender``, and ``weak``. + + .. versionadded:: 1.2 + """ + return Signal(doc="Emitted after a receiver connects.") + + @cached_property + def receiver_disconnected(self) -> Signal: + """Emitted at the end of each :meth:`disconnect` call. + + The sender is the signal instance, and the :meth:`disconnect` arguments + are passed through: ``receiver`` and ``sender``. + + This signal is emitted **only** when :meth:`disconnect` is called + explicitly. This signal cannot be emitted by an automatic disconnect + when a weakly referenced receiver or sender goes out of scope, as the + instance is no longer be available to be used as the sender for this + signal. + + An alternative approach is available by subscribing to + :attr:`receiver_connected` and setting up a custom weakref cleanup + callback on weak receivers and senders. + + .. versionadded:: 1.2 + """ + return Signal(doc="Emitted after a receiver disconnects.") + + def __init__(self, doc: str | None = None) -> None: + if doc: + self.__doc__ = doc + + self.receivers: dict[ + t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any] + ] = {} + """The map of connected receivers. Useful to quickly check if any + receivers are connected to the signal: ``if s.receivers:``. The + structure and data is not part of the public API, but checking its + boolean value is. + """ + + self.is_muted: bool = False + self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) + self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) + self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {} + + def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F: + """Connect ``receiver`` to be called when the signal is sent by + ``sender``. + + :param receiver: The callable to call when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument + along with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. A receiver may be connected + to multiple senders by calling :meth:`connect` multiple times. + :param weak: Track the receiver with a :mod:`weakref`. The receiver will + be automatically disconnected when it is garbage collected. When + connecting a receiver defined within a function, set to ``False``, + otherwise it will be disconnected when the function scope ends. + """ + receiver_id = make_id(receiver) + sender_id = ANY_ID if sender is ANY else make_id(sender) + + if weak: + self.receivers[receiver_id] = make_ref( + receiver, self._make_cleanup_receiver(receiver_id) + ) + else: + self.receivers[receiver_id] = receiver + + self._by_sender[sender_id].add(receiver_id) + self._by_receiver[receiver_id].add(sender_id) + + if sender is not ANY and sender_id not in self._weak_senders: + # store a cleanup for weakref-able senders + try: + self._weak_senders[sender_id] = make_ref( + sender, self._make_cleanup_sender(sender_id) + ) + except TypeError: + pass + + if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: + try: + self.receiver_connected.send( + self, receiver=receiver, sender=sender, weak=weak + ) + except TypeError: + # TODO no explanation or test for this + self.disconnect(receiver, sender) + raise + + return receiver + + def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]: + """Connect the decorated function to be called when the signal is sent + by ``sender``. + + The decorated function will be called when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument along + with any extra keyword arguments. + + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. A receiver may be connected + to multiple senders by calling :meth:`connect` multiple times. + :param weak: Track the receiver with a :mod:`weakref`. The receiver will + be automatically disconnected when it is garbage collected. When + connecting a receiver defined within a function, set to ``False``, + otherwise it will be disconnected when the function scope ends.= + + .. versionadded:: 1.1 + """ + + def decorator(fn: F) -> F: + self.connect(fn, sender, weak) + return fn + + return decorator + + @contextmanager + def connected_to( + self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY + ) -> c.Generator[None, None, None]: + """A context manager that temporarily connects ``receiver`` to the + signal while a ``with`` block executes. When the block exits, the + receiver is disconnected. Useful for tests. + + :param receiver: The callable to call when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument + along with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. + + .. versionadded:: 1.1 + """ + self.connect(receiver, sender=sender, weak=False) + + try: + yield None + finally: + self.disconnect(receiver) + + @contextmanager + def muted(self) -> c.Generator[None, None, None]: + """A context manager that temporarily disables the signal. No receivers + will be called if the signal is sent, until the ``with`` block exits. + Useful for tests. + """ + self.is_muted = True + + try: + yield None + finally: + self.is_muted = False + + def send( + self, + sender: t.Any | None = None, + /, + *, + _async_wrapper: c.Callable[ + [c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any] + ] + | None = None, + **kwargs: t.Any, + ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: + """Call all receivers that are connected to the given ``sender`` + or :data:`ANY`. Each receiver is called with ``sender`` as a positional + argument along with any extra keyword arguments. Return a list of + ``(receiver, return value)`` tuples. + + The order receivers are called is undefined, but can be influenced by + setting :attr:`set_class`. + + If a receiver raises an exception, that exception will propagate up. + This makes debugging straightforward, with an assumption that correctly + implemented receivers will not raise. + + :param sender: Call receivers connected to this sender, in addition to + those connected to :data:`ANY`. + :param _async_wrapper: Will be called on any receivers that are async + coroutines to turn them into sync callables. For example, could run + the receiver with an event loop. + :param kwargs: Extra keyword arguments to pass to each receiver. + + .. versionchanged:: 1.7 + Added the ``_async_wrapper`` argument. + """ + if self.is_muted: + return [] + + results = [] + + for receiver in self.receivers_for(sender): + if iscoroutinefunction(receiver): + if _async_wrapper is None: + raise RuntimeError("Cannot send to a coroutine function.") + + result = _async_wrapper(receiver)(sender, **kwargs) + else: + result = receiver(sender, **kwargs) + + results.append((receiver, result)) + + return results + + async def send_async( + self, + sender: t.Any | None = None, + /, + *, + _sync_wrapper: c.Callable[ + [c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]] + ] + | None = None, + **kwargs: t.Any, + ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: + """Await all receivers that are connected to the given ``sender`` + or :data:`ANY`. Each receiver is called with ``sender`` as a positional + argument along with any extra keyword arguments. Return a list of + ``(receiver, return value)`` tuples. + + The order receivers are called is undefined, but can be influenced by + setting :attr:`set_class`. + + If a receiver raises an exception, that exception will propagate up. + This makes debugging straightforward, with an assumption that correctly + implemented receivers will not raise. + + :param sender: Call receivers connected to this sender, in addition to + those connected to :data:`ANY`. + :param _sync_wrapper: Will be called on any receivers that are sync + callables to turn them into async coroutines. For example, + could call the receiver in a thread. + :param kwargs: Extra keyword arguments to pass to each receiver. + + .. versionadded:: 1.7 + """ + if self.is_muted: + return [] + + results = [] + + for receiver in self.receivers_for(sender): + if not iscoroutinefunction(receiver): + if _sync_wrapper is None: + raise RuntimeError("Cannot send to a non-coroutine function.") + + result = await _sync_wrapper(receiver)(sender, **kwargs) + else: + result = await receiver(sender, **kwargs) + + results.append((receiver, result)) + + return results + + def has_receivers_for(self, sender: t.Any) -> bool: + """Check if there is at least one receiver that will be called with the + given ``sender``. A receiver connected to :data:`ANY` will always be + called, regardless of sender. Does not check if weakly referenced + receivers are still live. See :meth:`receivers_for` for a stronger + search. + + :param sender: Check for receivers connected to this sender, in addition + to those connected to :data:`ANY`. + """ + if not self.receivers: + return False + + if self._by_sender[ANY_ID]: + return True + + if sender is ANY: + return False + + return make_id(sender) in self._by_sender + + def receivers_for( + self, sender: t.Any + ) -> c.Generator[c.Callable[..., t.Any], None, None]: + """Yield each receiver to be called for ``sender``, in addition to those + to be called for :data:`ANY`. Weakly referenced receivers that are not + live will be disconnected and skipped. + + :param sender: Yield receivers connected to this sender, in addition + to those connected to :data:`ANY`. + """ + # TODO: test receivers_for(ANY) + if not self.receivers: + return + + sender_id = make_id(sender) + + if sender_id in self._by_sender: + ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] + else: + ids = self._by_sender[ANY_ID].copy() + + for receiver_id in ids: + receiver = self.receivers.get(receiver_id) + + if receiver is None: + continue + + if isinstance(receiver, weakref.ref): + strong = receiver() + + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue + + yield strong + else: + yield receiver + + def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None: + """Disconnect ``receiver`` from being called when the signal is sent by + ``sender``. + + :param receiver: A connected receiver callable. + :param sender: Disconnect from only this sender. By default, disconnect + from all senders. + """ + sender_id: c.Hashable + + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = make_id(sender) + + receiver_id = make_id(receiver) + self._disconnect(receiver_id, sender_id) + + if ( + "receiver_disconnected" in self.__dict__ + and self.receiver_disconnected.receivers + ): + self.receiver_disconnected.send(self, receiver=receiver, sender=sender) + + def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None: + if sender_id == ANY_ID: + if self._by_receiver.pop(receiver_id, None) is not None: + for bucket in self._by_sender.values(): + bucket.discard(receiver_id) + + self.receivers.pop(receiver_id, None) + else: + self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) + + def _make_cleanup_receiver( + self, receiver_id: c.Hashable + ) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]: + """Create a callback function to disconnect a weakly referenced + receiver when it is garbage collected. + """ + + def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None: + # If the interpreter is shutting down, disconnecting can result in a + # weird ignored exception. Don't call it in that case. + if not sys.is_finalizing(): + self._disconnect(receiver_id, ANY_ID) + + return cleanup + + def _make_cleanup_sender( + self, sender_id: c.Hashable + ) -> c.Callable[[weakref.ref[t.Any]], None]: + """Create a callback function to disconnect all receivers for a weakly + referenced sender when it is garbage collected. + """ + assert sender_id != ANY_ID + + def cleanup(ref: weakref.ref[t.Any]) -> None: + self._weak_senders.pop(sender_id, None) + + for receiver_id in self._by_sender.pop(sender_id, ()): + self._by_receiver[receiver_id].discard(sender_id) + + return cleanup + + def _cleanup_bookkeeping(self) -> None: + """Prune unused sender/receiver bookkeeping. Not threadsafe. + + Connecting & disconnecting leaves behind a small amount of bookkeeping + data. Typical workloads using Blinker, for example in most web apps, + Flask, CLI scripts, etc., are not adversely affected by this + bookkeeping. + + With a long-running process performing dynamic signal routing with high + volume, e.g. connecting to function closures, senders are all unique + object instances. Doing all of this over and over may cause memory usage + to grow due to extraneous bookkeeping. (An empty ``set`` for each stale + sender/receiver pair.) + + This method will prune that bookkeeping away, with the caveat that such + pruning is not threadsafe. The risk is that cleanup of a fully + disconnected receiver/sender pair occurs while another thread is + connecting that same pair. If you are in the highly dynamic, unique + receiver/sender situation that has lead you to this method, that failure + mode is perhaps not a big deal for you. + """ + for mapping in (self._by_sender, self._by_receiver): + for ident, bucket in list(mapping.items()): + if not bucket: + mapping.pop(ident, None) + + def _clear_state(self) -> None: + """Disconnect all receivers and senders. Useful for tests.""" + self._weak_senders.clear() + self.receivers.clear() + self._by_sender.clear() + self._by_receiver.clear() + + +class NamedSignal(Signal): + """A named generic notification emitter. The name is not used by the signal + itself, but matches the key in the :class:`Namespace` that it belongs to. + + :param name: The name of the signal within the namespace. + :param doc: The docstring for the signal. + """ + + def __init__(self, name: str, doc: str | None = None) -> None: + super().__init__(doc) + + #: The name of this signal. + self.name: str = name + + def __repr__(self) -> str: + base = super().__repr__() + return f"{base[:-1]}; {self.name!r}>" # noqa: E702 + + +class Namespace(dict[str, NamedSignal]): + """A dict mapping names to signals.""" + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` for the given ``name``, creating it + if required. Repeated calls with the same name return the same signal. + + :param name: The name of the signal. + :param doc: The docstring of the signal. + """ + if name not in self: + self[name] = NamedSignal(name, doc) + + return self[name] + + +class _PNamespaceSignal(t.Protocol): + def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... + + +default_namespace: Namespace = Namespace() +"""A default :class:`Namespace` for creating named signals. :func:`signal` +creates a :class:`NamedSignal` in this namespace. +""" + +signal: _PNamespaceSignal = default_namespace.signal +"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given +``name``, creating it if required. Repeated calls with the same name return the +same signal. +""" diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/py.typed b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/blinker/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/METADATA new file mode 100644 index 0000000..e6c05af --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/METADATA @@ -0,0 +1,82 @@ +Metadata-Version: 2.4 +Name: click +Version: 8.2.1 +Summary: Composable command line interface toolkit +Maintainer-email: Pallets +Requires-Python: >=3.10 +Description-Content-Type: text/markdown +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: colorama; platform_system == 'Windows' +Project-URL: Changes, https://click.palletsprojects.com/page/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/click/ + +# $ click_ + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +## A Simple Example + +```python +import click + +@click.command() +@click.option("--count", default=1, help="Number of greetings.") +@click.option("--name", prompt="Your name", help="The person to greet.") +def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + +if __name__ == '__main__': + hello() +``` + +``` +$ python hello.py --count=3 +Your name: Click +Hello, Click! +Hello, Click! +Hello, Click! +``` + + +## Donate + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/RECORD new file mode 100644 index 0000000..61f4cd2 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/RECORD @@ -0,0 +1,38 @@ +click-8.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.2.1.dist-info/METADATA,sha256=dI1MbhHTLoKD2tNCCGnx9rK2gok23HDNylFeLKdLSik,2471 +click-8.2.1.dist-info/RECORD,, +click-8.2.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +click-8.2.1.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 +click/__pycache__/__init__.cpython-312.pyc,, +click/__pycache__/_compat.cpython-312.pyc,, +click/__pycache__/_termui_impl.cpython-312.pyc,, +click/__pycache__/_textwrap.cpython-312.pyc,, +click/__pycache__/_winconsole.cpython-312.pyc,, +click/__pycache__/core.cpython-312.pyc,, +click/__pycache__/decorators.cpython-312.pyc,, +click/__pycache__/exceptions.cpython-312.pyc,, +click/__pycache__/formatting.cpython-312.pyc,, +click/__pycache__/globals.cpython-312.pyc,, +click/__pycache__/parser.cpython-312.pyc,, +click/__pycache__/shell_completion.cpython-312.pyc,, +click/__pycache__/termui.cpython-312.pyc,, +click/__pycache__/testing.cpython-312.pyc,, +click/__pycache__/types.cpython-312.pyc,, +click/__pycache__/utils.cpython-312.pyc,, +click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 +click/_termui_impl.py,sha256=ASXhLi9IQIc0Js9KQSS-3-SLZcPet3VqysBf9WgbbpI,26712 +click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 +click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 +click/core.py,sha256=gUhpNS9cFBGdEXXdisGVG-eRvGf49RTyFagxulqwdFw,117343 +click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 +click/exceptions.py,sha256=1rdtXgHJ1b3OjGkN-UpXB9t_HCBihJvh_DtpmLmwn9s,9891 +click/formatting.py,sha256=Bhqx4QXdKQ9W4WKknIwj5KPKFmtduGOuGq1yw_THLZ8,9726 +click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 +click/parser.py,sha256=nU1Ah2p11q29ul1vNdU9swPo_PUuKrxU6YXToi71q1c,18979 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=CQSGdjgun4ORbOZrXP0CVhEtPx4knsufOkRsDiK64cM,19857 +click/termui.py,sha256=vAYrKC2a7f_NfEIhAThEVYfa__ib5XQbTSCGtJlABRA,30847 +click/testing.py,sha256=2eLdAaCJCGToP5Tw-XN8JjrDb3wbJIfARxg3d0crW5M,18702 +click/types.py,sha256=KBTRxN28cR1VZ5mb9iJX98MQSw_p9SGzljqfEI8z5Tw,38389 +click/utils.py,sha256=b1Mm-usEDBHtEwcPltPIn3zSK4nw2KTp5GC7_oSTlLo,20245 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__init__.py new file mode 100644 index 0000000..1aa547c --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__init__.py @@ -0,0 +1,123 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" + +from __future__ import annotations + +from .core import Argument as Argument +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + from .core import _BaseCommand + + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + from .core import _MultiCommand + + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + if name == "OptionParser": + from .parser import _OptionParser + + warnings.warn( + "'OptionParser' is deprecated and will be removed in Click 9.0. The" + " old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return _OptionParser + + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Click 9.1. Use feature detection or" + " 'importlib.metadata.version(\"click\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("click") + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8330ea2e10a67b3953a349d5c1e5a33c10e94565 GIT binary patch literal 4099 zcmbW4NpBm;6~~(r_eIp=MYgrHB-<2iiIikpw!CY#HJOnFOU@vbL!-%ViEZ~nR5zuO zF&YFx4#_Ep9FmWaVDc$)4G?%{4inHIFvv^}zB#aSnN$Ank(3Bz9AHA&fBx!K)vKyk z&G%Y=&18}aKL5!6rE=J(DBn_}{po5#=xw-LQGTx&icpM@(Pf96F3}ZIjBX=rcROJb zW{!X(BElR6M@5u529Ajsa~vEOapnX#Arj0_0jR+%4w*Tfq0L+~ToW( zI{I@nc_6L8a`)7-=Qz4+sJ7)|a9LW_z*l!`Zb5zO+SYSZ_25Oey!%tC736%ir2D3k z)TLL$%;SwLZmnZUJx~qL^i|gj$hoN=SV0BLV%=J~g2nf&vPvsjeiHpv&(}+~SxCO7 zpL;%3Pw6hE>Vf6C{_9ZF7GIQmHOF)V^v9N)I|lZ(aM`nMvrIFZ{cd1>LPH~uu)``K zx>;@YCbo2`J7!=?nB#hfTkM4b0rNoFb9XK2@E$ZouIV_k*YcLCn0EEVK0xu*s=DuM zhFSKc9(d$DdOR`BeQ?^^R-D^j=@~|4i4Qz!ocQb6H>HmyPb`tek|*gvy-T{$4#iVn z-!ozBfvtJGwj~Wq=P`TunOXg$Y_^Y*ShH+%RZ8Ay??;yJ<5B3GlHTyPaa+e>OS13w zjLc&MV9lclH3OMAka|^X9dBUI4774hO5B%ra_UIgHgyV2tQB6`yIHPy+P;>Kn4-%S&ni=Ad_@n;9m^pOQ%vw3S^IEvaR-oGvpqd{qPraC?)42a#@F3rQ}bEc zIjr*ZEj^$;Mz?pKtZzIbM>{qAJOQbv8(U8{mshv9S69#sKYhB+->t1?cR7;UF4lMP zY|;!0pGtI`x616gofUJ1}h3_ z$WUzMDDtzYOL3HYB~*)Kg1Hp{?{K!?55+(^`k|#ZIoH zm7|Prm{n<(@x&tMB7YuOwyl;-Rho{s51Zwx&El|7m_hbNuFtg=z-;^oOx-BFrp2*T z(hv0VbKBfE?Rxs7njKiJq3FwKorV|Nxz6VQxe-ppC)=o}o0$bE$LF7YM(Z@ZuyUQv zAHU`f3ZG{iYL)$SwcOV&n+gquDd)ASVXjb5X<9qqYA=3A6LTGwoQf1Dtx_$(#2<45 zv&|dWHT9q-O`~)*k9Ti|sQv z6MnQFro1FK;DZ-s*G-p+W0!su-70^+4~i93{-WbmbVoOe(nOUn&d$tCujq&V^ycpL zvS*mZpIUxRx7F>SW>}s|CUr}C&k!iTxNo}qMMS7r<+qz_h1t2HZw2Ob70)edgUWEs~iKTvh^krGr7fj+OHpj8N9jHHb$0BF?AX`Y{1@5$A9G)2=U&F= zzDo}N;nY{jk(c3-w>YM``%T1`lqBUK$vKkqBo|1ANQOy9NJb&`WV2AxYpYbrI!4ymp6!)%+n3|i zisFUDsabM@`Y)1PBDqYGBSFDaWS-;-$yJgml4+6xq#g-S(tTMZ!wktR$sEZwlItWl zNajgylH4L$Ah}I)hvY7#9;pQuHg}H<_ema*JS15pSt6l_^-qfYIq}aR-^cGZU+3>j z3r#92{@);Pxr?W{kYSyugru7o81_@_GLQJyCKr literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..851a915eb12c142cfbb49c2996eaffe014587699 GIT binary patch literal 24221 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 z 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfbbbe54e735af59bff7b7c0c7503fceac55b3b7 GIT binary patch literal 11797 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 bYZ9H;E;tWSJtG&_B#x|oG0!d6@yz~TcbNdV literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..072bfcd985745043c5f02bec9d8db4e399cb5681 GIT binary patch literal 22164 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 CIww5< literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c9d147bf53534a7b5ae6186ca703d4253c2e8a7 GIT binary patch literal 14803 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 aJb#?eer1KD^NPpIcV+i|&f&zE;(r0fr=>Um literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6eef7e6017e3b523114f4b9426111574ccc065e GIT binary patch literal 13699 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

#;(T zjOsZkQ+BA=npbt(S^!Z4H}iaJM57!Gdy1*Jqd7?hu*pm)f*O3n;9*T^9~ zk<3;9;7+IRzV$xNGk zs+l(VR5NYzsb<>bBQxz45Ba>XvRkcy@6j%+0L8i2E9}YnnpVtsFFT%H74TkdbqMvV zHRZ6?JIOZ+ZMmwN6*IlJ?o!_ePO|s1qij_``0Bwe!f}4(CB9Xt&TVL3G1Gf%m->Dh zoFTrK9p$S6-jBY@Hw&r_KI`uq16c#3|0@Q7#94`pk#Q_;FaoEy1E+!D>mP_?9K;&S zkIjWE_>%B}wScV!mDBrLW(igpBYBeT(fy|pTnxx>DiDEFNpr1J+TOwrFf8vPjt#Bd0jvvOM-?LEi7V_mQdo;@}q{c7nP!xV+ zCYCsd-!aI0*O$lIoiFcBqBF3=Q!h~BM2r++@_!McG%@XQtgQ;;Q(k zPF%=ebT(%#&5Q{GVP#0nV80D59A9^{1vXq~8L*C@P$9aMVQ{H1x}c&P3m4-!L3RP0 zi6o4B)RM7Yw&NPCd=`x=q}YoT@_!(Qkq-iDl)#3c{46wYg#`>u9R2O`e?%DFg&7#7 zAI-w}6DH(6;RGx$nO%+&z|9?;HNmk^yYp7q6Ve*slX+KBGWKH;GGUIYrKH`NcSbIU zBdX1sOzfDd#U%EN9jNBZ&bzayuEoSo!6MGm7v=gG$?A0rU7($-Oq$M%EjrJzIdJYum7 zIpr=K9AWYNXQoQt@((*We)HdR&40~RKIEDna^gd-@$b2<54kN5xz>l=re(9`JBQyo z{Lm73XlZ(A>3C?_v1}=u?EcQFE2q-oZ}m>{pFtV9;rhueSFvJ!hHuF^8&}Nq?l{Qa z%feSz1$?hw=B<3gYNdtW_uKN_eA{OnoZrUyCi24h?X$eVcYemf`K|XA3*Y(~NA9B$ Ldo#b0t=0bvE)&V7 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..501eac3551488346fa189063e63d48a4cb916675 GIT binary patch literal 23199 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 ABme*a literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9280a19189459dd899778f9cb5bb926c3cf1e5b GIT binary patch literal 34550 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 V_}bOB>-V|UnqP!E)Haqa{txdW;oJZK literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fad3d129cbe27029d7e73b63ae94d6afbc187a7 GIT binary patch literal 26926 zcmdsg3vgW3ndZISef!;NNv-$8x|U^GGDd!4gD?iaz%pP1CNKzy)b87|TW+bvy)DZU zEpQ0CNEu}vUX-Ng$c~Uq;@NreN|vmMJB1Fq{vxy8d2rhA+?*Dtu29^g_x<@ z{r+?At6S{{+1aXWF6i99&pq$+pa1-?bNtg#$S>geui~`s})Ge_%cek6pJ>4Gm_I7*O+t=-5Z-2L+y#w6=_6~N3 z@OCCk2EyH8l;u*SWa&UzcNv4-fXlnf8SDWZ>5eei3%H`Yg2BFI*+6A?r6|Nh{p*aT zTW>Xp^8Lx`ftv0bmOhZI9jNQB69tEGpP&R^6qL{#4xYZdJ}&j&Zsj!~rA{e%(e;M@ zv%8Vy3?pZ0+}*$3NM*g>aB{f2iKQ$<%5t*~nZ-pASApEStXu|U=5F>0)_+R9Qu(5* zdlk!Fh1}I($RDxHK-lH@6e-aG!{P`jU9V* zbSVBC%r2$!^u$sFL(w!qe_u)+h^Ett!6W$PPRG@O;RGOQIGspp03tnoi9x03aAGj3 zj`pbWs1jEZUGfN^=;361*Kl7Si}CDE4GcsFm6*{xdh5d@E_LI_86hroi;B?gPy&jG zE;^N<;=tRbgcK*Uc5kcUBTKwhO(@gS8?DO0?7`;~IVhj(Dq-yX>Y z_r{K<(2GN9B{3M&>t#)$DaUVdse`p4BW8pi_JM+o1HWik*rU)l9Yq9TRA_e`xVPPz zbN3_$hlbM_x72W&14GeaEw133ON%G_auQGA=HE4{UY6yn+WMoZf%y7?)Y0fbR9Uaa zhf>=5jT<)Hx+glS-FmR^*4-&3zW%X#jcTCXM2@mq&5r_m#EZG9}6h#gy>j%zfB9YdozZx5QANcZ%NRocg- z!-%d&q7jL>gSM;Y;C zL<2bw39pL>+8sI1kvNbtt*WK?{JKMp;FS|kXp~u&)hhZK=;_f@q2)CNEjPc&NUBlx zlfpu{YC3)9+0)Nn*f|$&o$|(7&tCtDns%jZI?C zMWn!-%0YWC)fS{0E6eL6rEW*Gt&3xmV`p2=-*WDj`MR~Ub!#tfoU6NaF5EHW?f3)f zqC}0}sII1F+b~saqweKTAxlYnQt|%XGFx}c#hr6?9dqIJGv4)oApP@FtCNYr`0_5U zr7q@^41oGQr3EwKYqetAT2}aG+5xHXSH$}T zk&XV-l{AKvj(&SXkb)kI(7h_20UJ0~?ZSTeSI!ZUlRS})7WO|!#|E_#85m91H@=gM zqF?oGKN25|pBPeijJ4&BA9f-z8a+K7+moqSG^y?AFjH`jR&7w z>9aF2n6`a%FnBDGOlavRS7J`Tht3;<%nhX{AEvSS&uM2EE7!If< z6iWf^)7l0EFA7Tzr_{LQ7o{~zZkJSkB`8Ykuee2N0|lFx5ZohDcsu=G$qS<*@|G0s z2dijF?EqjbsFRS4_;MMA1Z8J4jd+FFP2}JYUr_DN1CQR@E;1g1cyLTgJUXD+P$SU8 z*iFVesP`f-O^VipfGv{Cp3uqX7QCU$wT%<*sgn1-p=|An3HMh^_*!|PzEO?x&unRC^Pl(-~LqfYZ7uZFp(sgimYG`y! zc_^BW9hG}~6R8e8zPDFSr{rWjEvJvhW#Wy}@j;n)Q9c}(W2vD;T%j~k2rftCYKPws z&ROp0kdMbz4RTCWQQ}Hxr+jQiijmiJ!8)#hWe{ujSTWg3|l^TuQP8s zNgEyl86hOgdC;KIo^%R49dViJ{S@iz>4_zyn%2{kN8nhFu?pJ=m^}6a$fnWiBiiB( zO?qa%HJ7|~+3FRH#DiE3@~GWqJtFS_1;3Ym=d=aMl|<6`Tytd+TPsb-(mB@E%fW#zRPl zKXK_#08kG>GL3Jxcd=erdyy!l&7K?cYkjrYRGKwarhs~@&t*}|Vs&>q8AwQ>ccOcfFc?2UN zjiDN#fKfuCA?;rE9*WpW!7c=lHhYv*47&oOel#1bOSzDajj?z#+0*m7$U8;k;vP=) z_EAy_h*a>YdQtcYRL}ccze8&Jt=Azneu6;$NI<{|93_w8&wTW`6PIcbRX`$KTxuV6 zwoAFdAx5qqOq__TV=vH4lY6&oX$7M2j$W*4h5y6?!%v;I>5KePkOVcZ4JXrbLX)G% zqlqM`6y(GpqZYlrT$~0CA>lD`csL!uF?pbYFdh@>{v0v({koXg`i7p%P9)MEqbQ)O ziF!tyAiQbHgUDrm|6I9DDU+!iun!OxwYzhUL@MXeS0CTVX^v=nprK`NjArQIS=N#FCZjwTF`xTGMoZ%vkZ%!2f- zO2n4rjAOGRtTZOETVgTLDw#2EeLJHq44WCYFfX<+4>Vi{z<(%@#!sZX4nD3%hp-vM z%(+B6XodpRC|Z_`IGZ>&DSc1n|y5t$fkDAE}d z1CAnvM&c}p+7-9pD`ET6*{WIZ+6!BM;a!`ptOWx2+3Tx*Hbr?%4|N+I5toRYx)udD zsIaIKqq7V@4zSRN+%DBTK5e9x{94|N&VchYYV?-Pg zPB@6=kmI* zt-Y{vCb;UeMJIk=)k=~1%Ow%vYrb{PZwA&lUz653+x;pLASR8dganNLS7{bFq!4r` z1yr|6JEeLzf_7ga&0&n1cSucPp{7T9VXPeLn|g=>wtW-2>RaN|6iLAm{ApDEr!S&& zl2n(ik{6xyZo7rQH*e+dUH7r~WnbvG6232%2=0=P9imjX+X{X>*6@r@RFZNfbsdL*5*BWE@|@-ytFG zGmS*SIjaG7Y-MpNx>Eb;ll~JhcqFUf77W-WJO>E~H5$Wlw*(0a z`8#E=ReihaV(9JRxs`X#g?3ChE(byrJF=0=iLMVzs%L8U&6RY`c)Kopf+xqbrIAT# z!55j{`_0Xld`;QX$}_>!!LyIgm9CzUJ`99Tbxw9p$L9hKGcKK@MwRBHBZ#!@Pe4jz2ceGalo@Bp zU=$Wj%Q4_Xn&d>2V`Q?Ro{O_YJ%>pY<#}n|m8h!7oP(63n#{g-6l4PjRWuvofq6x9 z@e++(JLQ4I2^pR1?X|apSXSbEDblQ?w|5;Ci9WDa(AEtjk}8j|6`;lAvYY@Xj8RG> z6)bU3<0SK1%#}Dj$D_&NIPWL}F~+3a!T9v4sR1@f#z4c+M@G54QsO6I9ipYci=dy7 z!(nwo=m%mZ&BnSWE|TpQq}TwZ3<- zU{lv89NViaT7|uqD5pU?Y}9XfFu|5MHZhoq4LVdve-Z{creU>ExcI7~GzZLu6qUh{ zofu_1Hr5-A;vF1QfY(Si!WIe8@stQs8mMsp%K7BLu0S4PFRP6 z7`02OSd9dY$|G^r)HCu0MJ47uP@*T{3USpD@?RDG5M&9pa&9HgcmjrY#}T9c3knK! z^Gy663+brEk^Da+okmP55UUg{@qAdG4a@W4HM8M07hP`!UJuN--8tKK=MSEk3*R>% zJ~$gbm<^Us?^$v>O8tw1!&gMUa-lf3*#A&4YOIyesmNxUk4_zY)cz$6-Af2Cx@-wg zP{a*}wi{{8q2(C!6GRz9OVY+4=g^+d8(Nd$C>UA3n-B_rzU8P!6B;)3L2Ea~noo|v z?L=o5IG4sWb*P)G=E#A>T!_o(lu_iHnbRi=<`fmo+UB(6pJ`5M2V=|SB!FuXV71bc zq>8JY-_RwLL0DPGMa5ysTbA@vj5vP--fS5Wq3c@`lWuaZ)UoL3RdM@OQNAkffHcnb zE3z}@T*TWjK~~qd=RCCafgI-oMos zolHE!HgvvHx8ob%aT&z6T?U<`4@@d&8}JVLNxg#EBdW#s8XLKs0gVUePJ8p%-Ra?> zWc*3$@soL}o?a*C{az>Mxu-pClyWypfxh4#yexgVP1QI^ADC^EsE11E#!P?eZh~qk zsG?xh2)+hDyMTankP*qdxI-wfTC9vnD=(MUE=qVql&@}B^bq7F$VZT$pa4NZf2Nq${P0BEs_#ktHlKq!wC2VOG{(3J{@w1qdG z+8x86`OwCIM_l4M1G~M>5bhM80a z7z_LJKj|Q&5B-S7SW4JfNnHXi2qlopgd|YTtjJ0<9nF{N29I~5mr8;U zoeIVYO_gn(m5)c&1es$n!YCH9jjAT#Td8jmhHMDeH4=sr5Dp;#rfGQaKeQ<{6TOeB z!*NKxXcGxYQOeF`RJQRX2C?rjbDL&vJG9l=9xBANCK=<83LrT54JTR4w4g_$m z&}=URcu1lnY>+|JX)rnmP)BF)b0(ed;Hv^cCL5d^aT8oZC0y$5E$jj6V%i!)(3>o- zKxj6z7ZIPSZwF$gbc)qaA`aHSxU>hravAu9sKK=h))$*2@AYJ1%K}3Tf6fV<&-rNr zIUeUq3;PRpmdU1+Tz!RtS1CAyK%;iD*|5o=<<_7ZKDVDx+SLdkEtCi~O^`2x*-f{7 zul)z*0KM6|7QDh)dBcS3m)=IU3*;${%^_$;88if>d@OwUKq#;`v^&QB^?eEW4r7TM z!f#PF93=L~0+cwdxkut57Gq=X|wjJblC29{Gk=yvp!Sbz*QD5cFfD}zq- z_BN}jRJxfID1D^XHA@0b;0uGs3!YF&1#9PF^ul0?oH6(iQCAJ0;7a)Y_UM)NQ1h6f zY^=!|;Gzkf;OKNGVeH|hky9roPy8ah^6b_bFZbuk8(W|jN3X{K9#-p;)LT@fr@OfM4B2 zJ+|*;2`G5Ry_QjQ|##{-n8IJR~Zrg#Gw~F=|&?03O#>+kufkdK*sxoIPSu@HretOod*Rbpf{yA z^f^5tS|e#0tG`lnjXrr4_he0v$vWCWFm{puFDVwN)vu*IjkU6V?>!u9ZQU;5rEVmyh8V_ZhU#SKw z9kEzsrDCEQb%tLIjhCcbj8^rx8j$rK58J-CS@8xmUTXWk)`+#<<7Me}#;^Vk1G3)Z z<>?K^ucF^0nSfP8kGTReL0hc30x}_6ED3Au$&^@a=rPv?V$GVZ*n}`%;RF5b-)!Wz z-p2gw5uQFM2v32gj8~3VrMDO<`nMX8_3kHiUBQ#7G-f|jk*Oq+H&b;Ivvd8DGL?4; zQ+H)S32qeB~mx7*6|(9W?86zUm-9>`cWCM&nj%G;X>l^*7m*_2`L>;@S)f z-ePMkW24>{P084>*oH$k-0iV&sH`Xsl^4aKNHHAB_=?f@Q4t;)odznvBLjyUpAe?S zsWpb@MZtG)6i*0KZ&_b&I1fN211m8PIN)~^7*$`i)>fm|o1CQ`e=M_P^qWo{v{y!- z!nUxJr06uS9WHFgD%Pz}HvBYkRBW9Wf9EM0i z422T}%;-#7Wy%2PHkg_Ld@mFlkQ?DSJ&=l#CA}?~I7Z^D#j$hgHD4`aSW1cYW)*>h z&zE2ovfb+D6kT}KB}SP<$&_K(q!M)5pN$1qL)d*ZsC}ed2HgsP|meYeJmT4Fu0 zVq!=Kk4EH7> zT?v=O;>tR7CIR<(ni}1!z{D{s%F=@{%?|r%s_yB;K+#5V9h2RG-fY&5%mFC#hDBO7 zZL^8IP3Q&uv&b)iEr;G-M5k2ku4X!ntihWesxoGggQS?(O)~mJQ$!1vmYpGTLarp+ zWsD@t8?w$!Pl-#=WEA-S7n7li%AD|MB}E9F z$n=uoEpHm~Cr#Ob-s$0rRs782lWa(jZ&*ft;XP z_Cz<1DvfF?)Aq~A1E*N*0q{v6lo(RUHy(54=9Dkzgi}n;PrC&7+|pgTPI8y7&~Z41 zL9NNZjjgqG3FgjWolDD0`xM4iBV)s-Cxs7#;Zyr3_s<6#W`hl9AN#YXF5rOf+J*9} z>9M);=K1pW+4A;_t#joYCw4E`lU{J19lo&ZZ1<<VDL7;EHUdYGOZE{S-xwAEM^` zqaimvK_+Toq8y)NqD=Hb)%s&il;vAEX`)GK#ont&J0pgxW5*PTXtQiW#mUX)fiix=E~9=zCm_PL9X z%rtJe6x>)iKMRrSv;Mirs`<#;*~r?9TjwI1W`addxjIocTg&ePu%Ae}+3B)YFr9E! zn{2DejUo%4V(Zy*(9Bzl#c~&!Fl&n0T67#xiQ?%Kh0{_*9+@X+!KBfFOwyym7n2++ zNzY>_^1O7mpJK;WUw5L6WOO7|BV!|0TBPdC9jEU&v*YxR3oGX$EfahGJ{(ynjnK*3 z`BHhdRK8GgskAk3L9*3UJ#qhXMJlZ^C>#Rep^$m!GeaVDY}NhrDdRi`nR63EJ<&le0l!wm!rD=Ut}IJ`oH|^O>VTExVqG~go~>`2 zscxGoZNt3`(|61SxeKUqdVm(im>(4yM$_97!5m$&d$_)2sl7rgi2BfIzR>3O_s z&!hX)3zUL1s$5zA3_&V_oYy>^N(wpVAC0>ocJKSbf%|(7b#?DmX>F>c=*mS5^2-T( z4_W$h<@#c_#i`$?EaV}j{s#&O&v7LOS>SSxlm=5fx8dcSz`~r*v|2M8a(gY;?h`_A z?LLh}F2MXnId##^1B}Vd`QYNJTMGO-2*xvKz}Vb#r4$e81FnNTBMBval>Fpi{u=0k zM-vjfO;vr50@iS9bFP~56zgvleOTV-Tp7h1>xBln?g1!S;D1@C*fcYV%hV)$632--&ow=aS${*E12y|PCXs@pC~ z7t?QLUeC-`ZJ!9xi4*^a71d|DPIpcC7AkAbbf4~?@LNFr>iPOjv-P-EpeEbgGUdPI zZMs}ierjNH;Oy?X5_!V;VRiG@#wUW81L0G5f939lHEpjQ|Mu~P(lVkF-+bU={oBd; ztzENQyXG49!vm|W1RhwSl8O7zu7&cu`L=AZ`a;WV>%P72?I(VC=!(#}vt#C}}F@nL0KHdr$sY?=)=U2J)4-RtXq(EZ~WGFJJK$B#0r+RX&$ z+?l6NKb0-3&z4nWBdf0j+yUiaa2fEg#F+$N^_3FqgVVQJ{{ZNU z-}vyc!{e*bKLA=R7jWb^gcj}JBv#U2v zxi5K}vn?Cwy)s+ZJmrSns(JI2gel3k+&1Mw^yTu33D2UV!M82DV&(b7xx_b)eJprG z>rVTpozq`fXj*xG?A+M-=gvKMF*etn8gMG6vhlMk6-LyrjHpGQ(A0W! zZT)nizJ--%WWI{I&KsM5zSjSfHib3+;=cBW){8&x=zQ>Y;qThZ9;|izUFV&Ee{x$5 z;(uCF_F%i?r%gLM@#AN;z6V>SpEW!2`Dd#|f?FBf?tAby>1Uf9lxB-a@NG_lZ?Ao5 zo%84AWd~Z^KVKyh+~Pa1!T0l99R#lz3Er@CJATZpqYN=SBT70`a4q6eE7%fTRwj;n zGt$W*YytRC_>9Bxxu_4W6ZRDMn-1d&uG<9Ig2Zt@{sM|~JZN(QbEHka$*{4&sm%1p zEvmycWub8gG}xYgI{#SkC@xdx3i)8;hE2D;APIgdQpTanby6mzxWDPhc<7MfxZh?s zYF?hNzkPX}#n;*Lu3et)`gt=rIYN6vKQzsSk5R*TDN^}vn5qn^{5MQh4toh)^Q^;B z;Az(zHD`q9OP?=$zWjOr^TFo>8856px{ZvTx-)Hl(DC9DIp9JuyPhe&jEA7*eb3N4 zLK{m=0eg`DFJYfCEf&Qrd1mjuY2xJA)8Ak~)?4vpO8Qq=zYWO1uJLdtd=kFh^j4h5 zwqYlBWJ<;ZHk=Hn<-%NAmu*&yVZ>@9hxNAf1DUXajm8_JY*{96vOL9Wsn?oaFy47d{#%4%C?eUGD^11-Su1lN3=eyK5rB> zaRfS`Cj=4yVZ>kI=SbUw(Pu$IyV&U~QZE_`aB_8nJN~tN-QYp29vLRrH)K*R)hT#e z97LuwEJ{L!R|!0zpz9@dol!8;taC>@=Kdx3LLH+KTO@ zPE0XUdk-Bug0q7BG}8bSyS=7{8><!I|3HVAB#Zl{eS3Qtvz2Z62My+@Zf$=B_ce z^oEW(nb5uLbQeN&k}Ji{`t+1^Dw`*@`eP>Ukh{oUF-lr{uK$N>n}!|!Q{-T07G`vU zy`i*@LJLjDH9E*;Y|zTfV@+2c6l=K*S|giR8r3L&VGw84w4=B;!kDKH`N0&IDA)pnCv6YPU0DeW(q}ciekQt`Vl$Gp!bX| z4~|0m60xm4pc1VNS{M47U@Ktx@cjQ{6oDlMmJfFKhwhn1C+TSUE<1>4UjD&M33)?L z>3^RCn6`sYdF9a|%wlIS%|w>9=h}vqcPRbif zxtH*P>0^IG`PF9;wAV0SRCS&r(iD)s4~kkM*LV@V&N+utLpksL@zK3xeNw+cDO^NF za(>H;m@D_bOhs4Hq>5&e*ACo8FP!ikPD(O+mrK ztvznOUyqfVBv^NZevOn;_hAg7Z-utGqGrOI4b;yBR%M%3%{OhCZQ25jD|9BOzBu{C z3#%_4`hhg@MV#kf6mIct`r+DaebdAP*^W&UUD=vioa_(Ro^AP#^HR8Fp}K)xNxNmP zx^3FE=yHa(XB$?Y?>g6Y;n-ZmrfJ`zcSUGZwrR~-?fi*zCuW)+yZGpLyWf7~hj+|2 zJvQ^u7Z6SduWS;^DlGl>rPAg+eK&qXJ8@y>xyJe0^|Q6>=V~`jyKfwG+WpDnB3gf? zTNFyGvXSa+ZIki;>TFdL{a@L5rOZd?6Ma7ar&sR7xHLfPKz)$s8@A3iY<*jsYq;}e zA5Ri=~yyfla_xt|3Z?5*PY4_zw z?evapW&5I{&2_Rd_~J_May>%U99?xCoffO z%!|G7=%tFayoiS8SACy-7(vsd(Ar;BugO;6EN|nqj|FB^UiE&q7(jy0pz->DGMrcW zcz#4EaaE&*_m}JTyPfZpm+dKWywg&)Q?K)_S_=8)uNo0?Y$&69 zuH7JysWBl7@JaYcT33_wn;yF8o&MPC7^C_QS=M=6>Q)ch*D3F2_j#}?i}iIFN5jddCth#QY&KmfqhHEkHkV3a=Va(M0+Ot5biOv9-LiX<7@f&yJ*WbD zaFM4ItvP^e{eA?L&AG|`Iilpel&vq3jORQ9#}xVj`{Gfg#D#80>CSyPH4MO3gzpCr zv8~#;)QRP!(aSlhAcvA>H{nuce5;EXVmxl_$1x~&G-#~Rw(sduzU^}j_CM|4pncph zBMafOQ;EsMpB|fVE`%!QLyfbc#tUtiLbpsf7QFsb-bwFt`BZSx<@42M%PYRJ??apu z*f+Uv`q0#am&4UF;U*~X%W4-Y>driP`oRm$zpPljh-;$cPjT5;O%pbfvf5u&)L`!@ ztNrXsKnR6zkonVvYHTmITvr!8DDI!MJ~a7-ox*O9_>R-HOA_AkR1@4(xpS-V&K3v3 zTYbA6&Ufx6_+3#1{I0`EuvD|#<$QNV<*qHRcQ=a!Z}IIGJn!D+Aoy+(@ZSn9z<=wa z^zE)O{8I>hx88o>-bZmH^*Ac#*Hyg&=xPhQ-}XWHjscgR1Ou~<*m#{)Gmo>rN}0%x z%GopqG27}Lh{NAQWvn%yFLHbUVfU_y44c5E|}N5+To|4#tlz+?!_Tvt4qZGjWzL6VdWl* zKQj!csyGdoIYf*<{9n`zt5u9s{7)2TweLgvc_#&I07n5~06)TOtdZ9NM@-y8d-MT# zMdsDOdRCs_GipJ5P`!uB+eyJL3Lc@LngU{y)e8u6e%WU=V^FHSa@iybcSi$sMJ=vqPlOG?zO_TtWHGb!te%3V)ul4YwsI1knAcPnC3&3!;^tK7 zZMi!HcW@x<7yen7Cmz}hpNYM@@9#QrAMPh+IgiE_cBw3?hf+^v6or@~^-~J&rQit) z_EGQ{0+a(8%)IoH`C@QS4_a6pb@S2rs&_lTqI-u577IFN;Pg)sfToM$2SW3&g%$4$ zW$z0<_J8nwA@siBe_sf{FO+{EH2qqr{6MJrK&bdYh6(e1)TBLCJ=36|gbbo|Gu=-2)GXgen{?u6 zdZy<;=e`XfC?}ms)%W$xllb1nefQn<+;h)%&;8r7vQi1xzxDp$%tzmlq<=?0w5vn} zg2S%<$^n0upTnj7fq`IGki%|- ztGcQ<>_ND?t6G+#rDr#4%`l!y71yP$|q zu{EaHl^k1(*g8|}Dvqs3Y(sPzYSt-oHs7O5Yw`09n~3XL!(TMwizZV(%^bS~u_06J zT8>?c*k#eRdac)S>~h4eFvYfT>`KJ0imr>c=;f{F_|=GCV@lo1vCW8Gi`1=p>J1#f z4)HCfdTiv_^@wdX#ctx*4T#-nirpN!KeFk0Th|tTyBTk{nBH#X*sX}&7G18lXj^1w zWLM|)_cKlkU|Js3HE&8uE{A$&Iwd2=D{n!2YwMqZAlgr$WGIwBv z(&n)d;Yize+w~sUJ!EO#{de@DS^N<}ZF zC_1i&|Bhe~5tZGD=ngBVFLX!ay@^OHej2gv#QA8vJDF0V;ei`+&a*EZc{Hqq2coH{ zg4f=@gfb9Lb@#>kqjAI{%6TN59y)~I6i$ZwqP^k%euPW*C*o?^E>A*8E7yeCo@sl>C4Vi)99AMqov@&(^EL<0E6J5<`-m=oPXEf4zE_lJZ;H!lE#+@dBtkJ7n*me;<@OFHQXQHC~M1OzcB7mt~2`vFJD2Q5XVlc{jLm-|ESn~Sm3nNUwpXCfZ$=@D5d z(bS+4=Nzanw3n@@K`a@<|8PG5J2GT6Ga3n<8VW_Cec{1=Q`zkR_%rQ2Y6q*itG_~+ z9aJyT>7kEE9TqqCK$UN>rBZ-NI$ZwZZo(K8(>y~o0*`T;5l z4HPhHT&+;7j|aJ@r#E#8y+eS|)5Cz&)1&8#$v;SAjebG-1-;daeoyrF4l1FGXQFYf z0BZPofY|wzo=Yr#eo*bYLup^Cbw7d0<6-5=Q;9_X$($#a>;^2JPb6c&Aw(Lay{1Hf z$CEjGSc#>Ea#r+g&PE{8nXWRWL3C(1L<4;?7l_6$TnH=O{jp@KJ9)l81_Y<{s_QCa z4O+#3IOMsv5x6R)^moJ38*2Ehy5@3v^>)^7{w2Z@S^FYlp%rpO9+r!yvlgaHsWgxz z4NDQ5w#F-E!_ryj!g59|am%ngg1=!)#Qw77xYX=O|NFyXfPw+U$~b>E|Tcw0q501o%95%k0mid zRgmwG^`2{0ad&Gf(M`p7M`FFH9tL$K43vZ91f>9-m?EY<<+A@s2hEMaUQ9wjt6qcF z))0Mz`iCQtXr#S8w4-&S{#FU1KNK2}T$#R35K>gA$D1v=QU=>@ngSxqp0m-9oU^-| zV5Pe|=R%THjFyyK$(eAHP>o1x&DoOC{ywFV%Aov`fD8$Bz5CRLGl_xdhJnPH@IW}S zL5TuDH*DItas7etP;&jzzV-VPk?4lUW68mAf9QB>FcM3IC@S=*k~j;zncQ#zkhq~g zc51_U#;jXfH*MZPFuwkLxc6N6bTql4m-=!8)iv3AekkWL_h!0^8%qt%>*d{4$&tSEXV3SwCP^pF5O9Tm+-TR*fz?E)7XHWTHDtRP=bmrYu9soShL-&d#HkvjPt# zsXX+3NLfw^FnmNRba$sKjjqt*jw3~q^0_R{dL&Op#@#@T**U)Rn*G|~_1>(1bH=lI z)+%`#m6b@=OXF(3xGhxRRcT0Wwxo9-b$SF1BbkJy#Df+YcXpSKLS?RZ{bn57N0&4Wq zP-q}_`b;V$R=5yoIwhQk8N#O$gS2Q5#F9z#^yd~4^>)t*x!E)!JCzO8LSlpRTj=Me zi2TvgWD-E0ZY*eN{_AeaX*1n;kjwx_pv8maK!5-aNKXzs5e4K!WDTPjv6>ZIWA!y1 z)NhCY2}^mbPe&_+pVXx=sV{AzH59FOk$Bx~>KCRGm=;l&==_zwC~4Ia3MWGsqy7DO z>Vnl6u zj-^6d+yOJ8UUY6aW{^ohT7!arATqD_47aH0nvbt}t=FsAA;=8T(V!S;EKr(?3Zjt~ z9vN+I=?lmDdqPaNh4m~j!+Mn%;QRtcMgWy*NZQ4W@5}Ga65Pk2d-W8Wsrw z5V%mTJ!hI%o@s=P0>nIQ#`MU?oXQ$Rr7Mhyr*?NArF7v2oY^Azf}j>j$7p9k( zb$bw?S$9cJS|GlVi=uj|7@_orx+q}2TEc_)aTqO(1NDfJ;aLLO5vyZNNyM3#0IrP* zN|idEsWy<~snFngy%(4-Ne*BhhkDNp#?K{zoWY6`TM7h>&WjSZ1}_8Y15V z6rc%YRG8G>5ZMpDf<{{K3N0XLV}SC3XgIFUQAB{J!nzF>ghT(eDu+9pG7S#NvB*}f2?>m)=IzRn}OGf+rsu0tXQWdUa|fSq6KY% zDZnt9Fjk><=5*V8KF6eBYw`>h3g(7{00eZlSr*b0N}OWaQYAW zx)|(kSaJ?Q>7{+ddOZn3q$QMU-5Vb|*=*_Tyx~;V;>){sj$)X<>*F$r(o=b5uIXKf z+r)At7-(f5zEck1cEcg&ijN|AQh6yv@9&lx9C!1AWQVk5%7X}@TiPh1MvF~X_J&XO zwjQSugUE)eezMuAkn~L?V*2?Y{p3>h?9!#F*3N{ON@$=_CH{b``GB4YRWlu+>GtG) z9o{>DF;6!86vAG)((dkoL}aj^_(M;3_ftTzDz{kD-3>;#yIZNEbl&c6lLQs9)l>+f zRAmL-*3)eh-L}$=)?THZZoBBVhi*(S6M@U9MliI*)e;^|evI26Ngr6ecIWIeY1O*R zM>3VmvbMF;jZK#ijy{mJHO)FCclmQ2z_wd=WNbB=x{X=e_Bos1zGHTyw0!k+)3RAt ziG9nAH!y3*6Ulv{*%AslrSb-TH(M%|dgt7To2!)VkH~WlyWKNeUS$tX2kU07^jyA0 zJlh}S=Zvd-&W`xGjZXXhvvo!}?K2fzPP<-CyIxK^l@p+H+Gi`h_R48LGN5_5#khR&KtE53@36egO zPUH!FEXWDj%5yZP=Cw!5=<~9&8m}OL_ID;y9h#Uk8ab#a3FU^&t7no>yjU<84AM0V z%WY*@)whu_>BjA{^nUr$Z29txb2+!R^M-}zP|ga929t+iQF(}N57Ui7&IweFr7txk zV66arj#4_h{R#e(B(!*50`GhI$c(-0LyK%*F=v$=eh1@l6X{_t)ic(u{m2GN>j-hr3*26^bDj1v3M*6sXXs z@FlnTM+jVn`eHFj&l~En9ha6%DSgmZU;&ZwRf-5czJ_%<>4+R(inLS$Uq}mWE5L#l zxq>SK2-GB_Bk~hc+;&mAWPL)qNc~K6tKiC)Jjv1%kUeQ%+^}}0?SrYl^*eGUkmdD* zl*if60fET-G*S)A)+#MbEWQ zUyo&Lc6`-7YenQ;pxv^H7dozVj729NySD!)o;9;&$m4F3(8T9`e(7tjy&>zj+|8Ej zG6Fa1_m92z=p`0s>Vk9~gz2F5hy{D{NkK+vMkDUJ=Cc0+=gP0k@av*=}IZ9=u}gxko_oXDBJ%X!0aU0`&3okbPO~wI4aH z_S)G}x4oH{CVJA+L{D0p@Wj&eYdf9-yHO^+_|q>H4&}Lxh{|6*7T_{FttC(ssyJ=P z25c61EDrqJ3sFN<=r&0P3z0H-_Pkj_uy3U$g@9QIs2Ew@n=NlBmV2uTFf`vZau2Jx z&Y|nr5%1~ZVr>Wr;bmve{aELt$Bynlc>MUm1EPEukkWTzxgu#Q;9db?e*W{ zlO#=Cphs^5cX20=xw>xg6aj5mux=4%7PQZK3K1-d;aN_hbK32P2qcME!jk2#xO`yN zW>rZLdeS)4lg1fOCPDC=FO}^=ipv@G;&c7_eFxinoRxL@;-&N>>%3v6(dGW`LT{QW zhhf=3c^aBhnhc~zkWJSJmQWx#UEw2Q={{`J5GW~*j!P-8_Rc_gQ(XG6c{*x*OyUZ;(!cx zKW9avoTD#E)(lA+RO05Q}X}DM*FCR#u0Ng)ZGF)WTADKXc-|#7tigg{O7Q8Mv21A1 zH|#Qn;C7^2i{3yb$X+j-NQz(RsKi!chnhq-zShR6{er z#9JNBRGZL@@)X`E3f&5j2oYWi-ToE+@{ve|y^a?PdJ+<$Cm|6$8HwOIze=_XQit=% zLn4^objfqqanGZNRWlM8aIhJNSU)1=pn%CP&C67>4OFrNDSYbNiijO=OCpsK2i6v6 z#2+ca(-jFsoOqTlSc8HQ7vkNKsz@oG9+;1~@idjE=35i-AikXGZZGKW+MHwmnMABN z8g4@aNY>xWKZW3072Rl3S4eG0?tUiPdyb^dry<{md?+01i(SHR$Uj+%19K7(rRNh$ z3Xv=eOsYbVClZ6Kh&V4yJXrduu*jB^sUp*hF^Ff)@_mvPLG?TcqY*AZNR|en5uucc zIE0!=4oN1I(kLzP6z;zW4J>^Il7tLkAWnt-O6+t@=)tIl z$V&7Ds!x;rcvRP4LkbHaax5L~7AbmImNo#{EJTWZ2~Czf5I%pNMa$?BULlg45t^fA zEHYK1eJ}&zeqWzBpGu1CNW6V1OgyC88cp~WPDZ<7!UK&8Wa90}g5}PAQ17s+VIX`? z8%0RnkeCal7GSuv&sswVggFY!;-F903NeIKy=THO=MtLqJk?zyzP_gi4eIHE#z$=l z!erhNPh2zxzm*hEWZ?mgJnPL_{)|2k$A^qM(XfGJYz^&;LVOnu4FO0lMmaCiL_(|v z%nYeC%M4Y(fs7C139%#KLP$duJwt{Qwa1Lc7)Al+rtBB6t_`OuOhk+#;yHxw6Sz zIgP0S0AOo*rFss9D9_`ja(RMeQ;4QcdqqQa_7%z)DM=zIUW~TyeEaa9$HBmQrkh$u zZ9jI_Gb+tP-FjPk@YV0h!AfUojEsmI{I|&|{Thmm90nuXJn3whUbS{=RompMwow;^XOqt5X3kb65xLStN}xaF zxd;NF*`;FQhy&6KmR?It>b0DNI0jZX7~Qkfiv<_rWhgDw{J&=Ta*Yk&jKDgl7o$X> zi=+aB^|7RbxDa0^flCE`f$bFL%eg2p8cjkoF4HiLDvnnr`qUn{{ zl8kUUrU9j;DM>h(jQ-S#M%d*93HwRjA4;<6Ug)BN`ax10RuY3quG;?SC26>`g-ndN zIK4)+u8^8a=+Ka-zMvT5c(4+e(U&a3g&>C@Bj+p3T$>y$=cVL%lOyNv)<1}JtG$`7 z(1qbT2}s{mC}M+FZ~U8c3)}IhP+;=UvJC98x+a#^{)}g#~TK-P)tUoL6PDC z>0D%v#Y#pbtcH13nIhp?+2KU~`Kz zFe<~RgYg)Y1`7b*1jzezTTOz@qz1UEjsu2N=U~0814lPW5{2<2OnQW!h-uB$S6o;r zs3s@SNi#)5c)TysPiq^KCZ;NU(!vE@#|3m|&K8Xi4&-bHac9djA$tlGt0J!rIj2^r zrfIs2YP1moUs^2(SzcE|CnWF16+M0xUp9y{)~L(}cZYsy1RZEGoQNab3x!#VmL=qHST3yj24z)+nq7g@m zgf)B(JGAzrJzieD^q3Jl`n^s|X*`u6;*FnrC}QK$azr3@cnSM$z6Bf+DdDh_!s?o6 zy{Ls8SRGxRIS0sQ*s$G|han~;WS?_tcE@++r|-%mcjYJV$|sx4bKdi0=+1_oY}lFe zB+n!+s%ueFEF&IurV4XVQn2yl%GtrzL}5I9HW7>GY@{>IImr@*R$k=_mFf_aM@&N} zDU@Nm8iAyfNwjs8lfD$?ykh!j_I$~lTSO#jYeY_tB}v*ta}bx9h9vY#SE|#{Wb?O` zW*~9Hkhi&gQ|{2DJ9O>ATke*dk48W^O_ZN3hM5mgzOg3$~nZDJucRE--;T{{gwlCvfo$;(j$(8=G z`^VN#JeBb-%{Z6-=EFu*=r4vmR*8LQ%l<94A8e`Izr&fgcv7DMNyu|wMZmmx z8fMnT$S_P9l2;a7m@>sAZssYYFQ~?++LY0z#dmcH9Tq%$+OU;)L|CGQ2m<3EcED=H zHQtaYDY42GT^0(Mv(R2LdM0*ESmLXedB$qU$U6Z#i{Q1r)b+FqY9ncDOQ}ow8fxDx zGxS3dDtAN1#d~m+Z{Y=lwsMU^Bn{6ap;%w7lT1ZyHxChL9>iy0H9V59B2&?l^{$`t zZk_aQoetDrJu-geT3`_X$_9?W_|~^=PO=c$WO0=W#>9-U_3{3XDB}xuCdW}^;RUsh z)gZIKXvfH!ml8EO(pa=nBZ;dahaI&;m1%w6IczHi5!#3!&{4aV%L2*k8puM6E1slc zO9j_kH|-~*=}cz;|xZc<67)4@)w0TqnyV>9bhRM`%BT<%*S84coB%U&&WxS^Bci z2CdznS}zK9Jj(!^Z8=Np#+*~DL9WzjmGT10W?CGrzRalhu4^Z4bGUR~*_~dhB3yM< zXx-TlyQBW(?p8g?X9>txB9o8*7h*C$lx#KSzX+@udvN0Hw7>CM!!7^%dAn3m`+*fN ze#0d_7pR7TnvgHkk^pu_UmiNKU=YP6))X76k;>WGQZH9_Je4>P6BOEik%+TCF;_>^ zPBmpy7c$LqdJ!>prO|ec?Gb&Ti?sKM1qY;)lrGP2|D)8{acV3Z@6|L+Rkuu5x7X~j_I@P#svT@tn%QKDJvW>el&bnEf+f{zYUp+^iGt;trs^!3B%Ykgm zp?NzZ5F03;m273@AJ3OczQzwFyQ_TK<0BpAv@al5shiPv{2AYdtnc7-RXuT6B~n?{ zujr#$E0W($R-jhbm+mc<-Ysq2d%yMFb{Y4)no<# z?wee@@1103?Y`{Vho{yan_PP=yY@sj^jNm)@lp33Z}qfi&9rCZ9gla+cGWZP$$A>+ zN^HK;Uppmt#g$cKgV&yXd)?@&Z0Vs{m(6upUMQ3!-~_13b6XK0U^Z_r$r>|S$MZicb1jc~f?ssiP&(8U;%M4<@2K<%&R_D@&Tyd0Q_ywd+-f3|jA zrl#fk-i)_3<7{2HXw#r@#b*%sf|aU{9sAh5KY|_m#-eLjcwko0%q_UISp_abD#m*$ zo>8m1Y}<{cdBhQ~zhW)6*lM%&i&p;5hUGr*yI}{opc0h}g0y6$!~*r}aEaEf;D0>K z|CH#QN(uNAd$=CGL`GgP$c6Y!$Z=WX1-$?^l?i)fnvRCC=K_&{CjF1U|q}QnHU%tI<5i;NkO@;=1BFKPSRS!*k>So1T4R1EQefGzj zI==qYWYt5zNfIDGSG83BX30{yczX$-nA*E)@%CyETa1{^>x<=jU#!XR3)uI=JR7US ze~&_y@8kCS^uU*?2UZ{xtp|>A4^+Qd{pYn)n+{HHI`|HH;#1TU$JCx!u|d9GvO$K; zOjU9Fb)}MO_Rr{sk(UH=dY(c*zzveHWfW$%dL4ym6#1K+8>md<>~ke55vsg{_dEz7 z_ImKABK$pwP6vw)^$@k{vv?1R=c6jg)&71}?aRw2Qlvb{R<(?}XWZT?chfC*)6c3N zy0-3i)k9Yf&(toTs%@UEZ3ZqJeduRZ$0+{T=;4`ln}6cnaxFYwKJnC#eM@h7w`81K zeuD>_6TDmN-Mh}#ES~`3MoU||k?owB;3K;#-NfW^vOGU2WO_E*1I;E@%4vKfEUZ=| zgoTc~h2{^xPcP-{9uazjg50n#i>#;}Vqx{uH~C+S?mtW!-@{&;#t4JLOY{NCga?H< zz{2dP2;^j>ELPl8^kE036eiauGuI>Zifx7r!!eS=2-ysH;4;g&UpYD z`4eyx5`GwkpTGjAMF{%>m7~J$5~R~~DomP^G7DS3*2JOJrsC2>Z-y@-v*u98@uQ&~_ifyy zmZzC9e44o2sJn}Um00VeQf%D zV&#MFD<5fJd7NH+(#IiFVgWJ=(MH8>Z$mQc1esL*DEZf$U#mQOd%7f4Yhl~wON^Kvvn$0kwzgAw=#hnMuY{m z+^&T(T3QOz0li%;r4`Nz{(_pd1g|kP6_sOKuI?D$F>!#*|FZt(Oy%0^OEcbyC4!%tK7TF33i0wP zu_|b|T%bFp40U7NGzAV#`*fq;@?x*wqAnoH101}?>Z-Zpub=X-nDno>_Sp49S^t)d zXN$10mt8eK^;g4w-c@rq>A?q|57tN%t`*ilkylvrtbJX0$)kM?d7E_*MXh~d0CJpU z!g`P3YxO!HorLmi#D=#eTAcAjpX!ofu)y}q@|SCd?W7_*F4;)5MfE7S46##+n!s1_ zvbE9Dpl`&1bVU^UDdOAsidZ7n6wPzK7RgnGWnGX}OeHA~JBA(5nyBz*b_F6su-k0! zRA^U3dc7emiX@<@Cs7hp`R29iX@RvMTiWnjBu|Fa^vMxj&_r-1aEP0=?u>jnLLn ze@Ea;li#o_{>*LnDmL1ksj9o$Ki&^y>smT`Xd05*noW~6n{KXryDD3=XS8F+TQlih zF5X{YA}*A>?tPhi^jz_f4g9Un|xNPCm@ zErr;stQ=x1Z}3Xr#J218Z=W0O%a%Vh?Wvgdct7$wHNA~G_Nc75c#aU*t2+>s_Yl5^ zA+ULA5#p!Y)Ou3f(ME$>LHDl4Pas6Xh3VRb+eEdEt9z-e!<5#{g78=~n@P)0+Diz8 zNF?p6{qz;_B+Z_}-3v$PRRKG~Ob7!Bjh^5?in1Qua=MLEiylFMS&vGv9&2DNe)+(> z&2BIKs2tl`=CG4t{hY&QubK4(!C=tdOL~&cGCj#=8BexZ#`D*$vb|394CUX8KmAfC zSm7=ga(x$tO~OtjTtMyHdFP%DyIdT=x1ECnr=p6^mhOW|OS;E*t^AVAGXBY`m zR~zU>6>GEIG~5e3tu~uF187BPeR6J7EMV{_s5Y;00)c#+elj#NNHybUfrNSuqS6h; zMnKzh@H2v?e}rUM+8i$EQ~cFa{*{ydmDi$Ke@n*GA{Mq1UDI+0`q|3+v%Z~EzWtNF z{nK?zuAlhc6E~iK7PjJm3^i;;C0O8!s%f7eW^bf+!MAslWTe8I#`a2ktE}$^W!%Mn zpJsdEEFsVq9Qg(ckNdi?q$>_}aUP0X`4kIEy{lfayw1m<`G%;)WR zikv8u;t>8hyfO2<23$ux6a@l<^#R2mvDD&15@Z&%D7ER(FQ2Fl5kDH@*}XHta~< zgjM-cH^1JnLp=hk73fGV<(vq0lMhaW!k0wIjy<9S=K+Vy@R{;+y8Uaq{TsT?(Crtv zE!gwIB!6vTvvkt`f1|NnjSpE>7^sGkv2)sA#gCd09%a+&BUlG^K-KT#BmL45!(Slk z6WM{Hj`J|B&E2eKjaa8%iXJGA0uZZHOL|hG*@~#@U}c~pA=>pM7?3;o2r{vgcql7y z%Q*(m)5@}FKQG3dG%o0AGn4Wg>TROOA*amWvFogua@I^bYoJQK>Ku1!k6`W9ljA3+ z)kkI3)wSbmXWf#kcAjihA;j|47Tw#c56Wf0EDZ|uH&Qqfn|yCH$1tq zrl!bXM5IA5tjad>Yg~L_VAEEICR2D?y zC)XsfFrMaPF+kC4QiAtY3%^s24Lg+8c&A(18EJ~QEkZWtMSxl(q`_vC+#|*~c-%z7q^ip&U9=2nGIXc<1 zBfI_lyZ?kMy+SO-x_();S5XMLbYrvk!RuSH zWgA8<)1dS(jbFN!%2coWP_oq2OncfUw!X6Ko4ZCIeBt3QK79Sm_s-ooH(lx(jl6K? z%9%O4WmCzFJhRDmUbC2T4<7*>WfwXgQIni83`hc=Oi<@K9T z3`|d9{{vwz)k!aaDl&j=ONLRE`ZX=}P#R;G8}@l&Pd+{pQ$gpNp?4Vfm#+q$)2-Bt=6GI+0}L!8sRMHjuLo zIonM+8z1Q*J?G*%h`JGyzE|A|sm3OBtyLUlj$fVy4$~EXe)nF!PNt}l%4c*{creNg% z4}6ghEgboL^am&WQt}%}dRc4ki$S9q>I~B{lOyONaE6gwM5?DPc^G9taK!#Ca*yNaOgja( ziAI#|sEhI|-0sRDIt)LZ*U41El0Gq=8JO zY1u1hzj=1N^!lk$I|RgE-#TIYTKklL)uew_rgHVQr>+O4ns-e$@5(kmkXf_mo!~nq z@4#ZaBjfDgzPw@Y>^yYn&Z9Kv_u6#NM90q%ctQwz}KNoAgr8(Gk%MDngxUsXR_=CRk$l-16HMXkr%^19g) z3OOZ6l3f%krI4FKu#OIJdeGga<#S%debnHBF1e}^&aX(yLr-FV=}GJ_o?w4Jvg0|o z+X;P1>jsPcAz>`W_3K5|^h?D%&?O@(->pd$?wBI%7OTs_?yx)^@suvu$(2AW z8$Dg%1)cKc=|K>#xe>8;be_0}5HD!X7L1|*x&s7sg!@U57hvG&6oa+EOAO0H9z#+g zG9hR#+~selp{Cm&%C-V2$W;gw_%Is1{K&jbwgJfKZFQ&}%w8BTo26dw)lMZYm znQRU5u5;cX&gqgpDj9**yr&0*Vh{A=3I)ULf*%TBl7fq!1EgA2DGJhE&?tk}(W+n+s%{%aUy|cZ5J+lKhGnXG--O{FUhJNr z#gh9}Z!l;&?pZAYs%ZFv2j8x`1W1>uvqI2Qc_bxGHJ%&95@PAFf=?nv5BOnPOpXhu zWCC(OKt#cM%9NB>gQ!+PK|Mj>OswK%=>xd-2?!~_H!zmG@-$4W#k7H-fsmuZQ-n|> z>DQz}Y)Ee*?IB*Qs7Vduzyc9nDdj`A2dN%g@F|(ccp#&0kUaI|h{s{CpAOc{TIsoD zgLrPgpPw@>&%7P+V&YLQ#V6ixftkt=(K@2zCWSD2FaGkb1$fDR=*ZE%_rgro`Pu5Y zsgGK#;if9l$@judywI>Xw-|21nNpHMw^Nj@hMOu0H`NNI<-3XgQ5r-H=BsW{NVKq_v! zoRA>4KzIvv@>ejagnSSZYmbq&MkgRVfUMzx~Fn z(FNbbG`V-<8wg;)?7GUYl(6{KKjFW2>FqV|t%Qhz#H`rU_JLC>3%=-lHF~GAKGX1E zwz4DR>A>sNEfY>gHhIem(3)6QLI@bkieY_WD7nZ3cBg_f>F6Xb&#^%qq%t5{t1PzQ zRG6E>VErX(2q{D_OF#AcdBK@4g%|5g{o!o+gBj<80-yiiNTK{Ey2(_YbMb|RX>DFz z&QS6gZe|-y9H$3UaNLMTPWIz1D?-b#$TUfwS}Zco1vGXU2wo<#DWFo>928_W2L+wY zK|yG9kSOhsycGO(Q;EGpC7Y@EJj{!#&{e1>CA@3Kt`r7ExX>G5**;k4>g!dmgba4! z7(Q=cb-~Bqpd<_|{C!@K0R5Q4v~bK z=4!!Z>~)XmJGzT{gOIEOzVh^!M&Qz5(z`6{T`_8d93$i3KIz^LO)Q6ZOuBbqPR(e>6=j+7ONIJf|*B; z!#@HUH6Zcbq!)$$nePGV``h+zx4wIyjQc0@7|JH<5aybW<8xluglQs6lG1ex+o{dI zAE2R13w^#4Uw+cWYo&yA`!n;zV_&FV)mDO@H1X(36Aw?GczDh)(FrXl(houn@Gbs)jRk*R~fE*us zjIY(S<-FNop@Ty&J3=gHriL6G`f@fpH#EEsnC(CmBn|ulhD^s@vi64j0+Az7GCqe@ zy*P&j!HYOCkfaFWbV*9VG7k`$;X#~Q2^|cb2{intgz`mhJ9slb(K)gp(yR7D5^7g?-Q=*K))i%JuAoi5paqe%Z)(! z!$qH{t56mpvt$a#%aE`L0XoKO!O=H3$w2exWw<~R>LTtOG@B^tf|_tcNxmiaSiqS8 zyZocGrcR0OQa?iBr{G=@IxZ@RDnbp)?_$jdD+E}oq($okGWX{OLGXj`dTGeS9*kHo zL`U$hZHRkLkRYcYC&t2&Vt<%U^N6REL_c;n3rCOK8pE1js~;QR!H83GpyLH0=gPO&IuF=PP_&1=!bbR z)D`PiY!(m=;PbiYpr6(d?>nK&5~Cx|w&Io`VGMOPfd{rWq=*&5VJ74uQw$nh+`=g* z4i-?;vM!U|2pA{0ut!beGSM)oi2&007A~`pkGegB`hlB^><8cg6q#XY=!8i2U!qn| zbeu7~Ea|+EfbO&xU7)Kjx%wh^QQ>$r$_Ehf_lNX3z$cfXN@`1>qaRRb9)L>h&>+87 zbkqz36rlYyj+v!>M53RPQ35FJG2#;O5y|?JkmaG*;D8H0>LBW)5hv$%v`rWKT2901 zsaLp0r~)Zi(JgQesfr*0E5dDPh}=T3qSx?+r*;kCP9PZ0MTwps1Rg@q5vrl1VZ|YA zNDOR2{R&|2!?qb!dTEG&sW$83*huvdsyiH|O?Df(t?G#-J0jxgZgyt8H zjZhYyWpdYikSZYfBp+My_hz^TcQiJ_7dfXk$#V|&WdO#3;4tS9P0%dYcF@Y$MmHFQ zO3M9o+lgCo%eAsYXr<1y{|8!3S7Y5{Yqel4?9*JDeOgrme!2OC2Sn1Zuef=s&LawJ z_}EH}qJltyzyo?;5_lMNA(%KKw+k+?VrCJF`WCUyf`s^Kc(l=N&7k$uy8vVu%Q{vd zsq*jWroURuz^sBh#B5adkw#%al2P2K414}#FUD@Jcx(Ne>tQZ-+qq{k&za~N(LK*2 zu$VgaSx<2VI9!|4_k0y2$_;W__4y_bVM9Xk?qsglh7->1opxR19iFix18Z}n|N+QvJA=*t~*i8!!P75J$S`dGix^O4HhjI&A@3t## z8U5JQjHls_yNu$-9?QDxCz7|^%Rtsnm-%2`-!a}XS=I=GR?~^)u`jxGZ3g-0Z!>uV zEul*=DEIES2=>xz49y5JD@A1iM(>gYK{;p02EZg0wVOt)N7TZ6M{E&0GsODLsYDo- z*Xjg;-Jtc^dU%xdFHALTKT9f>f=lZG_>;IN)Br+s+cH2{wU*7_N2}O_kz=F;Z94)R zx>d#7XZEyL%$J_lQtb&;0F!~=BCiImt;SQ!Lwkz6z??Q|X|P@Ez7g1Vo?WWN7*F`I zS+4yu;DwABhMi{#2^Cy0m$4Nxrx9ty`8ns1B%T*#-My8g^KKQEA6O40lC6(ob{@el zS#j`}%ozTzJJs58RNZWFS6-dAu5J%C`?2c)hlA5ut*q8p2?LQ zJKJ!qsyEyWW_{a+}m3c=%^Q6D|`pT?- zQ;Ra9mpp`dFH zI(;gzax$>;+Nr5kJ11A|ydBu}es#^&3*#3i2Cg5=R&UJsHoo7~JnajPrLGQ*4_#aF z`ubPb!=|tP&H8sv{EH{weG(ZiDZg@bbnoc!Y^CJ$k3REL{}Mgl*Unsj>U$S&T+FW8 zemk&(N)3)aNKSQYM7jCzXZ(TD2eGH23I`ofXkOjMOzozd{+pkAtLx3K zn@2KLd*9ji-ts9==cK3e|D;`gN9DWh!|R{!-F2W<`oZ$OEAaSh=SsS_x(=?l{`K~j zgKMn+!x}rnd5GACkwnkSa|Gl0&TQC0j5T7#ZZ;rkx=xc#xIIi{gYe@V3JXRC%$te$ zWEBqai*%?fAWrPRHWHL-7J}mN3L-{9KMJ~*PXD6_?XX4yeh_#m_`}tyTW!}kWuux2 z{ug%QpW=yg^NCh(n z;to+YOs~9kWO~&I)2oUgr`Jud8b4~_t#&2$;A~~H{irj4m=qmxRJ#fi2Km$ zJem%BEHo5?t^FR*HRvF54a1$6_72F!+DTr}!jYVvge%czSy_s7EWGl8t zZ#|NLz<1-YnTb_d_tIPLov(fR`eQc_XIJjb*meq5M=g&Z_=qlfj*Q?I3JRk|cWV@* z2;o`85{00U2;@RBAM|Oig>i*3@LFPn;LsHjUQ6r{9O@!Q?8c%KRNM=``2@it3lPiE zo8Fv_sEzP-kfJPD>Y<ykk668g)mhsPM1|;2^@36PE9mnAme@2REmmJr8olfbCt;Y3E#6w0~;FnAo@gH z!}lt#k6wbGH@M267IA9GYJ@3R0s=Y`!?1jdld)up1SUeZm`dnt59A?SKHHA*!Ml)N zu#tj#7Ix1G==KcvB5GNh*}0w%7sHZ992SDLt8Y+2d5YF@GCWICcab}i&YRAVwB)lie8p#`aprZ4gd%_p*aYiAiEo6(0^e8b1r z@CXqspuZu8gB&rhJer0JKGq^dBNzWTdMVmFxZra-8%B%&q#QJUl+bcJ4kw0l8DliV zr@+JxLNZ1YFf}E@#sMwKp#fOZor5XjUWk=H2f$ay7|v1g4cP*s&$Pj3!wZsy12k3f zFHsl~@~Q(t7nRE^Cws-o>m-aj{BTFYNz_prL~)`*Y;|=XL^P?x5hy85 z0E;CLvewWVIwVGeH!-zeY?^?~E@1K|LO25_f*Pn|P0>uA z26=U-o@Hm@?VqR4~+(&C$9Tt?{ zQrxtQmMr|qb3`VQi3K*wYVWYS0>2P1F1S)PZ?L5;we&S#yxo>)e(}qNce)%8o-3qo zU4A!=t$p3PVZ|`m=5D9{UGZHYjbN?yytTAgpDPT{8is`r^3&Tlw8)MYg>qDR4=$i-4N6A8k2MB*g5CaFmDdN@dZN7IW zD>XnZ=P@I#T&XeGVw1zS(GvEx&|E5*=~F0E>7`qQZhdr%(v2LnDly!0E*<#j_(QQ1 ziGW31!rX)Hxyl~Jl+lI4eHi!TGbj&2;Tox$4*GRZ*Dk}OT$2sw?_{onp~siK(+z7z zZMSheuKF{;Cj`?*7Wlp=Hu#U%-)U@`xbV^wqX)jyF^$t$Pk!+vw#4oJz9s@tN^wX3N;Z zuLK*ZvF*^n0F(7)Z5ilHC58|+7!zD&B zt%4!CgBY=RZaN?ow6^rJ~2UL~UnzKV%^A&8dFngLu*Yt%<;B^khhG`Do7eG7zv zE`cG)N<}!V+>0!s&Pu9BFki$A`pN1fAr4d?LK0;^Zg~R!%H9O_yF|MgZvY=*6;4+( z$Si#E0s+ob$XXbK`BWkQckAF5ee3tz{<7_M^TBDa|AnC|Loe^2^e(wmUCVo5w`HrF zGrs2Ois04S@!FT8lNHMgUa9i5Ow&eaSeoB#e*0i{^FDZ4&-nJk#B5acpk`h&NGQob z^#gzxEpzNZ3Xz2ucHCED&J|rA@DA?dU?B)AL~<@QW=Z}jQku(Avs0EBewvGcQ&EdS zeK$BCv!E}LMRAFdmRwL3HUhts1BO}D+0eoS&p6I5TNwL>3TjFxat$tgZ|DL{d)JHa z#V1Om;5yq_5P_eX>MylKduM<)%(Ya+kS`HO-BxI+jb~nqR~hkI==W~1ex&ar-Ut4$ zEhhO;!KElBq_wu-C4LUuOi)Ooyn;*X-Q*{awqfh~4>8)U1r^87->K~z7k>Xcv|YF3 z{RbKM%?s=PiEWona{$9-DjVO^K_Qr@4q*mkj5-u{*|uzb9FXb<_KA@S02D4z5HpCn~lIzAIXFeq?06c z9-p}ma}!~B643`bjxp~9(;9ZUo3kD3KKd~8R5{zHDMoVTOi@e_dYX8m6Z?(VKetXq!@`mIZcijmDGgbFx z1KXzpyC(y?afS_98Nbr~Vt2N&^{#MtPOxkB({p`(UZ>@cE?d_Gj%sJnm4eXo>?4JzmUo>ZSu~wKhc!$6XBVQbO?bz#2 zy!ym-*}wx+fkTslLyOiNuFn_tIMsa0yK2(A>Y9@EuFW{temoDz57d7s zxymZp#mrZqo~~aqRlj+%e)G-E+4}o#1@1GK{JRgxuX(IXkpJBz&8T-PgAcEe{&vNx zN1Ckv(zCZ5kN>Gr#=W?9__O#VUpovWT#TSDM?7(c1y>U0Oz=Ts8?g(mGPca=rYo#f zc7#VUG5@}_%7lE(3T0Lkkh61LjHqGH80;~jU!cwC^pU2DAawBm3Dq+@s9-Uf@;C+v z%Gw`dXvMh}EUqHKm1e+5v}=JHnmO7928?@9XfI1(1}Bbpqj1}YsrtOGAvf(5LcE% zEMVghOW8QYqBaikg2f@?=hKxW>{bnPG)*=wAwrYA7iBEaU*ByKI_pzIDF9Cqn;-Rr z36kV4uDO1O-m>P}TXaL>UV2aBN~Mc##MCGS`f6THi66O#zM90w3f=Zo&pQ!deRUJ` z)q7-V{e~jC>YB#sI`{}_WKSWD(~UUtHZ;Aa1^3xty?xmXT!Gl}#3~c0nJuA^*vm*E zv6YcR9&#R1Mj<+TYSv33pA@W}t)Nh)6j(Lur%(WKbCmB#?WJ%iQscGnx?+-v6C96V<6*|Cp}w|H%5EjRrpEjOO5 z<;GKJxv6V<(S`bjZlX(`JA=Dfcg#E4p$~?}))sLZzBQu`oJ|4mni>b)Rf3pOI+sF^ zaW2sCx>@rJ@12+Au2P7LJURP`K^S+3t3hL&fD%Dftw2$Qv!P?aP*9!jCm$W8;(`hV z$D}~vh_f0<(+h)e%`t_*YyCq)2gK)|)AkM3svp+n0}1RHAd7UI-4MOh8$Hj*8VC#d z9&CXi18x+N6k1XuLocbj8+zeLOzazg33wllb;mC%9*OnS2VmzTHiH;RpynTdh7Jcq zv37|uFk8fvu0+!WapP6JwYsx}vchNF1a2k8^MMsm?b1um3FhmI);c7-*s7-LhtP?I zR_SOa>cB2c_&A33RFJ0e;gZ$LB%}TCl!mrJQ78_K2&-zakT}PoU-DRQOy8$8*k$RAaPY=pw~iS@mC656OvZP#|^ zuRsbBp`O)8dO9}U6dUo0YC`v17X3r1)0Lus%+h=p^^v*>Ki_nH$IkDU{$=S;8u#Da zG!dT&zY>2j{^O?BTaEiiU1O^!opr*1{Wl+4rKSToM+5o)lbYR&^kOI83bL-4@EYE- z7m=_UC(^y4jt)5m;{zVx;Qm+0Rr$Yg%Nsg^&MgFyBfS-vqsUM#Pk+9>I^5WN=Y)i<^xY})wf-@OzeB*@V5?6*0+fR zPCs8&BMa|j>fsbLzRGcYVm3k|GCEyq6je_7u0$jp#AydoAWP6LXK$RnUEh}Vw`D5Z z-^Q^NJ2OtzDoO1QdgH;Qd>h{} zCH8%NS$f}FIkxp``*{18p2;|ygsKj2^-EXPIZ)siEOg|d33n6~z-vGOr@DFr4RJAv z%7I~9W6Z|DN(D>zWsIDJ8uj58xft)rGc z3zl7{A#g|OW}GPs!Ss$e;1obDb0Mf>Id*oY+nCx?;Ox)mp30Ie*@q<6XfpHT@1U;u)v>nnF6YpQIrql&0deKgG{-5Ai$ z0wZd!5Ey+Pp`0}x(>;P02zb7T@0Bm%rm`hHJ=$VLv~s#Eui{ly%jXgQ8$P50mgA|b z>GAZ}9vF4r36Q^phelm9?!bie7PiF*qwPDsn(4r!(}7P-2k2DPib@_HNCe&V(}=jvqpG5I40j8Z}WJIX(_$o5@xR)l6L1ae)( zEz#qa%sTw44+eVDR&aXKR&YGA75vwBJOzPHMdqC*rBgoSmyZ@V9J4K5J~J#o+h@i` zhP!V=zuc#rqAL4`W#tGkfrZ+RBacyvxQ4Bt@MWE$@iy>Sim)hOa44?g934wa@oLkS zB;8tN1a7%a@wzU01fEp$=r_rzk(M`{uekLRC9NcAv5j^}#wj}bSLi7cucvfz{UBCX z^qwQ7i|hG4*`D(S9l9e$Ybjs+u1fpG@5n%$FMg-1-uPXE>751nn93lA$fRm4R#$Io zsrEhjBV~W1df$B>o551F7V~BJGi7DOGA$m;2zWDlVv&@(5Z{r0QTL+E>=BqNc#&0T z!?n(#=rax*x4}seg)R=L7S?d3AzU;^ReMv=@Av^uD!v*n50%6PcngF%qPhhg984?@ z7D^#*Nl6TZ!WzTJ`IxNu4zUxA6X`8`Q?yB%SP*c3V1FR8!scf(&<$e?G-?_#EZ{`h zYtokH)@Hvr7l@Fi^3Un^&*(-Q4R|&yq+J%q2qP3C0~3YB1njv^@lxnV6t@ncTxl$s z96SY21<7Qtd~Xt)f@yEB*iICnq@O`jATT1^awRGcoAaC=#OZj^2(P9&8?!V(yApMo zppuE*V4kCe(D71y4LN(M1g~>PW=dR_(_^PIRn2$cU*q&^_SaGqBe&h_$;n{#bam6j zQ{(9|8~i>6nkFKzJ@(xL*B-g;-+ZUG>E+~WTdxORdL~=DVSL~FwT%;zm+BCxKqg;n z9NjllT|er1zocSp+1I1DOB(LLQ{k~M4PlR{h>P7W2~B$|fc#5bUq1fq(Ad7QhwgZT zqh;#vJKoCCQVKuz?9=#m)I;GD&!+Eq{iE(*l=#)OzFA9&tKyEgc4FDfvD@A?cdAxQ zS9QF%?7hHy$1;IO=d70M%2__U#47ok;f)I$qbjrRhK#M@<9QcMbKw5mRWal7z3;Bk zUd*}>bvH?K^oLDL4!EShcDW8LvHo?FjC(I)^$VDqE_v=g+zpSR<}-BQ1j8zvU~tGz z{11m56dEdl=RNOHoWz)jKM2>%2QQ_RaN3(9QN@#xg0+NNTU$@&N}}-#7vN4pz|lAX z!oSDY%B#3_0vyPuKp{p|d6;f2#wzgN_zn7qZdV8bXf47KD`gE?TLZS6K6hl=UH;rd z)8!S4-dlQ0hUdD^W8~tf}4Xu^sXn> zx)+jP)$1=;e1a-MdGO3=ejr!c-Q72s8dRcihe92i^Y$kCNg9AYNw$Vh_2#T}!?wLs zy~>y9!@ZORaT3ZUO78$BfQhMK5z#uhf2G^E=|+oLt^{Yo4M6&=&?3V7_Q>9lL^D)` zLWn+RAB3NSBrC|owm?GRxv~>aJbJKu|APnjKituII9DM`>W2SpxId?l!LY--5FDXK z6|!$q2nFYSc`{if6Gsx4P=~>=Ujf@JTCW_X5Y1`j9Nkj5=kA!g*xcQV##MI#8W>(-!lGT)WcYZ5Dq)75w7qe2e2`T zAw)Q_A>_}<=O6f)ZP_nvjX$?7`MGW5Ohw&T1zA94>epo} zS}vFW+Of|fSAHPTef}YvU0yK(Z+Upk`+{=wSjW7C$NWZ@+&IxTFX1s?Q!Uqw#pWeE z=C?*I^48HOCgfLKFS@R^;>@#oiK6BowI7h>y3wI|iJtSF7Oz}R8Q?L$;+B31XoS~t>p;zD!XLKUdvUxWmRgo)>4v~eCPtINe-cbA*Lo-QxG_JnW1-{t4LjznOfq^pF( zPJ~OlN)dLc?nH2)tgDQ}9)!!g$~o*sxT33q!#;#7yDB;CN4To1io*eftGlW>T!L^- zR}F_t5w7j3Aq%wDN3Go7AdT99>)0kXnuJHg%_3gYR~Am)fk>zT)iK zVUvzX>bh4XweCI4JUv~F99NIH^;TSyS2F*pEoNxtR}HHhP-94KRX3uIos_EHvntQM z>L%pbm5){L%ZFEo)ZMCr+|8(GPd-h(U)_w@7WD!3L3Im4Veao%^mm)p-&T~_TTtd9 zbvtt2qc-rr9dFz7X=X@mQyX7#b=^B`3w`C6G!Y>=>yIRpsdOYAPbKxvYjU=9Xi$x$ zW8D|E$lzd1Lk{0#DRn3jJ2N~O!>^JvS|l1f8;PE$h+ooLA-1YpjrB%`66x-A>{7a0 zPpdJF%C3!14W$uZ+1(pYs@-Sf$%r*zzJ(ai+>yD-pXwVo$ zRz8)LpNJZ8NE0Q|?zKyjy!<=@*u8RpVJhXolacz7XZ7=*5n;k?zjJjCNiy@CmO{49 zJ910No^|x6;>oO2A56s4S!W`3k!Q$}j10tdYFoMU)z-e$K&*8j)fX9vsI6LTFr~NN zd(S;Bha$sz%gNrBgDExE`czyWiX@cN=^-_qQYcC}rKS2~(X`%rA(p(*nuwom9UM;g zrINeD_ukj4V=Y<+vA&UWF}*dKh)2)24yEG>Jv=y^^>(9;_@#L7u(pBvfIppHW72}Z z^zz<`y_1Kgj$b+c=81X#=9~V;Ie+84KQ!wIEhCRqd_tR$@+wWKZCvV=Rr!^`sGPPY zHzQ9-CdgxQ>?8L)4Zzfuh|)Whj1tr;dP+(6Mbb(_mc3CxtP#4bf+gACK*C^c<9 zH1(Tk8TTOYFXbt0V4E~y%Sdr4Bfl&Ek$hU(Dy7Zb(l$x6%hI#buyj$nWPet=C|{Ea zY`llf`e~se+BrSzI)9PB4(gXqV4x^tS_8gWx3QN->hwr&EQ&6M_a##J>ife+QX}%| zEqMKUOv>5p-ttc>Yp1JbE1PC&<|>mK^asp=6ZKR5GR!Sch!dc6_uQ zc8dlb=ckJ(*~)`;rTYwr?2UE!lF)dB-cOjA(iYf7AIwgL@RfRB4@?7|ib12>0 zvN!9-j!XbqhTK_ST#qO9bR-##Wu0e-(=h;y8jE5xX6^d0o~=F?OZUbTF@)2xfmjkL zs3{wGG8v~#hczvwA!nL!s*_t5IKWt_fynt7VLy$)`d<9$PvbQv{lZ;7x&7_x8}3a6 zRC^XG*G=uavhQ8{P356E<)L}yEAy56W&`_fyQDyHeCYMISx5D+Z#$*31_CuR`;7Z) z-F)Tl>w(=lJ7VwX<*56Qx3o*rhtm4?jrI>W$aqJs6-6qo7_WQ{Vy9@PtqqM7<56XE zbw+I&n`%4%Ab`-B0e_RR)k~vy!KS13j9r(99T~gotV4~e>pY+oW1-a%z}l!I%plx} z+AAE=7u9F>kILuAt@_M(qpwEqwWh*c8T5tvZ021tMr?XxjP)3!ob+?QDb{7?)8sdr zzNlX`&in{fAB`BO+&{AG2}Vb>nWCwr8cXUiRl)Ys39F}imA+VF(A-laHlOd8{|8TJ z7SoIx?#LdE(7_!!d`DJB?BQ@Yv+Qq4LqrZiR02GZb)5@sG>BBH0eQFrW8R*q*KoQIlM zj7Mz5THc5zD+I1YOLtRyS_iUz1%LV}Yy_ZqmsDLhb?nNq>E8LO?PHHExvQpa*WLBN z?3107FU$tFjysU2r2O*niQ})I7(4u_A6UN}QJ#|V$6vZMx#zmOcA>0#GBSB~(mU>4 zs;nA2u~=R;`Q)4R(~&D1$BzG^vSIqk`O2-IO9AJm3HP`>zGuNx^|pQb(6_uZk6$hS z&XaTNcFlQqjR%(ewbMJV`?q}(C|~jiCvBkN`fHCYRMt%Gy|Q=u@J!=O`&Icnho?K| zD|cNF?4s;#^ZxBuH(wojuN8%I)o3BNPAaRsd}-p+wDa}fpY?1+Po3r8JUH!q^Z1-& zsseLt)e4s*ZtcU&=HS!{P79bxST8D za<6aCl>tRDgK>Cz%k;gI$L9STXR7D?J7yg_1m(f(S`Tm!J@WD^cuz?&sY_O+E}JTM zSzNIiFuCIVS1nQP;GrFAspNTtL3U2Uk|<>e7$Og>c!WWuR(;= zO4WyWzgngG@eP3AuFiT+L`H@?fa6F0d%KcASRsV30Fut@N+NzfhHaq5&J86Znn*c2 z#5|3fis=eibTB-L#IQn~uaAH(-4|P%4;(uf=K=6U12N@nM2|<6XkRRf7Ge<%r9rIp z7^qe+73XTG6U0+0vwIG6nsG1jHziu}DNl>bBA|;Mcm1B?i-N$1jK30#K*a zok#j0C*4--8HtEK6MiedSq=n5W^~<<4w`Wp875pVZF_zYwh;R;_}7f> zf~3`_tF3gDH(7~(pv%>d$+|#rUQsU)=8Bp_j!un=XJze7D3Gv8;nYDeL4PAy?L+#}d6+j|mUj zV<@G87)ly68IpDiFP)}RAUuQd=mt)Vr@OmH%1!7Fn^D9?>#yQ9CfzQR>Kopvd#i3{ z?|fbJxZ@4)Le)C{tW)qQS*U5i$8UT-@dWT6xajgj6Aw+>ulv_8hW5Pw%m?WoKlAa0 z`Os5yfgR(A-Z(OO=BL#=mVycrP>d!+K}$!Dh1^JUv^mhGG?+j*m`d7-AB@+~Oa z#t;28ut8u63y9D$T2=p2UY2 zhZ$Yim~KKv47hM67T37Dcd)c zBsc?QXLQ#%Vrx|H$ooT1?QztZb%00KvOz*xku;P70vYktF$7+dc`jFQyWQPXXcf?j zs6R%X`onmUKpMRK;KYNo{*8-}r5x|L-*UhC@N7U?DBt{U>-*b&6#8Lke#^eu%@2R@ z#E%{S(fgtIgRgzOc{X@r)^lR*JX;KH2V*UaJ3k>-=%qmM_|uRwSF8X5-m0hgTo<2T z#9E?Ez8b`mIJoNhp6xvY8!}TX1G8A-6!4qWZRO7h*|*G$fRMCv)TY{1N5VVc8-*Nf zV_e%`toOG58nayf`#q<*Q8KodL3~GTFWN53rX(G5jeP$kAVbenGLWTsx=~QO;aHk! zok@L2Y*q&1=lVbhBk_cCF`n*Y@!AQ!UepB*qeh?|V=TyQCn*7}*6_p82T3p#V4!A% zn+M@lNK|_QGn93oJS~JeUtU$Asg&Y@9LF6EIT-Y_Htj-Ij&Y(+b5DI?^vlR*q{PA_ zw9lrH!N9sXpA;xFw!lJV?bL%;9vtt?+1%bo7Pqx7lvPc6uXv~Tyz|go56!55KJcA^ z_s{(3xgS3Fan(=O|NZ*gcH8#SxxnV}1Cx#$Wt(%QQe`zzv>Qz5xcAq${Zd)&=aSv~ z$gM!jrxoj`5505jtz%c)e{lTT@f#Hne(?BgVE=D&ZlvGQiS7QAc3*po^kIwlfMWmf zf$ay@+do?GM0ka^fN&~fW162YL}lv%=15=te3{-&mWJhFIb<8zb&%+ufVUyA@?eMv zGzjT5gTqpQfr$ON2xU^Z6Iu~MP}&)K_25;2f;e)d)S7rEq1Px6=|ILLqFn;@KwES9 z$i$J$k4-%GjgvXM6xg&Dw^#!wZTJ@rTr0=GEi8_V#*^nEj6qH?uVyL7Qb{mr+`rZP zOt~1*d4~Ztp9Nn-DARqvgrNZin757&tzf8Cjq$OB6?iUM58`6BN zh1`Z1UdY0Z7`X}-%-|kmZ2)Q4jNR@5KIl$EwGP=8A=dR|ZRxWsw|>@xeqCC_d5NeG zP@PVA91|6gyd^h1%A7~}sb|Yt*dvJI**Ss0-Mf4@DrWKqCSzo06qR+5dS7g(9<)=i zlV}{2xQdvIs2@{alI1bup1@`Ag!c{qA|&KPQ%9~Gd3|)&)4&4)o;;3Bomm&@-=gV` zkWYIG5qE0v8;Z`99zF$L`2<9)=MeLP;B46h&djqr)7Tb zKtzunHr2^5m>n6S3{@-A%%lsPw89KyCUJjWp(aFsMrxyxv(fM|%rImDO?2!u<{(r; zGf#3~cX!s;-3CLV+X-Q8b>xxh$qcXz9)DEO_XQK$ACy(07?E>~=80$pv8UKi;_ zx*aV=FT#X^O3{#c+>}>;3$ItC&uk8-Cs!d=uUpu(bz#Hyh1!N(Nu6{1QbkkFi7)g8 z!HS%lLLRAdL(WSfpH#j+=ciBr?EW(4Uw%M#?p$`+osY@OzA|UU@;1A(VcF+&)-9LH z&Z?Zt<=nbd(VTPQi#n^Ca&8KFq>{}!FNJ)PuXNdu(CsptQ=kv-YZTqI9)sPNm&Goz z)CnF~D;!;R)vMa@b*Mh551=+!qYm)1I>Ds|Se@X8nt{{_o?&;WG#hv{78@i!h`5Or zN>mG-RG=f+n=81rVH0^|oy;`@zDVXE1sJr*RMcb=Xz50(3tO>7w7)}=P9iKe*p?mR zj&Jw`hA_s9gaRQcj329nq{4ih8S?R3;YfQHY1$vrs|&9cogY90(OYj4&y3 z3WgzVGXkOs9if$Inm5Io$ro7qCzRWbmw}~4Thv4Iv5<2!V(vcmtC6ow`#qEs6W@bS z;pijyy{2D6gu02O<#N1e(h1qZo;M%dH0vqCy8J))a2V|r?;&B5H9Zt`Axnk6NiSNS zPT+qMo3)qeWnn<=_wm!jx^Ga@AJFS1di^0Kd9_z5JWj6(dgXCk9-q-X6-8=XBfb6u z{`3yKUXhk9Q@M>o3J*!6iqAwXH5Psm z_rh?O!KNc*Fjk+jYyP}V&EzXa<)kl9rt`5V0WLTrz0_DJ;HRlxe$tj&D{m+3wVMK* z9w@MuSn7gNXA&xaQD?@cZO%9^$vUhTstuMEtLGVKz6G-`4Hga6&ejNL(uuG`gfmXP zJR|p)m_5pW%~231zoPD9eYR9?+9QRkJac!D&Elo6-L0LBtDm;Oswd+#Yk?Bcb=RH} z=Hdq`L}OpWB1PIA5i29!K%rV7U2DZ#tzdq4q)C9{M^n=EX85I&H1Q<-fG}9~VD(Ef z4&7h8HjMgiqq^(-hn$ge0L>{_I@3x-fir>*M*+yus*;RdgsdH7C39MZqlW^S0fu@| zq_9vS3;m;VR;Zq#O;%Z^h(%Pg_q37J($+IbRrerMG=dyt)`zfuA+ADlI~!vOO&=N@ zglWY`k}&C_)p&1jOat;(;JOlN<`(s4?h_mw;#w*RlWH2GJeN3_8i1}FO+y*JqRD0< z*RcAVwd*NzCV+_8CJMHoxx-0)2tFgo36BHHgkcV1q^9zfwB)3$ABgL)Y4yg>AvXq> zR8GW`LzjebMD?5&L(mn&!i#y}>Yj#;i5wVE7>+5iA_WZHI`v-o#TZ>M25iiY4$+Nu z@R03bZRUZ~bfFY^!kA@>)X$zUu*qRT_4F{93F^Jkt$g+;VgsoQNNevreGHw2^Gv=3 ze$!$JBZE0XmKh_FN}ad5BkUeYGNXe`P_Vj#Sts+pfDKWDp#U

`-`
` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`{% endif %} + {{ msg }} + + {%- endfor -%} + + {% if container %} + + + + + {% endif -%} + {% endif -%} + {% endwith -%} +{% endmacro -%} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/form.html b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/form.html new file mode 100644 index 0000000..3be7ca2 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/form.html @@ -0,0 +1,343 @@ +{# This file was part of Flask-Bootstrap and was modified under the terms of + its BSD License. Copyright (c) 2013, Marc Brinkmann. All rights reserved. #} + +{% macro render_hidden_errors(form) %} + {%- if form.errors %} + {%- for fieldname, errors in form.errors.items() %} + {%- if bootstrap_is_hidden_field(form[fieldname]) %} + {%- for error in errors %} +

{{ error }}
+ {%- endfor %} + {%- endif %} + {%- endfor %} + {%- endif %} +{%- endmacro %} + +{% macro _hz_form_wrap(horizontal_columns, form_type, add_group=False, required=False) %} + {% if form_type == "horizontal" %} + {% if add_group %} +
{% endif %} +
+ {% endif %} +{{ caller() }} + +{% if form_type == "horizontal" %} + {% if add_group %}
{% endif %} +
+{% endif %} +{% endmacro %} + +{% macro render_field(field, + form_type="basic", + horizontal_columns=('lg', 2, 10), + button_map={}, + button_style='', + button_size='', + form_group_classes='') %} + + {# this is a workaround hack for the more straightforward-code of just passing required=required parameter. older versions of wtforms do not have +the necessary fix for required=False attributes, but will also not set the required flag in the first place. we skirt the issue using the code below #} + {% if field.flags.required and not required in kwargs %} + {% set kwargs = dict(required=True, **kwargs) %} + {% endif %} + + {% set form_group_classes = form_group_classes or config.BOOTSTRAP_FORM_GROUP_CLASSES %} + + {# combine render_kw class or class/class_ argument with Bootstrap classes #} + {% set render_kw_class = ' ' + field.render_kw.class if field.render_kw.class else '' %} + {% set class = kwargs.pop('class', '') or kwargs.pop('class_', '') %} + {% if class %} + {# override render_kw class when class/class_ presents as keyword argument #} + {% set render_kw_class = '' %} + {% set render_kw_class_ = '' %} + {% set class = ' ' + class %} + {% endif %} + {% set extra_classes = render_kw_class + class %} + + {% if field.widget.input_type == 'checkbox' %} + {% set field_kwargs = kwargs %} + {% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %} + {% if field.type == 'SwitchField' %} + {% do field_kwargs.update({'role': 'switch'}) %} + {% endif %} +
+ {%- if field.errors %} + {{ field(class="form-check-input is-invalid%s" % extra_classes, **field_kwargs)|safe }} + {%- else -%} + {{ field(class="form-check-input%s" % extra_classes, **field_kwargs)|safe }} + {%- endif %} + {{ field.label(class="form-check-label", for=field.id)|safe }} + {%- if field.errors %} + {%- for error in field.errors %} +
{{ error }}
+ {%- endfor %} + {%- elif field.description -%} + {% call _hz_form_wrap(horizontal_columns, form_type, required=required) %} + {{ field.description|safe }} + {% endcall %} + {%- endif %} +
+ {% endcall %} + {%- elif field.type == 'RadioField' -%} + {# note: A cleaner solution would be rendering depending on the widget, + this is just a hack for now, until I can think of something better #} +
+ {%- if form_type == "inline" %} + {{ field.label(class="visually-hidden")|safe }} + {% elif form_type == "horizontal" %} + {{ field.label(class="col-form-label" + ( + " col-%s-%s" % horizontal_columns[0:2]))|safe }} + {%- else -%} + {{ field.label(class="form-label")|safe }} + {% endif %} + {% if form_type == 'horizontal' %} +
+ {% endif %} + {#% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %#} + {% for item in field -%} +
+ {{ item(class="form-check-input")|safe }} + {{ item.label(class="form-check-label", for=item.id)|safe }} +
+ {% endfor %} + {#% endcall %#} + {% if form_type == 'horizontal' %} +
+ {% endif %} + {%- if field.errors %} + {%- for error in field.errors %} +
{{ error }}
+ {%- endfor %} + {%- elif field.description -%} + {{ field.description|safe }} + {%- endif %} +
+ {%- elif field.type == 'SubmitField' -%} + {# deal with jinja scoping issues? #} + {% set field_kwargs = kwargs %} + {# note: same issue as above - should check widget, not field type #} + {% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %} + {% set default_button_style = button_style or config.BOOTSTRAP_BTN_STYLE %} + {% set default_button_size = button_size or config.BOOTSTRAP_BTN_SIZE %} + {{ field(class='btn btn-%s btn-%s%s' % (button_map.get(field.name, default_button_style), default_button_size, extra_classes), **field_kwargs) }} + {% endcall %} + {%- elif field.type in ['CSRFTokenField', 'HiddenField'] -%} + {{ field()|safe }} + {%- elif field.type in ['FormField', 'FieldList'] -%} + {# note: FormFields are tricky to get right and complex setups requiring + these are probably beyond the scope of what this macro tries to do. + the code below ensures that things don't break horribly if we run into + one, but does not try too hard to get things pretty. #} +
+ {{ field.label }} + {%- for subfield in field %} + {% if not bootstrap_is_hidden_field(subfield) -%} + {{ render_field(subfield, + form_type=form_type, + horizontal_columns=horizontal_columns, + button_map=button_map) }} + {%- endif %} + {%- endfor %} +
+ {% else -%} +
+ {%- if form_type == "inline" %} + {{ field.label(class="visually-hidden")|safe }} + {%- if field.type in ['DecimalRangeField', 'IntegerRangeField'] %} + {% if field.errors %} + {{ field(class="form-range is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-range%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- elif field.type == 'SelectField' -%} + {% if field.errors %} + {{ field(class="form-select mb-2 mr-sm-2 mb-sm-0 is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-select mb-2 mr-sm-2 mb-sm-0%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- else -%} + {% if field.errors %} + {{ field(class="form-control mb-2 mr-sm-2 mb-sm-0 is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-control mb-2 mr-sm-2 mb-sm-0%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- endif %} + {% elif form_type == "horizontal" %} + {{ field.label(class="col-form-label" + (" col-%s-%s" % horizontal_columns[0:2]))|safe }} +
+ {%- if field.type in ['DecimalRangeField', 'IntegerRangeField'] %} + {% if field.errors %} + {{ field(class="form-range is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-range%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- elif field.type == 'SelectField' -%} + {% if field.errors %} + {{ field(class="form-select is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-select%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- else -%} + {% if field.errors %} + {{ field(class="form-control is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-control%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- endif %} +
+ {%- if field.errors %} + {%- for error in field.errors %} + {% call _hz_form_wrap(horizontal_columns, form_type, required=required) %} +
{{ error }}
+ {% endcall %} + {%- endfor %} + {%- elif field.description -%} + {% call _hz_form_wrap(horizontal_columns, form_type, required=required) %} + {{ field.description|safe }} + {% endcall %} + {%- endif %} + {%- else -%} + {{ field.label(class="form-label")|safe }} + {%- if field.type in ['DecimalRangeField', 'IntegerRangeField'] %} + {% if field.errors %} + {{ field(class="form-range is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-range%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- elif field.type == 'SelectField' -%} + {% if field.errors %} + {{ field(class="form-select is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-select%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- else -%} + {% if field.errors %} + {{ field(class="form-control is-invalid%s" % extra_classes, **kwargs)|safe }} + {% else %} + {{ field(class="form-control%s" % extra_classes, **kwargs)|safe }} + {% endif %} + {%- endif %} + {%- if field.errors %} + {%- for error in field.errors %} +
{{ error }}
+ {%- endfor %} + {%- elif field.description -%} + {{ field.description|safe }} + {%- endif %} + {%- endif %} +
+ {% endif %} +{% endmacro %} + +{# valid form types are "basic", "inline" and "horizontal" #} +{% macro render_form(form, + action="", + method="post", + extra_classes=None, + role="form", + form_type="basic", + horizontal_columns=('lg', 2, 10), + enctype=None, + button_map={}, + button_style="", + button_size="", + id="", + novalidate=False, + render_kw={}, + form_group_classes='', + form_inline_classes='') %} + {#- +action="" is what we want, from http://www.ietf.org/rfc/rfc2396.txt: + +4.2. Same-document References + + A URI reference that does not contain a URI is a reference to the + current document. In other words, an empty URI reference within a + document is interpreted as a reference to the start of that document, + and a reference containing only a fragment identifier is a reference + to the identified fragment of that document. Traversal of such a + reference should not result in an additional retrieval action. + However, if the URI reference occurs in a context that is always + intended to result in a new request, as in the case of HTML's FORM + element, then an empty URI reference represents the base URI of the + current document and should be replaced by that URI when transformed + into a request. + + -#} + {#- if any file fields are inside the form and enctype is automatic, adjust + if file fields are found. could really use the equalto test of jinja2 + here, but latter is not available until 2.8 + + warning: the code below is guaranteed to make you cry =( +#} + {%- set form_inline_classes = form_inline_classes or config.BOOTSTRAP_FORM_INLINE_CLASSES %} + {%- set _enctype = [] %} + {%- if enctype is none -%} + {%- for field in form %} + {%- if field.type in ['FileField', 'MultipleFileField'] %} + {#- for loops come with a fairly watertight scope, so this list-hack is + used to be able to set values outside of it #} + {%- set _ = _enctype.append('multipart/form-data') -%} + {%- endif %} + {%- endfor %} + {%- else %} + {% set _ = _enctype.append(enctype) %} + {%- endif %} + {%- if form_type == "inline" %}{% set form_group_classes = 'col-12' %}{%- endif %} + + {{ form.hidden_tag() }} + {{ render_hidden_errors(form) }} + {%- for field in form %} + {% if not bootstrap_is_hidden_field(field) -%} + {{ render_field(field, + form_type=form_type, + horizontal_columns=horizontal_columns, + button_map=button_map, + button_style=button_style, + button_size=button_size, + form_group_classes=form_group_classes) }} + {%- endif %} + {%- endfor %} + +{%- endmacro %} + +{% macro render_form_row(fields, + row_class='row', + col_class_default='col', + col_map={}, + button_map={}, + button_style='', + button_size='', + form_group_classes='', + form_type='basic', + horizontal_columns=('lg', 2, 10)) %} +
+ {% for field in fields %} + {% if field.name in col_map %} + {% set col_class = col_map[field.name] %} + {% else %} + {% set col_class = col_class_default %} + {% endif %} +
+ {{ render_field(field, + button_map=button_map, + button_style=button_style, + button_size=button_size, + form_group_classes=form_group_classes, + form_type=form_type, + horizontal_columns=horizontal_columns) }} +
+ {% endfor %} +
+{% endmacro %} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/nav.html b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/nav.html new file mode 100644 index 0000000..21ee8a4 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/nav.html @@ -0,0 +1 @@ +{% extends 'base/nav.html' %} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/pagination.html b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/pagination.html new file mode 100644 index 0000000..94b7687 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/pagination.html @@ -0,0 +1,7 @@ +{% extends 'base/pagination.html' %} + +{% macro get_current_page(page) %} +
  • + {{ page }} +
  • +{% endmacro %} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/table.html b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/table.html new file mode 100644 index 0000000..f33d760 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/table.html @@ -0,0 +1 @@ +{% extends 'base/table.html' %} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/utils.html b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/utils.html new file mode 100644 index 0000000..98aab6b --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/templates/bootstrap5/utils.html @@ -0,0 +1,40 @@ +{% extends 'base/utils.html' %} + +{% macro render_messages(messages=None, container=False, transform={ + 'critical': 'danger', + 'error': 'danger', + 'info': 'info', + 'warning': 'warning', + 'debug': 'primary', + 'notset': 'primary', + 'message': 'primary', + }, default_category=config.BOOTSTRAP_MSG_CATEGORY, dismissible=False, dismiss_animate=False) -%} + + {% with messages = messages or get_flashed_messages(with_categories=True) -%} + {% if messages -%} {# don't output anything if there are no messages #} + + {% if container -%} + +
    +
    +
    + {% endif -%} + + {% for cat, msg in messages %} + + {%- endfor -%} + + {% if container %} +
    +
    +
    + + {% endif -%} + + {% endif -%} + {% endwith -%} +{% endmacro -%} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/METADATA new file mode 100644 index 0000000..92f1ff2 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/METADATA @@ -0,0 +1,72 @@ +Metadata-Version: 2.1 +Name: Flask-WTF +Version: 1.2.1 +Summary: Form rendering, validation, and CSRF protection for Flask with WTForms. +Project-URL: Documentation, https://flask-wtf.readthedocs.io/ +Project-URL: Changes, https://flask-wtf.readthedocs.io/changes/ +Project-URL: Source Code, https://github.com/wtforms/flask-wtf/ +Project-URL: Issue Tracker, https://github.com/wtforms/flask-wtf/issues/ +Project-URL: Chat, https://discord.gg/pallets +Maintainer: WTForms +License: Copyright 2010 WTForms + + 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. +License-File: LICENSE.rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.8 +Requires-Dist: flask +Requires-Dist: itsdangerous +Requires-Dist: wtforms +Provides-Extra: email +Requires-Dist: email-validator; extra == 'email' +Description-Content-Type: text/x-rst + +Flask-WTF +========= + +Simple integration of Flask and WTForms, including CSRF, file upload, +and reCAPTCHA. + +Links +----- + +- Documentation: https://flask-wtf.readthedocs.io/ +- Changes: https://flask-wtf.readthedocs.io/changes/ +- PyPI Releases: https://pypi.org/project/Flask-WTF/ +- Source Code: https://github.com/wtforms/flask-wtf/ +- Issue Tracker: https://github.com/wtforms/flask-wtf/issues/ +- Chat: https://discord.gg/pallets diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/RECORD new file mode 100644 index 0000000..0feb389 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/RECORD @@ -0,0 +1,26 @@ +flask_wtf-1.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask_wtf-1.2.1.dist-info/METADATA,sha256=9Y5upDJ7WU2m2l4erWImF3HcVSWIZKH3TdX6klYpq4M,3373 +flask_wtf-1.2.1.dist-info/RECORD,, +flask_wtf-1.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_wtf-1.2.1.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87 +flask_wtf-1.2.1.dist-info/licenses/LICENSE.rst,sha256=1fGQNkUVeMs27u8EyZ6_fXyi5w3PBDY2UZvEIOFafGI,1475 +flask_wtf/__init__.py,sha256=x6ydw5SJzsXZgz-Y6IM_95Sy8VufRepvZH1DUIlFoTo,214 +flask_wtf/__pycache__/__init__.cpython-312.pyc,, +flask_wtf/__pycache__/_compat.cpython-312.pyc,, +flask_wtf/__pycache__/csrf.cpython-312.pyc,, +flask_wtf/__pycache__/file.cpython-312.pyc,, +flask_wtf/__pycache__/form.cpython-312.pyc,, +flask_wtf/__pycache__/i18n.cpython-312.pyc,, +flask_wtf/_compat.py,sha256=N3sqC9yzFWY-3MZ7QazX1sidvkO3d5yy4NR6lkp0s94,248 +flask_wtf/csrf.py,sha256=O-fjnWygxxi_FsIU2koua97ZpIhiOJVDHA57dXLpvTA,10171 +flask_wtf/file.py,sha256=AsfkYTCgtqGWySimc_NjeAxg-DtpdcthhqMLrXIDAhU,4706 +flask_wtf/form.py,sha256=TmR7xCrxin2LHp6thn7fq1OeU8aLB7xsZzvv52nH7Ss,4049 +flask_wtf/i18n.py,sha256=TyO8gqt9DocHMSaNhj0KKgxoUrPYs-G1nVW-jns0SOw,1166 +flask_wtf/recaptcha/__init__.py,sha256=m4eNGoU3Q0Wnt_wP8VvOlA0mwWuoMtAcK9pYT7sPFp8,106 +flask_wtf/recaptcha/__pycache__/__init__.cpython-312.pyc,, +flask_wtf/recaptcha/__pycache__/fields.cpython-312.pyc,, +flask_wtf/recaptcha/__pycache__/validators.cpython-312.pyc,, +flask_wtf/recaptcha/__pycache__/widgets.cpython-312.pyc,, +flask_wtf/recaptcha/fields.py,sha256=M1-RFuUKOsJAzsLm3xaaxuhX2bB9oRqS-HVSN-NpkmI,433 +flask_wtf/recaptcha/validators.py,sha256=3sd1mUQT3Y3D_WJeKwecxUGstnhh_QD-A_dEBJfkf6s,2434 +flask_wtf/recaptcha/widgets.py,sha256=J_XyxAZt3uB15diIMnkXXGII2dmsWCsVsKV3KQYn4Ns,1512 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/REQUESTED b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/WHEEL new file mode 100644 index 0000000..ba1a8af --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.18.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/licenses/LICENSE.rst b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/licenses/LICENSE.rst new file mode 100644 index 0000000..63c3617 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf-1.2.1.dist-info/licenses/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 WTForms + +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/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__init__.py new file mode 100644 index 0000000..be2649e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__init__.py @@ -0,0 +1,8 @@ +from .csrf import CSRFProtect +from .form import FlaskForm +from .form import Form +from .recaptcha import Recaptcha +from .recaptcha import RecaptchaField +from .recaptcha import RecaptchaWidget + +__version__ = "1.2.1" diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d55b675ff14e4a46087259b700f1be8cc0bf7b23 GIT binary patch literal 477 zcmX|-u};G<5Qgn0Z4;^%7FYnO3rHPWw`D~vMI8Zw1X32uBn~l6>d1BrW#cJ$23~`e zouN`B1QQz)TPMy{;fA~K|9v|9{93QCA&8Ilm*frVrxkxuTEWj5z!Qp4gj1B^0AtIg zw3Io4vt$R@4csNWX*sI|l_i&ft3h?i6<{y$fUAK&^IHBFhOsR?uMIBFhi6I}9vYDT zFlBl)lqv(^uBv~|LzbH`VPH1?#Zd4x0%!f-xf0P0HxK1rr{C$FwASWss8y^SxN7dk zFjTpKs%*8d{)VcGHLEsx_M}GXlq)Udn9^tT0~T7`lSF2mWHMnHi-_X6)TGz#wvX9N zw@>5tKt`Ng3O!+I^TJFbA)D4}!fLm$nkG{|o|05tlYC|pIX>w0`a}!E+c^tI?1pO+ z+tulvi3z1*EDWWce75ioGZ{@%exx?wA@t{gaQ?Rn65)zTwU}CG33ZYKexgH(x;P-p~e((7`e_2^s277+2evbZF`O_)&X9A zSFyI4ofpNJ$Fk#0o##p(h_KM)NMuJOiC>evEFzh0uJ<1h9T%dPv+$6OgeF7RES(fX zLPMG6tXR)W)v(nUmjl`@;236&KrPjFKa!bfOndVli*tUM0@-F+W?gS9hQ`w&e#TVLVf4BF1rK7;nG(VDjV)2*k! JJ&f?8$Y1bQt?>W= literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/csrf.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/csrf.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cffb16b7dba645c70955db5a01ecb437bb47934 GIT binary patch literal 14058 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/file.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/file.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f99155771b61d10438155665d279975c0d485ad GIT binary patch literal 7476 zcmd5>YitzP6}~gGFRypK>$iCX1`3In#=CY1Y3mpWjcrT-2SP&HRjp;bGq!ixhq*J0 z+08m76sb;26kAGbqEt%qD_Bs4NR66Bot?40 zta+qWo2%V3ckcUf&iTH3=Z{{mn?U%?_uHZV8bbbtFJ`b8BZWUhWRl24<`N{yg*gu6 ze1cC3VS&Ykge_?gJ6PNXac9`Y;`T&E(j9iQxC7#q;Yt>FLfjMfaD*q@iR?N~r}<(VKE)UIvvfbCS6k`TN_Ds< zTN9}L7Zwa~x*+vO;ZfNgODOxaG?fMwc&)(K?wFF0;iYbWI14Jf?Lc*L(!o19d1(`oi!nUjs zuuNi7KL+>5nEPRTa|%Vmphq9~jXF(ln_C2XM%0&>HB0V6?a* ztUnt_T;;+Z5U``%agygc$!V5J$S9|o6Ef+ z%d-P5Pp4%iv_Gb1q=dLn%gC{`h)LoenvN?`O${AZQinr{Sbu0Zs|}@78-s0+h18g) zvx((aaT~r#0U~CG~RV6W?R~(iS86^=@HM$IHtGM@~DAHPZ>i*J! z<(4l!=qjxKD2Suv)4JYwDlXOaj#XUo)sF8tsm=J-joGeM`Yu$im~C1)*7@3wYb#g5 zV|M|{lin%2?utZGQc{UTbay0@Ov{-B#yye9Az1%njx!RG)6qzTu7XOm5yfg0I96r| zOjN>~iZ1Io`P8<(U~}468^uuDzJi50pjvM5!7c0#mvA8HcEi$&!Jv3pp(?llNtPA4 zyjG@ev0}*{UC}KXlz>@B;+>T zu~zqE5^V45u~qbtOdn9)EnTMINC-unS)|oWdva^<-6d+78U%5NLjUxK7kv-EvxG`B zW$UFPR4mm|R3(a{3H~Zt>v8fqFW6lLx22_+{oq=vd(bdVu*rQ~1QtaVwIN9Zp@^B` zL|OuU6VVr`&1yi5siGvBip|u|1dEqPihvSCX92z;6V)Ec&3rW!|NH5T7?n~Yc($~dQ57~UHJeJOvPtp40UTF^7V+``SPL3U z6b--(Xu-@NK7+_4SpY?R+`_&1ts6z)+Y6L(}9a zpBL0-t->sqCvirZ%y;7nhFQ%K=mo8zB*?tkmiau!-32Z?p}GZ^pi7HU`A)bz!cp)E z7E~@bq4J)F*}PDzf{_S-QXȃb~`hze+s20Zz?&hCA~eX{Kr2WR{nF8W(f9h&jC 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 T@pWt_7dQJmV(yDA6zcx~evl1K literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/i18n.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/__pycache__/i18n.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22d0275d82a5e262ee484569d0dd140dd9a9fa01 GIT binary patch literal 1834 zcmZuxO>7%Q6rNeHy_@w$X-U9I+R~+}s+cs{n4%H_s;F8CA)yqSss|rfZM^H)$^N)A z;}oYZGExpfMZf_m5%kbwsvyy0&s@1U3R0p~B1OQZw@?cq^~9U8H*u~H4HyqS6L zoA>SSy}cTO_GjO3rSD{f{^Ca5z!t6LLAQz=@(D3cz*x@9Vk~<} zKb233ane(KHLt=rmG5zsWt7(>^f7YOW#sg1NbTeEX$iUMjkbaEdQHowpK&XTBZXEg zm5?wPrVCX<+<;kjrNUQ;d#CDBzM{>!%<{s5?YUs}`YxsRoJ*~W%}QA*(r*zvpq|aj zVL&6DbyA@!bNC4Cg#usp+!u4J_f1DJSUs_K9nGL@YRSIo zvMLFv!Ah=C2!YrFGk`|se#wk(hQ>7m+O@D!Gm0eijiP7Mg|S(C*7c0LWmYn1=(~m= zI^|-y(5AS(Wjaa_d9!}pr!r=DKl>c86fbYJOjDyMccZ*FHsH#4K#nTgHJ#I8Q{;KsxGpS`s&o_unU zK!dp!k_NRE9nKqh_gm!;_56N1)08tUxD6dEZ_W#EtwDfQ-1DVY#~YnJPlLFEWuzR;MVL{33=|%D4f=>z0I$rYfm>bT9q-JZ0~gAnfp+yXTl(1*yfZYs zHng(XRHxSQui9hn$>pt)DX_=@xD~qPdno#wu=2{}OTYY9zH3cuz z*<_?zR$%+CWks50fvT$>AM2KN2XxY2A*bLD!ufuT#6IyxqHF}b#pB?DTt?3&DfvN5 zO(iGVj$FIb*WE2+oGteBsK>}mEhlcjh8G+~a(1m^N?S}F^HGl{I8&Bhje-MY$ O=)~y self.max_size): + # the file is too small or too big => validation failure + raise ValidationError( + self.message + or field.gettext( + "File must be between {min_size} and {max_size} bytes.".format( + min_size=self.min_size, max_size=self.max_size + ) + ) + ) + + +file_size = FileSize diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/form.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/form.py new file mode 100644 index 0000000..c7f52e0 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/form.py @@ -0,0 +1,127 @@ +from flask import current_app +from flask import request +from flask import session +from markupsafe import Markup +from werkzeug.datastructures import CombinedMultiDict +from werkzeug.datastructures import ImmutableMultiDict +from werkzeug.utils import cached_property +from wtforms import Form +from wtforms.meta import DefaultMeta +from wtforms.widgets import HiddenInput + +from .csrf import _FlaskFormCSRF + +try: + from .i18n import translations +except ImportError: + translations = None # babel not installed + + +SUBMIT_METHODS = {"POST", "PUT", "PATCH", "DELETE"} +_Auto = object() + + +class FlaskForm(Form): + """Flask-specific subclass of WTForms :class:`~wtforms.form.Form`. + + If ``formdata`` is not specified, this will use :attr:`flask.request.form` + and :attr:`flask.request.files`. Explicitly pass ``formdata=None`` to + prevent this. + """ + + class Meta(DefaultMeta): + csrf_class = _FlaskFormCSRF + csrf_context = session # not used, provided for custom csrf_class + + @cached_property + def csrf(self): + return current_app.config.get("WTF_CSRF_ENABLED", True) + + @cached_property + def csrf_secret(self): + return current_app.config.get("WTF_CSRF_SECRET_KEY", current_app.secret_key) + + @cached_property + def csrf_field_name(self): + return current_app.config.get("WTF_CSRF_FIELD_NAME", "csrf_token") + + @cached_property + def csrf_time_limit(self): + return current_app.config.get("WTF_CSRF_TIME_LIMIT", 3600) + + def wrap_formdata(self, form, formdata): + if formdata is _Auto: + if _is_submitted(): + if request.files: + return CombinedMultiDict((request.files, request.form)) + elif request.form: + return request.form + elif request.is_json: + return ImmutableMultiDict(request.get_json()) + + return None + + return formdata + + def get_translations(self, form): + if not current_app.config.get("WTF_I18N_ENABLED", True): + return super().get_translations(form) + + return translations + + def __init__(self, formdata=_Auto, **kwargs): + super().__init__(formdata=formdata, **kwargs) + + def is_submitted(self): + """Consider the form submitted if there is an active request and + the method is ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + """ + + return _is_submitted() + + def validate_on_submit(self, extra_validators=None): + """Call :meth:`validate` only if the form is submitted. + This is a shortcut for ``form.is_submitted() and form.validate()``. + """ + return self.is_submitted() and self.validate(extra_validators=extra_validators) + + def hidden_tag(self, *fields): + """Render the form's hidden fields in one call. + + A field is considered hidden if it uses the + :class:`~wtforms.widgets.HiddenInput` widget. + + If ``fields`` are given, only render the given fields that + are hidden. If a string is passed, render the field with that + name if it exists. + + .. versionchanged:: 0.13 + + No longer wraps inputs in hidden div. + This is valid HTML 5. + + .. versionchanged:: 0.13 + + Skip passed fields that aren't hidden. + Skip passed names that don't exist. + """ + + def hidden_fields(fields): + for f in fields: + if isinstance(f, str): + f = getattr(self, f, None) + + if f is None or not isinstance(f.widget, HiddenInput): + continue + + yield f + + return Markup("\n".join(str(f) for f in hidden_fields(fields or self))) + + +def _is_submitted(): + """Consider the form submitted if there is an active request and + the method is ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + """ + + return bool(request) and request.method in SUBMIT_METHODS diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/i18n.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/i18n.py new file mode 100644 index 0000000..1cc0e9c --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/i18n.py @@ -0,0 +1,47 @@ +from babel import support +from flask import current_app +from flask import request +from flask_babel import get_locale +from wtforms.i18n import messages_path + +__all__ = ("Translations", "translations") + + +def _get_translations(): + """Returns the correct gettext translations. + Copy from flask-babel with some modifications. + """ + + if not request: + return None + + # babel should be in extensions for get_locale + if "babel" not in current_app.extensions: + return None + + translations = getattr(request, "wtforms_translations", None) + + if translations is None: + translations = support.Translations.load( + messages_path(), [get_locale()], domain="wtforms" + ) + request.wtforms_translations = translations + + return translations + + +class Translations: + def gettext(self, string): + t = _get_translations() + return string if t is None else t.ugettext(string) + + def ngettext(self, singular, plural, n): + t = _get_translations() + + if t is None: + return singular if n == 1 else plural + + return t.ungettext(singular, plural, n) + + +translations = Translations() diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__init__.py new file mode 100644 index 0000000..3100d37 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__init__.py @@ -0,0 +1,3 @@ +from .fields import RecaptchaField +from .validators import Recaptcha +from .widgets import RecaptchaWidget diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6069877a6c3259f18c1f82ff65a077c285032247 GIT binary patch literal 368 zcmX|7u};G<5Ve!0KtLE+HqvNsj~7Dd;`D1${$oJ z159j4-8x}cr8nHY_w@91cOUI`3)uSVzULD=za9B6ZwpqZ7Q6xi2;@M(7($0V?g>Bk zH`wP55ySxmbt4RZptXl^(YdE7E=`)_YeqS-%E3;tq`M*zL%t|X!8k?9%c zy$3TRO!l1AyHj#PQ=?Huiwbe}jLO>NvN-P#&yZ$@MkP+CcuY0QIM&l-ZZaFcJqaZV pE0{@=ep#>gFN7pBPA}D=UCEuVJGTA$5W*!mUV@`faH8C!{{Vb;X?p+w literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/fields.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/fields.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e42a30370315c407d37ab8d20ba0d36269b4e9e3 GIT binary patch literal 986 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/widgets.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__pycache__/widgets.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6bae1f97e0b100f9a27183d4acdaffbeb8e2b5f GIT binary patch literal 2632 zcmbVOTWlN06`kQe_>gQqED3r<_L_Q`QOULIA^{v)2~E+qVo4DsIzU+feQ1W05cHMzANu4 zFd4?~GkLbaWjNAjGrY=W+$x{(sO}uhcwOKcP(62m>b~#lt(Wmty%FC(=^z3vZyDva zqEb>dG8j_I2x&!Ak`03l`865smW|rNwrLvpk|qFeG={!M3#pX+K)GnHNnJ^3sja5PEA`#=L3sDg}3g?B)PQCXF_12b&Z72yz1 z92Cc$PNoWm{Ek?n{n)(^Oscip&hvhbj$F-)O@;SiPq*i)yU>v7c0B4X$FlV@>-J~w zF)tAn+J(9w#a?W>B!ss;oKW=<0p%8d23w0IfRwMzStV>EF^&R+;uO5`_GL1n7NnO-P@nd*LjlhNoU7BesCvdz|q#(I$!6qOpRc` znYjfbzIE&5W-6K3NGGo+r0eOmRcmB0-bidF)>7%z=9U#0Xt$D^D;w!!_~!Gj%ZYSC zN~F`o)s1yi+tsSaP*9#>#g2la?;`mfy+*_z;0*u?eCyyBB*r}g;X3?`l=@v)9ZnEC z>ASw*{s{L;+5aZQf-3VhQ-Kk-#;LL?M{BOj;bRzH{|ZDH%N09s!Ci}!O%q{E0WJu) zkAEd@mkOF#C~eCHStV6#l(2Z={Q2mzT*c9Mve6`|e(_x$m*u>$WtLUFBv6&Gfl51? zVq)=@R=g$V_4h@iYHpW`7h@NGD$?AdhOF$$ISq?hQog%V#mqiO3KhF#am=V5d*eB+ zsC{6drP_rTN;=kO3~AdepPu`zH8s>SAj$`EN{F^Vee&&^k4^sO6P+rQ~X2Yb)YK)Nb)gshHJs7DG4% z(c-qo2j0DFm6lUi6E|1Wh#sTG?v(VRH8pVRFX{MMp@A`-TH9Dnq*D=(#bPa=wR}eT z{k*P71Pm5S)3kU)MsfjLe2)bQR*Je|Xr|>Q%qQ7wh(^iIm=>_mYj2@38q3KapIGhm z|31+mUFAC>$k}!MlO6xrmj7(WKiBflHRoSz`(JOckB9u-Qxl)g{yyFuKGO}p(h1JA zf-{}qLMyn?Jh#*izS-daOMR&we51iX_K$W)qm8SNhk}oWL%&r%UpdIOUx~KHqOD<~ z?gpkhfp9Aj?gZvrf%)dbH|8{Y-IVW+J|tovc>fP0t9H#1t^_+?XNkdoogFa73^3{1cAEw01Ox-N zQTrUOG9S4r-~;A8VAt%~P0cK$A{NYTP3T{vpcjp@DNxdhJx?VYH?OR&B&8dv_i8f( za1FFV55+>UMBZ4{>*2H4- zCs$e%$;R7<9uOGm_`@xK_~268A8UGIPk(TO!1xmYsekBn^UQKPl=}0}n#1oLGE{eL zm^We*|I1_;+M~lQ#lna_9Sw2ZBl+<#b_J<|umxRE27CTEMl3-AXiUlfY@z|dN zwxACJrti}o@Wd71R^Sh_9!|79*CRvLF!?Sbj29ziinSgGa5l;H2*g*gKaH?VK4s`p zp(!dTQ=!vDSZ+zOkE^%ek7GFY#CuUMq1TBoeHk!)2}s5eehb3?0Mp-s>Ay`aH^KO$ j(~C_ob?9Qo*d_=a`oQpX(>HzF{V#qBicbI$cEtYyr3iIV literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/fields.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/fields.py new file mode 100644 index 0000000..e91fd09 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/fields.py @@ -0,0 +1,17 @@ +from wtforms.fields import Field + +from . import widgets +from .validators import Recaptcha + +__all__ = ["RecaptchaField"] + + +class RecaptchaField(Field): + widget = widgets.RecaptchaWidget() + + # error message if recaptcha validation fails + recaptcha_error = None + + def __init__(self, label="", validators=None, **kwargs): + validators = validators or [Recaptcha()] + super().__init__(label, validators, **kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py new file mode 100644 index 0000000..c5cafb3 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py @@ -0,0 +1,75 @@ +import json +from urllib import request as http +from urllib.parse import urlencode + +from flask import current_app +from flask import request +from wtforms import ValidationError + +RECAPTCHA_VERIFY_SERVER_DEFAULT = "https://www.google.com/recaptcha/api/siteverify" +RECAPTCHA_ERROR_CODES = { + "missing-input-secret": "The secret parameter is missing.", + "invalid-input-secret": "The secret parameter is invalid or malformed.", + "missing-input-response": "The response parameter is missing.", + "invalid-input-response": "The response parameter is invalid or malformed.", +} + + +__all__ = ["Recaptcha"] + + +class Recaptcha: + """Validates a ReCaptcha.""" + + def __init__(self, message=None): + if message is None: + message = RECAPTCHA_ERROR_CODES["missing-input-response"] + self.message = message + + def __call__(self, form, field): + if current_app.testing: + return True + + if request.is_json: + response = request.json.get("g-recaptcha-response", "") + else: + response = request.form.get("g-recaptcha-response", "") + remote_ip = request.remote_addr + + if not response: + raise ValidationError(field.gettext(self.message)) + + if not self._validate_recaptcha(response, remote_ip): + field.recaptcha_error = "incorrect-captcha-sol" + raise ValidationError(field.gettext(self.message)) + + def _validate_recaptcha(self, response, remote_addr): + """Performs the actual validation.""" + try: + private_key = current_app.config["RECAPTCHA_PRIVATE_KEY"] + except KeyError: + raise RuntimeError("No RECAPTCHA_PRIVATE_KEY config set") from None + + verify_server = current_app.config.get("RECAPTCHA_VERIFY_SERVER") + if not verify_server: + verify_server = RECAPTCHA_VERIFY_SERVER_DEFAULT + + data = urlencode( + {"secret": private_key, "remoteip": remote_addr, "response": response} + ) + + http_response = http.urlopen(verify_server, data.encode("utf-8")) + + if http_response.code != 200: + return False + + json_resp = json.loads(http_response.read()) + + if json_resp["success"]: + return True + + for error in json_resp.get("error-codes", []): + if error in RECAPTCHA_ERROR_CODES: + raise ValidationError(RECAPTCHA_ERROR_CODES[error]) + + return False diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py new file mode 100644 index 0000000..bfae830 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py @@ -0,0 +1,43 @@ +from urllib.parse import urlencode + +from flask import current_app +from markupsafe import Markup + +RECAPTCHA_SCRIPT_DEFAULT = "https://www.google.com/recaptcha/api.js" +RECAPTCHA_DIV_CLASS_DEFAULT = "g-recaptcha" +RECAPTCHA_TEMPLATE = """ + +
    +""" + +__all__ = ["RecaptchaWidget"] + + +class RecaptchaWidget: + def recaptcha_html(self, public_key): + html = current_app.config.get("RECAPTCHA_HTML") + if html: + return Markup(html) + params = current_app.config.get("RECAPTCHA_PARAMETERS") + script = current_app.config.get("RECAPTCHA_SCRIPT") + if not script: + script = RECAPTCHA_SCRIPT_DEFAULT + if params: + script += "?" + urlencode(params) + attrs = current_app.config.get("RECAPTCHA_DATA_ATTRS", {}) + attrs["sitekey"] = public_key + snippet = " ".join(f'data-{k}="{attrs[k]}"' for k in attrs) # noqa: B028, B907 + div_class = current_app.config.get("RECAPTCHA_DIV_CLASS") + if not div_class: + div_class = RECAPTCHA_DIV_CLASS_DEFAULT + return Markup(RECAPTCHA_TEMPLATE % (script, div_class, snippet)) + + def __call__(self, field, error=None, **kwargs): + """Returns the recaptcha input HTML.""" + + try: + public_key = current_app.config["RECAPTCHA_PUBLIC_KEY"] + except KeyError: + raise RuntimeError("RECAPTCHA_PUBLIC_KEY config not set") from None + + return self.recaptcha_html(public_key) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..7b190ca --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2011 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA new file mode 100644 index 0000000..ddf5464 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.2.0 +Summary: Safely pass data to untrusted environments and back. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/itsdangerous/ + +# ItsDangerous + +... so better sign this + +Various helpers to pass data to untrusted environments and to get it +back safe and sound. Data is cryptographically signed to ensure that a +token has not been tampered with. + +It's possible to customize how data is serialized. Data is compressed as +needed. A timestamp can be added and verified automatically while +loading a token. + + +## A Simple Example + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +```python +from itsdangerous import URLSafeSerializer +auth_s = URLSafeSerializer("secret key", "auth") +token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) + +print(token) +# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg + +data = auth_s.loads(token) +print(data["name"]) +# itsdangerous +``` + + +## Donate + +The Pallets organization develops and supports ItsDangerous and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD new file mode 100644 index 0000000..245f43e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/RECORD @@ -0,0 +1,22 @@ +itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 +itsdangerous-2.2.0.dist-info/RECORD,, +itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 +itsdangerous/__pycache__/__init__.cpython-312.pyc,, +itsdangerous/__pycache__/_json.cpython-312.pyc,, +itsdangerous/__pycache__/encoding.cpython-312.pyc,, +itsdangerous/__pycache__/exc.cpython-312.pyc,, +itsdangerous/__pycache__/serializer.cpython-312.pyc,, +itsdangerous/__pycache__/signer.cpython-312.pyc,, +itsdangerous/__pycache__/timed.cpython-312.pyc,, +itsdangerous/__pycache__/url_safe.cpython-312.pyc,, +itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 +itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 +itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 +itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 +itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 +itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous-2.2.0.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/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__init__.py new file mode 100644 index 0000000..ea55256 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__init__.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import typing as t + +from .encoding import base64_decode as base64_decode +from .encoding import base64_encode as base64_encode +from .encoding import want_bytes as want_bytes +from .exc import BadData as BadData +from .exc import BadHeader as BadHeader +from .exc import BadPayload as BadPayload +from .exc import BadSignature as BadSignature +from .exc import BadTimeSignature as BadTimeSignature +from .exc import SignatureExpired as SignatureExpired +from .serializer import Serializer as Serializer +from .signer import HMACAlgorithm as HMACAlgorithm +from .signer import NoneAlgorithm as NoneAlgorithm +from .signer import Signer as Signer +from .timed import TimedSerializer as TimedSerializer +from .timed import TimestampSigner as TimestampSigner +from .url_safe import URLSafeSerializer as URLSafeSerializer +from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " ItsDangerous 2.3. Use feature detection or" + " 'importlib.metadata.version(\"itsdangerous\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("itsdangerous") + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c59d7a3aa24ca322db3e608846440091d68324ec GIT binary patch literal 1658 zcmZXU&u<$=6vt=%W4&H`ZO8dtqIMGssSmN!q##vPNFgZ{2||TikoK|~dnWd#`@@fCq>mqWLJ$98Hs)@DomwBuUCo1!*S@T9TxJbw^jM z181C!;*4(uStqO505%;{aTYk|^ojS&uM4I&HEjXQTd)(r_95?x2Jqsw?184 zU-MfL^F%v<$JS;P(osQ|KGfQxbWhH`t|TsS&^cQ*cK7p7>UfKuTQ@ZjU-QtECo~*T zPAG|xcKi_F0osT1xpxI2_8v(Pk50;;DJ@aq8kRxJ8u|TYy`f zldNUP{aNR;f)sSFTALN+l9HUpq?{JA&skXt<5DoX%y&8TG@Fpx zq@3hA{esxrk}t#b%D53kr0di7*(#W_jrclDM@dc7`e@-LD*uD7_2pIVqc{6#v5zW! cwA4rMsB5{8R@8NQsNCqI4^Q-hc1eBYKfA8Yod5s; literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/_json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3282b524e31bb088b225577a7dfa21226e40c492 GIT binary patch literal 1212 zcmZ`&&ubJh6i((>$F^FmRrDYX{({kVr&>{vB8Z~kVHFArdl}MA+MRW0GA5bov_16D zix)lCqX!R4{|m2P6a{ru5cT4%wg+KPzRYa5Dj1lTFE8&U?|u2^KMzJ**1gt+N2u5JePsP>dTGYix9khFQ*5!#2=0M9o!1t#zZyYB;&!+duTe$Hfpy z60V4fcp~e~Dx$JxHEmzQPyR%=4*{h=#@4{wbF zSVOA6*Y35}j|8xc)_eOi&}ZE@3Om#n7IuddDxvj(l;kDWabEX+(Bd%*V%{P#p@Cp2 zm%-`D$%!i@mlHSUCN6Wzf?JWyNXMH|8I8E7UEWQ>+pMW%u)vaqpcBmoX|7s4nW~*W z6G&)f0$RC4=9vs4B`Hbf8T2oMvYc9)3m5KR9Q~83T3MGCfZPja1$`eGd$jam>GAnD zBS&AkN4LO<{^G_4$B^b`0l*qs#_c{kI<^`VQ)62O_e+OMcEw5I!X+{F@;UD zIE9G9AP*mpZ0lz#4W(9q5_q=lty><^hu01>c)}4Ic zUynZQOlLdc=Qn0?aGd7eE=R`EH8{eTJ+(m?BO7$ziUVOR`?VWn!o!(n(A1k>9Y2t&%7+AZ}z*Nhnmg_Z&+ zTYQenimIOVlL~D#NAeVyRrJA{{$lUlG_ZYa%S6uThDI9>piRTHPnN!)8dc}$Y$y#1 zn#-UYC{E}HEiC;fRNOl%PoreMz^c4U9ESa!BD(H$)yhS21U9s$w+A1eR= literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/encoding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1db63d0f9655fcac875306c54538972daa043009 GIT binary patch literal 2712 zcma(SU2Gi1dFFO+eZKYi&NluD;Igqp+)FrLevC081QHS}Mc@FYv^|tw*EeH(uj}3G z%v=&5HZm0t@Ptt##TBZWmr6#dR3u&^o`6?g?sQ0wmQ;$0c*vWDd8pEtelvS(=aN2j z?)Lj;zVDlv?|;5YrIHB7ztUeXz86R6d%1{)9!~Jiix{D6h#-Ppw1f*7%X!R=6=Di& z1x;bSper0N7(^qw+p&}=Brxhkq`MQ~-jAe7{QY>LlVphTzFtTI?f`63tvnQ6zK1_S zK!0>^9nC&LB=HxmJRGg}FzLJj8p}~g#}L)amRhs{lH8T)p*`gTZA`T&^ub=E{PTx7 z#DpD(9;V-jg|xx|=^`DI!XJb#ILm-4PNm#-{~Mc+Ft6HN9R90zy9luOUAK*J?*V_3V5JRP1AHqVKr2P9kn6&#hN{&?|q?8)v zRzXB-iC0i0S?;)>9?l7lxZw3z?YC!aPA4a<(9xD{f!o2wmOpPPlPsTEf?g5h)|-pe zVw6{1A^9QGW;6)_u(&->E#X^LPA$i?e)+~Ld|WYhq;1b*4Bm{XSpJyqt)EycOX ziSXjUVDjP$q@59Jz~xShr2q!0a9=T$WdlHa1U@eF9lV@C-9sBjGxfyU^lh_e%N%W( zqt~aK=HV^#Si?N_*+kQvs_RoM4dQLimZ_*p}L-2&BqQP*0YL*G+qs2L_u4@e~gii zRs1f#j4z`r+HcThoK4g&w8BWJtQQC)gdnG)@_)qBa<~eXifI_PAa3)L;{=AY;Q5SZ zV@#$s>yn@cz+IVlwa0$pU9w$=SYdo}VSI>1pli%zJHnuAF7;S1h_{73R5a*(bGbs# z$!ZRgZ`p1&oHOY_xU*mG!j#L#Vm*)x;Q`D7*5mMT3Sc)EHV1DGeVaP7HhoJ^en77B zjmbZ~v+iDhy)kgG(LL7C$JVB|buE7KcDjEnJ=RE%Z5qvVzMjbc`*v6V)mq&g`4M4Y zclXx^jyJm}Ztkxqp8Lg+n*uYJ`Yhj~rQ6`yDFxv0fX zyh1}OY^Er_m@`J{c`Le9DEc$E{#}2x6PrAzNR_6Wgcjl2d@9B zY3AyB?%_I;S+0~n1(SB=|F_a)xBW-P5p5srg_fkx+?6H4MkJ7dSJo)^Nqa!uAkNBF zF60ZP$bz*QbiXKj3J!Q0J}#f+(4fJ;4*z-h`X4sOn){A5&Eub)ZkUsGeNtHk4KZF7 z^SP<83zbAR!DLz9Gr@n>O4#+nQcy~&dXO{dUsP0?7sS=|(C}oIuyG0U5*z^l)F%N2 z8W_<=Jse4dR2hNnz93mF&R5}3S}ZaddR0VWO~@WuEs4Mo%N6+`Vi9QcN=em?syfvp zRdECe}}bCzpIub?GVgBJgE9=brQ+Z@h<~;}#7|Etd?%jVi35M9H;$j($t3Z~?Z?sJ@YcYg#=xO^|KZK) zf4utXtD7&}9If}A+Uh&k=sWl2LbGqCjxu*L!|TSi)W@j}(#(vmrEX=0w=yG*%!r&0 ltmA9O$3}f{>Sk{1#7yJFOfz#~Ewy7{JpNMx<7bpn{{>7hXGH)2 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/exc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec388eae4c0d483ec7e5ed7e793c78400e78b635 GIT binary patch literal 3972 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/signer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87974ec1512654e3329eb5746bec6b25302d987b GIT binary patch literal 11318 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/__pycache__/timed.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e83b444df8852317da011ef276a8242ecf5b180e GIT binary patch literal 8766 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 UvIY;|(%v4w^Yn8cBTx9@pNx&B0ssI2 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/_json.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/_json.py new file mode 100644 index 0000000..fc23fea --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/_json.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +import json as _json +import typing as t + + +class _CompactJSON: + """Wrapper around json module that strips whitespace.""" + + @staticmethod + def loads(payload: str | bytes) -> t.Any: + return _json.loads(payload) + + @staticmethod + def dumps(obj: t.Any, **kwargs: t.Any) -> str: + kwargs.setdefault("ensure_ascii", False) + kwargs.setdefault("separators", (",", ":")) + return _json.dumps(obj, **kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/encoding.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/encoding.py new file mode 100644 index 0000000..f5ca80f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/encoding.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +import base64 +import string +import struct +import typing as t + +from .exc import BadData + + +def want_bytes( + s: str | bytes, encoding: str = "utf-8", errors: str = "strict" +) -> bytes: + if isinstance(s, str): + s = s.encode(encoding, errors) + + return s + + +def base64_encode(string: str | bytes) -> bytes: + """Base64 encode a string of bytes or text. The resulting bytes are + safe to use in URLs. + """ + string = want_bytes(string) + return base64.urlsafe_b64encode(string).rstrip(b"=") + + +def base64_decode(string: str | bytes) -> bytes: + """Base64 decode a URL-safe string of bytes or text. The result is + bytes. + """ + string = want_bytes(string, encoding="ascii", errors="ignore") + string += b"=" * (-len(string) % 4) + + try: + return base64.urlsafe_b64decode(string) + except (TypeError, ValueError) as e: + raise BadData("Invalid base64-encoded data") from e + + +# The alphabet used by base64.urlsafe_* +_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") + +_int64_struct = struct.Struct(">Q") +_int_to_bytes = _int64_struct.pack +_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) + + +def int_to_bytes(num: int) -> bytes: + return _int_to_bytes(num).lstrip(b"\x00") + + +def bytes_to_int(bytestr: bytes) -> int: + return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/exc.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/exc.py new file mode 100644 index 0000000..a75adcd --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/exc.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +import typing as t +from datetime import datetime + + +class BadData(Exception): + """Raised if bad data of any sort was encountered. This is the base + for all exceptions that ItsDangerous defines. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str): + super().__init__(message) + self.message = message + + def __str__(self) -> str: + return self.message + + +class BadSignature(BadData): + """Raised if a signature does not match.""" + + def __init__(self, message: str, payload: t.Any | None = None): + super().__init__(message) + + #: The payload that failed the signature test. In some + #: situations you might still want to inspect this, even if + #: you know it was tampered with. + #: + #: .. versionadded:: 0.14 + self.payload: t.Any | None = payload + + +class BadTimeSignature(BadSignature): + """Raised if a time-based signature is invalid. This is a subclass + of :class:`BadSignature`. + """ + + def __init__( + self, + message: str, + payload: t.Any | None = None, + date_signed: datetime | None = None, + ): + super().__init__(message, payload) + + #: If the signature expired this exposes the date of when the + #: signature was created. This can be helpful in order to + #: tell the user how long a link has been gone stale. + #: + #: .. versionchanged:: 2.0 + #: The datetime value is timezone-aware rather than naive. + #: + #: .. versionadded:: 0.14 + self.date_signed = date_signed + + +class SignatureExpired(BadTimeSignature): + """Raised if a signature timestamp is older than ``max_age``. This + is a subclass of :exc:`BadTimeSignature`. + """ + + +class BadHeader(BadSignature): + """Raised if a signed header is invalid in some form. This only + happens for serializers that have a header that goes with the + signature. + + .. versionadded:: 0.24 + """ + + def __init__( + self, + message: str, + payload: t.Any | None = None, + header: t.Any | None = None, + original_error: Exception | None = None, + ): + super().__init__(message, payload) + + #: If the header is actually available but just malformed it + #: might be stored here. + self.header: t.Any | None = header + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: Exception | None = original_error + + +class BadPayload(BadData): + """Raised if a payload is invalid. This could happen if the payload + is loaded despite an invalid signature, or if there is a mismatch + between the serializer and deserializer. The original exception + that occurred during loading is stored on as :attr:`original_error`. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str, original_error: Exception | None = None): + super().__init__(message) + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: Exception | None = original_error diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/py.typed b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/serializer.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/serializer.py new file mode 100644 index 0000000..5ddf387 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/serializer.py @@ -0,0 +1,406 @@ +from __future__ import annotations + +import collections.abc as cabc +import json +import typing as t + +from .encoding import want_bytes +from .exc import BadPayload +from .exc import BadSignature +from .signer import _make_keys_list +from .signer import Signer + +if t.TYPE_CHECKING: + import typing_extensions as te + + # This should be either be str or bytes. To avoid having to specify the + # bound type, it falls back to a union if structural matching fails. + _TSerialized = te.TypeVar( + "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] + ) +else: + # Still available at runtime on Python < 3.13, but without the default. + _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) + + +class _PDataSerializer(t.Protocol[_TSerialized]): + def loads(self, payload: _TSerialized, /) -> t.Any: ... + # A signature with additional arguments is not handled correctly by type + # checkers right now, so an overload is used below for serializers that + # don't match this strict protocol. + def dumps(self, obj: t.Any, /) -> _TSerialized: ... + + +# Use TypeIs once it's available in typing_extensions or 3.13. +def is_text_serializer( + serializer: _PDataSerializer[t.Any], +) -> te.TypeGuard[_PDataSerializer[str]]: + """Checks whether a serializer generates text or binary.""" + return isinstance(serializer.dumps({}), str) + + +class Serializer(t.Generic[_TSerialized]): + """A serializer wraps a :class:`~itsdangerous.signer.Signer` to + enable serializing and securely signing data other than bytes. It + can unsign to verify that the data hasn't been changed. + + The serializer provides :meth:`dumps` and :meth:`loads`, similar to + :mod:`json`, and by default uses :mod:`json` internally to serialize + the data to bytes. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param serializer: An object that provides ``dumps`` and ``loads`` + methods for serializing data to a string. Defaults to + :attr:`default_serializer`, which defaults to :mod:`json`. + :param serializer_kwargs: Keyword arguments to pass when calling + ``serializer.dumps``. + :param signer: A ``Signer`` class to instantiate when signing data. + Defaults to :attr:`default_signer`, which defaults to + :class:`~itsdangerous.signer.Signer`. + :param signer_kwargs: Keyword arguments to pass when instantiating + the ``Signer`` class. + :param fallback_signers: List of signer parameters to try when + unsigning with the default signer fails. Each item can be a dict + of ``signer_kwargs``, a ``Signer`` class, or a tuple of + ``(signer, signer_kwargs)``. Defaults to + :attr:`default_fallback_signers`. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 2.0 + Removed the default SHA-512 fallback signer from + ``default_fallback_signers``. + + .. versionchanged:: 1.1 + Added support for ``fallback_signers`` and configured a default + SHA-512 fallback. This fallback is for users who used the yanked + 1.0.0 release which defaulted to SHA-512. + + .. versionchanged:: 0.14 + The ``signer`` and ``signer_kwargs`` parameters were added to + the constructor. + """ + + #: The default serialization module to use to serialize data to a + #: string internally. The default is :mod:`json`, but can be changed + #: to any object that provides ``dumps`` and ``loads`` methods. + default_serializer: _PDataSerializer[t.Any] = json + + #: The default ``Signer`` class to instantiate when signing data. + #: The default is :class:`itsdangerous.signer.Signer`. + default_signer: type[Signer] = Signer + + #: The default fallback signers to try when unsigning fails. + default_fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = [] + + # Serializer[str] if no data serializer is provided, or if it returns str. + @t.overload + def __init__( + self: Serializer[str], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: None | _PDataSerializer[str] = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer positional argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer keyword argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a positional argument. If the strict signature of + # _PDataSerializer doesn't match, fall back to a union, requiring the user + # to specify the type. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a keyword argument. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: t.Any | None = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: list[bytes] = _make_keys_list(secret_key) + + if salt is not None: + salt = want_bytes(salt) + # if salt is None then the signer's default is used + + self.salt = salt + + if serializer is None: + serializer = self.default_serializer + + self.serializer: _PDataSerializer[_TSerialized] = serializer + self.is_text_serializer: bool = is_text_serializer(serializer) + + if signer is None: + signer = self.default_signer + + self.signer: type[Signer] = signer + self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} + + if fallback_signers is None: + fallback_signers = list(self.default_fallback_signers) + + self.fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = fallback_signers + self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def load_payload( + self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = None + ) -> t.Any: + """Loads the encoded object. This function raises + :class:`.BadPayload` if the payload is not valid. The + ``serializer`` parameter can be used to override the serializer + stored on the class. The encoded ``payload`` should always be + bytes. + """ + if serializer is None: + use_serializer = self.serializer + is_text = self.is_text_serializer + else: + use_serializer = serializer + is_text = is_text_serializer(serializer) + + try: + if is_text: + return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] + + return use_serializer.loads(payload) # type: ignore[arg-type] + except Exception as e: + raise BadPayload( + "Could not load the payload because an exception" + " occurred on unserializing the data.", + original_error=e, + ) from e + + def dump_payload(self, obj: t.Any) -> bytes: + """Dumps the encoded object. The return value is always bytes. + If the internal serializer returns text, the value will be + encoded as UTF-8. + """ + return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) + + def make_signer(self, salt: str | bytes | None = None) -> Signer: + """Creates a new instance of the signer to be used. The default + implementation uses the :class:`.Signer` base class. + """ + if salt is None: + salt = self.salt + + return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) + + def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: + """Iterates over all signers to be tried for unsigning. Starts + with the configured signer, then constructs each signer + specified in ``fallback_signers``. + """ + if salt is None: + salt = self.salt + + yield self.make_signer(salt) + + for fallback in self.fallback_signers: + if isinstance(fallback, dict): + kwargs = fallback + fallback = self.signer + elif isinstance(fallback, tuple): + fallback, kwargs = fallback + else: + kwargs = self.signer_kwargs + + for secret_key in self.secret_keys: + yield fallback(secret_key, salt=salt, **kwargs) + + def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: + """Returns a signed string serialized with the internal + serializer. The return value can be either a byte or unicode + string depending on the format of the internal serializer. + """ + payload = want_bytes(self.dump_payload(obj)) + rv = self.make_signer(salt).sign(payload) + + if self.is_text_serializer: + return rv.decode("utf-8") # type: ignore[return-value] + + return rv # type: ignore[return-value] + + def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = None) -> None: + """Like :meth:`dumps` but dumps into a file. The file handle has + to be compatible with what the internal serializer expects. + """ + f.write(self.dumps(obj, salt)) + + def loads( + self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any + ) -> t.Any: + """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the + signature validation fails. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + return self.load_payload(signer.unsign(s)) + except BadSignature as err: + last_exception = err + + raise t.cast(BadSignature, last_exception) + + def load(self, f: t.IO[t.Any], salt: str | bytes | None = None) -> t.Any: + """Like :meth:`loads` but loads from a file.""" + return self.loads(f.read(), salt) + + def loads_unsafe( + self, s: str | bytes, salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: + """Like :meth:`loads` but without verifying the signature. This + is potentially very dangerous to use depending on how your + serializer works. The return value is ``(signature_valid, + payload)`` instead of just the payload. The first item will be a + boolean that indicates if the signature is valid. This function + never fails. + + Use it for debugging only and if you know that your serializer + module is not exploitable (for example, do not use it with a + pickle serializer). + + .. versionadded:: 0.15 + """ + return self._loads_unsafe_impl(s, salt) + + def _loads_unsafe_impl( + self, + s: str | bytes, + salt: str | bytes | None, + load_kwargs: dict[str, t.Any] | None = None, + load_payload_kwargs: dict[str, t.Any] | None = None, + ) -> tuple[bool, t.Any]: + """Low level helper function to implement :meth:`loads_unsafe` + in serializer subclasses. + """ + if load_kwargs is None: + load_kwargs = {} + + try: + return True, self.loads(s, salt=salt, **load_kwargs) + except BadSignature as e: + if e.payload is None: + return False, None + + if load_payload_kwargs is None: + load_payload_kwargs = {} + + try: + return ( + False, + self.load_payload(e.payload, **load_payload_kwargs), + ) + except BadPayload: + return False, None + + def load_unsafe( + self, f: t.IO[t.Any], salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: + """Like :meth:`loads_unsafe` but loads from a file. + + .. versionadded:: 0.15 + """ + return self.loads_unsafe(f.read(), salt=salt) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/signer.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/signer.py new file mode 100644 index 0000000..e324dc0 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/signer.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +import collections.abc as cabc +import hashlib +import hmac +import typing as t + +from .encoding import _base64_alphabet +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import want_bytes +from .exc import BadSignature + + +class SigningAlgorithm: + """Subclasses must implement :meth:`get_signature` to provide + signature generation functionality. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + """Returns the signature for the given key and value.""" + raise NotImplementedError() + + def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: + """Verifies the given signature matches the expected + signature. + """ + return hmac.compare_digest(sig, self.get_signature(key, value)) + + +class NoneAlgorithm(SigningAlgorithm): + """Provides an algorithm that does not perform any signing and + returns an empty signature. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + return b"" + + +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + +class HMACAlgorithm(SigningAlgorithm): + """Provides signature generation using HMACs.""" + + #: The digest method to use with the MAC algorithm. This defaults to + #: SHA1, but can be changed to any other function in the hashlib + #: module. + default_digest_method: t.Any = staticmethod(_lazy_sha1) + + def __init__(self, digest_method: t.Any = None): + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: t.Any = digest_method + + def get_signature(self, key: bytes, value: bytes) -> bytes: + mac = hmac.new(key, msg=value, digestmod=self.digest_method) + return mac.digest() + + +def _make_keys_list( + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], +) -> list[bytes]: + if isinstance(secret_key, (str, bytes)): + return [want_bytes(secret_key)] + + return [want_bytes(s) for s in secret_key] # pyright: ignore + + +class Signer: + """A signer securely signs bytes, then unsigns them to verify that + the value hasn't been changed. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param sep: Separator between the signature and value. + :param key_derivation: How to derive the signing key from the secret + key and salt. Possible values are ``concat``, ``django-concat``, + or ``hmac``. Defaults to :attr:`default_key_derivation`, which + defaults to ``django-concat``. + :param digest_method: Hash function to use when generating the HMAC + signature. Defaults to :attr:`default_digest_method`, which + defaults to :func:`hashlib.sha1`. Note that the security of the + hash alone doesn't apply when used intermediately in HMAC. + :param algorithm: A :class:`SigningAlgorithm` instance to use + instead of building a default :class:`HMACAlgorithm` with the + ``digest_method``. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 0.18 + ``algorithm`` was added as an argument to the class constructor. + + .. versionchanged:: 0.14 + ``key_derivation`` and ``digest_method`` were added as arguments + to the class constructor. + """ + + #: The default digest method to use for the signer. The default is + #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or + #: compatible object. Note that the security of the hash alone + #: doesn't apply when used intermediately in HMAC. + #: + #: .. versionadded:: 0.14 + default_digest_method: t.Any = staticmethod(_lazy_sha1) + + #: The default scheme to use to derive the signing key from the + #: secret key and salt. The default is ``django-concat``. Possible + #: values are ``concat``, ``django-concat``, and ``hmac``. + #: + #: .. versionadded:: 0.14 + default_key_derivation: str = "django-concat" + + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous.Signer", + sep: str | bytes = b".", + key_derivation: str | None = None, + digest_method: t.Any | None = None, + algorithm: SigningAlgorithm | None = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: list[bytes] = _make_keys_list(secret_key) + self.sep: bytes = want_bytes(sep) + + if self.sep in _base64_alphabet: + raise ValueError( + "The given separator cannot be used because it may be" + " contained in the signature itself. ASCII letters," + " digits, and '-_=' must not be used." + ) + + if salt is not None: + salt = want_bytes(salt) + else: + salt = b"itsdangerous.Signer" + + self.salt = salt + + if key_derivation is None: + key_derivation = self.default_key_derivation + + self.key_derivation: str = key_derivation + + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: t.Any = digest_method + + if algorithm is None: + algorithm = HMACAlgorithm(self.digest_method) + + self.algorithm: SigningAlgorithm = algorithm + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def derive_key(self, secret_key: str | bytes | None = None) -> bytes: + """This method is called to derive the key. The default key + derivation choices can be overridden here. Key derivation is not + intended to be used as a security method to make a complex key + out of a short password. Instead you should use large random + secret keys. + + :param secret_key: A specific secret key to derive from. + Defaults to the last item in :attr:`secret_keys`. + + .. versionchanged:: 2.0 + Added the ``secret_key`` parameter. + """ + if secret_key is None: + secret_key = self.secret_keys[-1] + else: + secret_key = want_bytes(secret_key) + + if self.key_derivation == "concat": + return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) + elif self.key_derivation == "django-concat": + return t.cast( + bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() + ) + elif self.key_derivation == "hmac": + mac = hmac.new(secret_key, digestmod=self.digest_method) + mac.update(self.salt) + return mac.digest() + elif self.key_derivation == "none": + return secret_key + else: + raise TypeError("Unknown key derivation method") + + def get_signature(self, value: str | bytes) -> bytes: + """Returns the signature for the given value.""" + value = want_bytes(value) + key = self.derive_key() + sig = self.algorithm.get_signature(key, value) + return base64_encode(sig) + + def sign(self, value: str | bytes) -> bytes: + """Signs the given string.""" + value = want_bytes(value) + return value + self.sep + self.get_signature(value) + + def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: + """Verifies the signature for the given value.""" + try: + sig = base64_decode(sig) + except Exception: + return False + + value = want_bytes(value) + + for secret_key in reversed(self.secret_keys): + key = self.derive_key(secret_key) + + if self.algorithm.verify_signature(key, value, sig): + return True + + return False + + def unsign(self, signed_value: str | bytes) -> bytes: + """Unsigns the given string.""" + signed_value = want_bytes(signed_value) + + if self.sep not in signed_value: + raise BadSignature(f"No {self.sep!r} found in value") + + value, sig = signed_value.rsplit(self.sep, 1) + + if self.verify_signature(value, sig): + return value + + raise BadSignature(f"Signature {sig!r} does not match", payload=value) + + def validate(self, signed_value: str | bytes) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid. + """ + try: + self.unsign(signed_value) + return True + except BadSignature: + return False diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/timed.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/timed.py new file mode 100644 index 0000000..7384375 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/timed.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +import collections.abc as cabc +import time +import typing as t +from datetime import datetime +from datetime import timezone + +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import bytes_to_int +from .encoding import int_to_bytes +from .encoding import want_bytes +from .exc import BadSignature +from .exc import BadTimeSignature +from .exc import SignatureExpired +from .serializer import _TSerialized +from .serializer import Serializer +from .signer import Signer + + +class TimestampSigner(Signer): + """Works like the regular :class:`.Signer` but also records the time + of the signing and can be used to expire signatures. The + :meth:`unsign` method can raise :exc:`.SignatureExpired` if the + unsigning failed because the signature is expired. + """ + + def get_timestamp(self) -> int: + """Returns the current timestamp. The function must return an + integer. + """ + return int(time.time()) + + def timestamp_to_datetime(self, ts: int) -> datetime: + """Convert the timestamp from :meth:`get_timestamp` into an + aware :class`datetime.datetime` in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + return datetime.fromtimestamp(ts, tz=timezone.utc) + + def sign(self, value: str | bytes) -> bytes: + """Signs the given string and also attaches time information.""" + value = want_bytes(value) + timestamp = base64_encode(int_to_bytes(self.get_timestamp())) + sep = want_bytes(self.sep) + value = value + sep + timestamp + return value + sep + self.get_signature(value) + + # Ignore overlapping signatures check, return_timestamp is the only + # parameter that affects the return type. + + @t.overload + def unsign( # type: ignore[overload-overlap] + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[False] = False, + ) -> bytes: ... + + @t.overload + def unsign( + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[True] = True, + ) -> tuple[bytes, datetime]: ... + + def unsign( + self, + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: bool = False, + ) -> tuple[bytes, datetime] | bytes: + """Works like the regular :meth:`.Signer.unsign` but can also + validate the time. See the base docstring of the class for + the general behavior. If ``return_timestamp`` is ``True`` the + timestamp of the signature will be returned as an aware + :class:`datetime.datetime` object in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + try: + result = super().unsign(signed_value) + sig_error = None + except BadSignature as e: + sig_error = e + result = e.payload or b"" + + sep = want_bytes(self.sep) + + # If there is no timestamp in the result there is something + # seriously wrong. In case there was a signature error, we raise + # that one directly, otherwise we have a weird situation in + # which we shouldn't have come except someone uses a time-based + # serializer on non-timestamp data, so catch that. + if sep not in result: + if sig_error: + raise sig_error + + raise BadTimeSignature("timestamp missing", payload=result) + + value, ts_bytes = result.rsplit(sep, 1) + ts_int: int | None = None + ts_dt: datetime | None = None + + try: + ts_int = bytes_to_int(base64_decode(ts_bytes)) + except Exception: + pass + + # Signature is *not* okay. Raise a proper error now that we have + # split the value and the timestamp. + if sig_error is not None: + if ts_int is not None: + try: + ts_dt = self.timestamp_to_datetime(ts_int) + except (ValueError, OSError, OverflowError) as exc: + # Windows raises OSError + # 32-bit raises OverflowError + raise BadTimeSignature( + "Malformed timestamp", payload=value + ) from exc + + raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) + + # Signature was okay but the timestamp is actually not there or + # malformed. Should not happen, but we handle it anyway. + if ts_int is None: + raise BadTimeSignature("Malformed timestamp", payload=value) + + # Check timestamp is not older than max_age + if max_age is not None: + age = self.get_timestamp() - ts_int + + if age > max_age: + raise SignatureExpired( + f"Signature age {age} > {max_age} seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if age < 0: + raise SignatureExpired( + f"Signature age {age} < 0 seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if return_timestamp: + return value, self.timestamp_to_datetime(ts_int) + + return value + + def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid.""" + try: + self.unsign(signed_value, max_age=max_age) + return True + except BadSignature: + return False + + +class TimedSerializer(Serializer[_TSerialized]): + """Uses :class:`TimestampSigner` instead of the default + :class:`.Signer`. + """ + + default_signer: type[TimestampSigner] = TimestampSigner + + def iter_unsigners( + self, salt: str | bytes | None = None + ) -> cabc.Iterator[TimestampSigner]: + return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) + + # TODO: Signature is incompatible because parameters were added + # before salt. + + def loads( # type: ignore[override] + self, + s: str | bytes, + max_age: int | None = None, + return_timestamp: bool = False, + salt: str | bytes | None = None, + ) -> t.Any: + """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the + signature validation fails. If a ``max_age`` is provided it will + ensure the signature is not older than that time in seconds. In + case the signature is outdated, :exc:`.SignatureExpired` is + raised. All arguments are forwarded to the signer's + :meth:`~TimestampSigner.unsign` method. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + base64d, timestamp = signer.unsign( + s, max_age=max_age, return_timestamp=True + ) + payload = self.load_payload(base64d) + + if return_timestamp: + return payload, timestamp + + return payload + except SignatureExpired: + # The signature was unsigned successfully but was + # expired. Do not try the next signer. + raise + except BadSignature as err: + last_exception = err + + raise t.cast(BadSignature, last_exception) + + def loads_unsafe( # type: ignore[override] + self, + s: str | bytes, + max_age: int | None = None, + salt: str | bytes | None = None, + ) -> tuple[bool, t.Any]: + return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py new file mode 100644 index 0000000..56a0793 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +import typing as t +import zlib + +from ._json import _CompactJSON +from .encoding import base64_decode +from .encoding import base64_encode +from .exc import BadPayload +from .serializer import _PDataSerializer +from .serializer import Serializer +from .timed import TimedSerializer + + +class URLSafeSerializerMixin(Serializer[str]): + """Mixed in with a regular serializer it will attempt to zlib + compress the string to make it shorter if necessary. It will also + base64 encode the string so that it can safely be placed in a URL. + """ + + default_serializer: _PDataSerializer[str] = _CompactJSON + + def load_payload( + self, + payload: bytes, + *args: t.Any, + serializer: t.Any | None = None, + **kwargs: t.Any, + ) -> t.Any: + decompress = False + + if payload.startswith(b"."): + payload = payload[1:] + decompress = True + + try: + json = base64_decode(payload) + except Exception as e: + raise BadPayload( + "Could not base64 decode the payload because of an exception", + original_error=e, + ) from e + + if decompress: + try: + json = zlib.decompress(json) + except Exception as e: + raise BadPayload( + "Could not zlib decompress the payload before decoding the payload", + original_error=e, + ) from e + + return super().load_payload(json, *args, **kwargs) + + def dump_payload(self, obj: t.Any) -> bytes: + json = super().dump_payload(obj) + is_compressed = False + compressed = zlib.compress(json) + + if len(compressed) < (len(json) - 1): + json = compressed + is_compressed = True + + base64d = base64_encode(json) + + if is_compressed: + base64d = b"." + base64d + + return base64d + + +class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): + """Works like :class:`.Serializer` but dumps and loads into a URL + safe string consisting of the upper and lowercase character of the + alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ + + +class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): + """Works like :class:`.TimedSerializer` but dumps and loads into a + URL safe string consisting of the upper and lowercase character of + the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA new file mode 100644 index 0000000..ffef2ff --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: Jinja2 +Version: 3.1.6 +Summary: A very fast and expressive template engine. +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ +Provides-Extra: i18n + +# Jinja + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +## In A Nutshell + +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} + +{% endblock %} +``` + +## Donate + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD new file mode 100644 index 0000000..ffa3866 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD @@ -0,0 +1,57 @@ +jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 +jinja2-3.1.6.dist-info/RECORD,, +jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 +jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 +jinja2/__pycache__/__init__.cpython-312.pyc,, +jinja2/__pycache__/_identifier.cpython-312.pyc,, +jinja2/__pycache__/async_utils.cpython-312.pyc,, +jinja2/__pycache__/bccache.cpython-312.pyc,, +jinja2/__pycache__/compiler.cpython-312.pyc,, +jinja2/__pycache__/constants.cpython-312.pyc,, +jinja2/__pycache__/debug.cpython-312.pyc,, +jinja2/__pycache__/defaults.cpython-312.pyc,, +jinja2/__pycache__/environment.cpython-312.pyc,, +jinja2/__pycache__/exceptions.cpython-312.pyc,, +jinja2/__pycache__/ext.cpython-312.pyc,, +jinja2/__pycache__/filters.cpython-312.pyc,, +jinja2/__pycache__/idtracking.cpython-312.pyc,, +jinja2/__pycache__/lexer.cpython-312.pyc,, +jinja2/__pycache__/loaders.cpython-312.pyc,, +jinja2/__pycache__/meta.cpython-312.pyc,, +jinja2/__pycache__/nativetypes.cpython-312.pyc,, +jinja2/__pycache__/nodes.cpython-312.pyc,, +jinja2/__pycache__/optimizer.cpython-312.pyc,, +jinja2/__pycache__/parser.cpython-312.pyc,, +jinja2/__pycache__/runtime.cpython-312.pyc,, +jinja2/__pycache__/sandbox.cpython-312.pyc,, +jinja2/__pycache__/tests.cpython-312.pyc,, +jinja2/__pycache__/utils.cpython-312.pyc,, +jinja2/__pycache__/visitor.cpython-312.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL new file mode 100644 index 0000000..23d2d7e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.11.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt new file mode 100644 index 0000000..abc3eae --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2=jinja2.ext:babel_extract[i18n] + diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__init__.py new file mode 100644 index 0000000..1a423a3 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__init__.py @@ -0,0 +1,38 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" + +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.6" diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88865a2df72ab8f298f4fc10225c05587be3ada7 GIT binary patch literal 1683 zcmZ9MTW=gS6vw^UB%93MbJ^SzCuu=ZwV9@cLZwoPBn=leB_e>3Uq;T1n{_&4k8Dra z?GwE54d5&AHF)J4tTYmWC*D96FMZyMO)s_pyEKIpg2zbq~SwNAuU-j}?Ue zw2k5!djqe&FCp|3iV#6jDH@AQ$ru?cSuO*YN!jr@@HiQFJP}VMlVsBIByfdP99QD0 zWSUGno&xrW=Xe^pN~(@M;2Nnpt^(Id-Ej@LK^l(hz)jM0+=yFAo3tG_foI5!;}-BN znRVO-o+ERPXMpF)yyIEm4(T|a1708tj^}|F$)e*l!Gp|PEb^;5;P=2E~25y2nJ)IgKQo(AJg_E`kWUUDTx!i3rN z{(|~IJEdWLe_&WBBX&T;9s^_Hh{x=7pds70yE?}#32j*Pc2D)m&D=1@)K_n|3fw99 zW38F8Nj*_YD!X*iQy8tncqYw}%tQo1bA|V1CJawl5!)_&JrX=yn5XWrirB{2B4W?s zprXR@_Niu1C5@O(q;}AgJiKXphdeaby{(%Ax%L`InF#G(uASPkjI#JsrUwG)VKo*D&-js{PU zHfmwas0!R0({`I&|8IOPrCJA}6o&N;^tW7lq)NbRUwM}_9tmt~7PHU36NoRWCb;8ZMekH&}03OxuVr-%DU55 z>`kYtR%%x2RvI9~O6=aAR!wWQthBAnSedmlXJy_>2V_`LR|TXNthH!m$;z^o6_DXX zW_YaCsx{WEtXtWzf~{jxDz(3N_ip!) z4s`d6=iLMNzWi^v&S;EJO%`#9t%XmNynut${w17=AM-Omb$0+9<~?6?!@B8J6>0y% z-Xr(?AmDLL6(75NNL-SD+dK*vC!b~e{zFxnMhmEOm2Z$3A@JMpoBw<}`=1>O z)ZgEH^Lqh&rr-bcQT1LRa3crbe&+sX?jFG80t8kGjGlPTMmBpX$9{)%Mp__I2x(#a=nDMxAvvm)sG?If!l)Xfsz+7K z*5Xu4Q7uii9Sjtz<)~JonohMb)sd{nsP0i6Nh3-|ii|WFNE!+mDj6*@+GKReMAD3r z>5++~l^`nx*&+*3OChU7mQEIWvL@6(wh^O-M-61{IN2$((_|xRD`aQM&XHXrTc`6V zog>nWQZorjQ*#@lP%}rZFr!wST9|Ifsg3D&n%bCdE7X2Y?JTuR)Yhqkhjn7q@u-8S z6DJ2zCru8bjzZ3JaZARlbjgvG^(OAJCM`N7v*rQ33hb_j#V;;#e9?A1a5u))(2~y^f z8pP(2HpJ!8DC1FuNB4O22(G}D0^`alKiOye)A7B9CTLtf7@UO(o>bH-+?a3^)8>db!i+cKyn)s1 zIJeQT?eKFH&!hbO3}W+UmGP#-TV=*ueePr!clNpS3{vNg%^mdSxZLSOE_ffe_8~*a zWE!4KBjIV}*)*16)7Z&0b~cSw;9Ar8;WU0eb((DIw5Q$4w6C#ge{vHx*-f~46V2a5 zk3_yH@-7qkkvJ-fqf>F*631Y24Oc*0!wuISX!gPh%7v?~iV_{B& z6%m%jgw+&QS6DsK#FLw*Xf{OCzHJn52Vr(Q*t;EQkml{cxgEH-7Ye(**t_*6ekL{Y zGdr4}QF;uQOFx6ZRa{~q0g_->7WTkE8X3WTRs~f3j9W(0t@)Wz5@wX~)o_^M5(UVs zktCSFL{W*hq`CCfxXi>+iPxlYeKnB)$R-?LP0HCMW|Iy~Dh#%y+4a?Q118-EV_)4l z#bC$u)m?eRZVU{82gWEUagYLOupYLrLus%91Kk-a z2F9_kn%gjD-d9`lajhPZk84eQwX+Y?sR2V8Ou20sR~kIQ#g5$(kng#R7um(SJ-J-( z6M!@6so+2su>GOzW7zYv7P`+`uAgm4(?Df}X0oHPpB?YPjQ9QHP5~7CLZZTOF@P;i z2VfTkoKhi~kY)#%(%61sD+;p}_X~9#OrhQbGHf(J*DsiuF^^F⪻cqO}{9=H^p!g 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 IzK->O0XXkpR{#J2 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/bccache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3aeaa8d5cfc76b1436432b3a0c835c05e74e1da7 GIT binary patch literal 19375 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 Wia`0wx1{5u*f{geKM0hwZT{cm%By4m literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cb5744bbdd2a169dec020c931ebf33e4fbf4ed7 GIT binary patch literal 104090 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 AHvj+t literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3099a39c348fffab4c011ae94d17c20df18a6500 GIT binary patch literal 1586 zcmX|BO^+Nk5S@X5qLx-DNL-PxIcz!!H-xwl4oD;$Wd%rFqH4Qlx)y)*mhG12mmq!u zefqXSTs8x1G}2b90o;VKyRwZ3bLr-?(+wVSB-{m{)S2gv_rL zqacS83X$h8wTmCz$*o6Str)f_qkR$M9wYr+G7 zZ6_7bHm4IlA|^v~B=?x00Il4jt*oS(&&U#GnPwQ20w%g#@_>I&=>%LGsON5KZx;D_ z_O1jeuBaE7Ov-K{#TsJWzi_}i$A}lMSZ7$U!?x8FTDxV&1WOB05e5niq}*BtpfSEc zsk3b+9^Na?01_2DU*Z-euG?D3Bq-0Kk|4mM1yx*nTm`HE6v?-8#t(GB35ZbEncvSxq@JTV0DB? zbv%w^06DDVaiKH=&;@4=ecI4b*j78M(U807U=EoZno>fCuuuZ*&%jh^;M8yxVSZQK zQO?Sgd{JZ8BR+ear!x@n=qQ!z&8?(@#4FFXdjg2|2d5R=u~OMbq@JKnaw|?1!>)vu z8sJ$`ytTyM797X5$E7!v?Zw0WUk|>&diCw|*WbOo{^9xSpRQg#yZ(Lm&TiZH>o}Lh zV=6Nx3ZpV=IzD;)`0^Q@>gCnp@|zNP{1J7a=&ntx;%vyh)N%uj>j-k|h@&+wr-lN4 z@#x9Z5wi2;LjD)R)imBnzM-e1U6pnb)JMzd{r#_S+w{m^>&KvBH-Ei=dHdmhzkhr0 O)6YKtbN4{+VdP&bK0%BC literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc5cfc0a9ffd8ed8578b162101c21abdb0fa8b7c GIT binary patch literal 6611 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/ext.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6bfe2e1cfe2d5cbe8d8b2af9e8dd6b3144b305b GIT binary patch literal 41943 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/filters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb91defce242bdeaf86a30ff41f504c2a4cea50c GIT binary patch literal 72360 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 F{{W;sa?St% literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/idtracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e819f701db92a384b9615151a10531d88ffa8921 GIT binary patch literal 19225 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 OZ%?lOpB(+NMgCu&*qzS+ literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/lexer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e867dd346131d0446a026ebf9dd4eb6488d06bc7 GIT binary patch literal 32106 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 Vy8_+s+V-RMueLLsdV?Qpl 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 b$lhA}NyA4CzwiEN+x(N?eSqLQ&t(1sNpVn# literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/nativetypes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac7f5c4427362d8d142c15b80698992b05d548eb GIT binary patch literal 7041 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
    (+?dRE&>WF?@j&D$ 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/optimizer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb2a889831c3212ea39f4f93600b045a0460881e GIT binary patch literal 2719 zcmaJ@UuYc18K2qP+xw@}$<`^7?X(%N8s$>^PIltZM!~7=D5+hf1SAT+(k|=WIo+Q3 zb}ln}l1{l4Qw)(G+E~z{7)tGiLLJ;vKQ>RHdCf}{Cs-^An3g`|?NYha_^IE_-b%7j zJ8(1KeDm%1_xH`*C;5C9!T5XOb}ifh8N*9AGt~^pr>Nd2?mF(1PTI*h*}czdhLgLjS92PA z4LJjsk&~y!twi);b)ch_2Cctfgy!p%uvXwU-4)77z+Eaxz=+L!5mk!d_ zn3o~>lxCItB48X;%lyXi^R`DtIs3IN;Oy5>I8?%6(q|48Kon+ynCF%+WR@rgR&Lr~ zbUE{z;76!S!7xX6SX@FiG&l{~+_yEUwm;;7#L3prVOmFlw53KD-|EwEYe64L2sQNh zd}j^fK0uB14mYN{S|boNR844JY4u3W|x>N2Tea?urT zP)hI=@VE>o%xpJ|kZAx54;L$S)})mtt6NRWsc_n2qH=6<^5`p8M;v{+`zjpTzTQw-&ucl?b-L->+Bl4 z>D>ADb9Zvjf2u#f1@g$2Q#|6DZLI?59l!uZRSb8T=A;}A?v#X+fICOsg7GKO>gd$i z>o#+e|AUYB)>BKbq8fIL%L7%QmT@%$SV(h;8lHja5xh#YD7?xHtfMaOA`_@+bO1xM zC9LXJ(n4KOuckIaentr22TPbXP1kn=(_GoV4Tf^edlDps4E7S*JoNOc{zZC>55rag zBGfIuAVTBfl3XA0OZGqkep{2!HNU~TJL!tvMZW}$b@2l3YVYGe8!qZ5{(ygl-^M`_ zzEPu#|9>CFeZprlXqV(3b!p^dojYq6H>7uujjqO%UCqGPAEGl6xOo}$N ze3)OLKIN`$s`d=C(4^|cvT470r{T>ClV{{R77o@pYnp98;B9z|oG@((6Yc?M^h01H zYU=FSCiJXuFL<<+i989$#jGn)3iNH2-6g@M$q=;lEM%F7Hn5WccAl#Z%@IY zxCYY$)s;gdSC%#k<2U9%Elk~f<+H-n?N>JnQ>*&@G#Yr~s`K0F>*ubW`#d+%(^C17 zFGrtTe{1cnyQ9Z8MvrY4$JS@oWL`5!1}qhbG?M5C!YCZ`}ggL{@(XLN`9DB^u5gBy9civ{7({O zzCkcWT`ZNB@?pv}9cF{uM$nOeI3f=tm&23-8RJ~mJ+nVzBJ6IV~Hzqs}yloOx0Iir@p(vKP+HlWJ*#Qnh$T)bNNH-bf(`!7)_kV60f literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6784fe69bf7be813ec802fe177f3ac8390eaf592 GIT binary patch literal 61233 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/runtime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f59044bd34907d675f697df4127075457e04c7b7 GIT binary patch literal 48921 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 X?r?bBY36xnvT^6agI{vUG1mOQVf;C6 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b37fc98ef2ebe77360f3a85f906bb4449e1c56c GIT binary patch literal 9080 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea17d7636a7f8982b852a51173c1ebac681f7bfc GIT binary patch literal 34893 zcmc(|eRLZ~mLJ*;G(db3{3b<-Qj-)#QY1lrS~m4zQ+{yFTle0&b^DLqZij&D&prR@Quix@@E_=h zez~>4(lM(b+!W3TilB%g;VgfOXGQkgbk@Y4=Cfw@l+If4G=;2#MQ4jdN^3^gcGkwi zQpi5&IO||x3&PH`P8PO?T!ZejZWb;I6%TsOdRW*NDj6(2Tgt*>sO)T6z%sB&Z(#PR zO04dRvy~T2>!P7eG`v4yT&9uD=4nl1;uT| z)uOiA_q8l%*A^}*uudu7gEV#lsq2i?>ydh&mNn-Q@KC+T6eu9*QK)!Iln9LyD{f?C4O&YZLdPxs{_Kok(DLBZ{~4lH|6B4LC$7nP2pal z_7>D$i!`kY_5Ae8QVZv#{wZaOh}`RtyG=Qy)Zy8#Jgck^bSN7FEhxM2m{=A0b<0_= z@|;qSlnwZ!l)&5N7h?OC#{sGZOQrVEU%yppMCn@})8h`bc_Z4o?Q7CBA%+pR@zh=$~>}X#s>Jp=`tZ-OABbA-x@a z+re<9qu-|NMCv_(qJj8I2o5Ax#(=3S_5h39kGLKq?jVahfVhK3+@TS%^~C2?^odq6ZT4O8<6%(( zSB3)!SpAnGK|h7;sxPeI?;`z>jz#>J@wD|sl)&kcA&M)xG8~Bodi&MLVDE*ISRk4f z4|x%9xeyr+EB@TZYcyO~+KAYjLO`Ik3+t8`F!!4j6K1QVh0O?CMx<6t+SPkJ7>x$Q z7pc0mRSm?3)v#ZiWk%sdHWFy9bRu0e$aCEh?x5MxK&U@TdE`fG=cUMCpmQ*C z$v5azI@Q2XB-*)k%a)D9mj*`_*E+$O8f)4;yBh zCpU!{?))0i(MpfNGa>XEu?gXn&?@?VALIWGUo@zHjrP@~Xq(Sa2}l z?TMfz*JFLMkEiPos?nJ2Q!fq=2Es9ij4KvlB`5)ZMD@i2irhaO_Q!&euzc-OAT0ZR zp%5akT?&Q*vKk000TswA`{Y<)a43WfUI#0t#}}3_1mxi;5+ko(NVHw<4~75@1TgWC zD;kSxSq}FjWoSh1>(iR)4P0d~<8AJfgHbsg2q*!ioyuj^bWy=weM9JNZ(eGzT%fq{ z)u0*)Q&;<_G*&`RiE>_PIf=CfdcE>hv>dSTDQHDkm%QD(#k++SL!dhu00jJjD0<-M zfY!T>>ZrHbcm{*MJ}=ALY6gPR*mbKH(?wd=bTJ#dUe+~?&>c~&$H?c-1s8j#rB|Er zmUz}EVg8u#Wvx&n->Yt(t8O0aUXUslovyLx7-s%2MZ32ihjwA0d(?Xnqo|GO|6atS zF*p?f_N#&Zu0BGC4h=W}G=uct3M+H^;RTJ%L#4+fW=`T?AC;&dS~pgpQ|`NED5W+6 z4bm=30kXrUklKVOmEj0mEI36iT`_so%}BQkfBC4?K3CoTzY~>eABRc@b6{AQdVzAW zF(&%=cR;;<4dRf4JS#^u+fPm?vqXZAs52*b;Q=k-1DY*J?Z8+*mouJaj5M^(Rktl4 zPb4xfh~w;9`X_i~*%>Ar*tB;!4}-O}d~FKr*QO{6*uW~;6;r@5Kr8ODOW~rFq=1n! z>U9xA#ermwTo~X>tg%d@1Y)4r61xKdEU`2R*p(0!QRf_0S3)ebWhJ6pgD!#W`8KEb|M_58fBT!EgNGS(U^FtPT;+I)LBZr4!1GkGiTZ4_Eb&F zg0pq8yy{+g(_DE|%GLD1Q?79^ZgnjZs+3x-!!0cZ!o!1U$u}H}s2eG^m2RYvNITiu zKNtY>rl_QLNsF3g;B)Xp54tKann z{a!K)*3yTRfHOr@Q{MVRfV84C-v2j2On`Q4?bFHD5SJET$Upp$i(tHrg*=^{GMMg%FqqSw4iEf$KhSl>ynO zmx_-1hC?x}ba10#)+#v^yv!Lw^f}tq#aDac2atjOC{qhcZ`Xh9ZEkMuVi2KJbOE}- zXs^*0O1&%vrQ!mbUP@j8+AHK^(Vr7qLQu3DPz0Y>q;cZv(|DP71R?qH5ok3rd|~l< zB*c~5D0M%wk+LURf!mnymo zv1ze4uldBzQif0}J%^~A`6571D?;CE z8Z^_~0adUYd5nO*Ea1I3;54F*K=wT?8$KDMb%f+v`EnpIlqD8GG0csqOqiXs@)Cd) zITW}Kd4SEjKonT2avWqrPn6^+U_39BW@NZICSUSh#bhM>_hSmg0;`oNL(F1WMBEG$ z-DLR$<}IQ}kKdP2}&`4lTQKd9nfzOmsZ`5GG7aeA@+F$@AVMOKw! zaL_kmOizC(00f}AdH4BrS4oi!j9z;&5bKQ&fvNO`1Ce1!URhoPuU)+iF1;)(q;Iw? zslzL%;}(-!ss4pB1pJ`amr>@_bjsvbw0@8B=mfEy-(ORzlkbE)xx zwBerAHYc?$NF9q($vvrRPOAEuRKur)GdMUDQDaOGkhVr4zJ_Cd!Z7_JmWIua&k(pt znoThwTou$R;Fq?-=t=2G)LZ8n&e1F~jhe$virL6RWi7iD^ZQy!=kOLeB;;}C(tiE@ zDIo@pEWdKzn-ocr66TBI`?QweN|^OFoDv#^81;c&F(>Pv!RdU4O2y&R)=X_B`pZ)?67u)5OFOS3X$TY??faVKsvr; z^FFc`_4`O`#uq3Es+6@$g8`{Z*xJq#J`%gwgnJ}8sj(n+pLAKg zVCb@nFeiy0O*;=Wcpg;Mh?*|$MpO{gAi#cuJw5@XP@l&wZRL6}zU&-COq6&KTH`e4 z)vXoIaX=-0^-W6l25w_QrpjR{TXYsrw#_-~7HgaC)wa#mw$1d+md@91pEx>xXsTz? zT{3xe&b?u=uH|0c_PM(4vpw^5PfnZ|KQ!4r75%KdE_r#rd~?dR`M#&>2l44mGaF~6 z+30LwzIxAH|GZ~^%C`R(_g&R*uTME!z7R~7vQIpfi>}g#W}&1iW5(}COhA2YUw5tW zkyu0b+OqCW^G9A0_p}WHRDhIwX$f5olIX#oMgDhLp5{FVwjt(SRnELyW~3 zV3NquVGawbIAV$!BryxUQ4z~CrQK zB(T-i_>4X-Gy;SrawM0%Zif5-jl9N(66vBfJ904`j0Y4pCZx0v1!7=t7!_Dq1hM9P zf)kq#J}=+{hu#9dmgU!ZTjDGt?8xYOn&x0bz8{hu!x0AIW7d0-HRo-l$YM)%6yq5Abr)VC&DRrUGjxw^mgJ_A{m}}Hs#!rl6I`b9>NMX7uO?@!{&)1wz3nzBYmckI288+ zeuJ1J;7>G4K1?HF=x&FwV8y&cfGSe;c~zRvU`mR#7>MfDA(lp^%~2gX6wZYXd&zDe z(i;zMW5R!w)_+Qp`uFyvq-xd=-!mwljpi%t-ooxgLR&7yVnflVyE;1)*REYV=WUhc zMmY*rk`N7x(zR>Zq%AL>yVlfkz746`TAyYKhc76RK?q~nL`H~8f7#a&KmY2s_9wQF zQgSTVLBAXeam1tqiM-_3!yO$|2W8p$6w4A+!qD00$`NB{X(x3upV?P`5>+h~5w)2%4_iP7_VQBN2} zap3TK%hO$5TFpC0`EU_q$=!w`8p&Tl^FJ$J2bBjz!7YSP76zXyAV)le^ESJGxR5K3EP*boTB(r%VYuwlQz&AsFzQOU253)o*`>Jj7OT5++C^G|WtZaq zHQR;skc5f{Xj^I7rMHaQr4&P(@NErJp3xGtlXPUuu7pQ#=V)o7bd@wEdYa4FXH~^F z+heqlu`5Q}Pj(@7QZXNo1X=oo5q@!iXM~c5?SHj2_tJhy;VrhBIiRy;0Yn`4$btr2YOwcZ) zMV$%hyB!G$m;&Z=6fjFvT*gLNRD9E3xCMy{y*#8@yK+3VvM~m4ZkB|E6XS&167C-g zKQbq*2|MYNCrxi|mjuN=(5ito=aHpEV1Cy5c7vGrM8epGj>%_E9wRjsw5!*l>g#LQengF5;FG*O9^6nU7U`lN#3l#mH)|Ty_i6yDaJ2jwb(;(P zSQmqU!bN$Ab^v(aHSr4>kk35`*$F7wxou z(ttoOk6FgFM+_-6?wwnWQ1zHQ05(&_@Q#si&$lNo1fb{*MzBr7Fe|$^?8iRLMcs6S zy`z#&v;O9_30+|D4UmTF8ci@VIr$aKdo~b;`XAb5KDYRE(q=qi4jW8etMAh~_A8c6 zZAHtN%%#GP3iB-h1RWky$Xdvo14=eUbI_bBG`dVOkhZPBN86a+dUNC#eW4%~3a&m| z3ha6=hOwh%6oj_uvzAR-&>sKg05pym9=7%6hc*+mkl=hGEnZ(~c|~k8u~bVtaQlZ~ zm9q?NmPMTqFCPFiVoSi(d;-fGmJE?;AZW|cbRur{ddVu#49td1siGux5H~JUj%mBW zIxiou0YeW(f_G0S0)wjPKCk|!82mw$)`4G)3HLo^lUu)cHCgWh%uk^C`QxA?|*q<>i(==M$SkvE2}At&hakN8&!F zr+6f`KN1~}q)iuNyW^!TFSqXVwx0_lDSo%MZEQ8SnjVQQD(w|fXpc&~7xtzkDoY)u zifl|~#3B(d($_J+SBRV7cVtpvpF! zGgRPd8*WiTcWgXhw}aj?>Vj<#7?H-(7G{8&He*{hZ3$x2^}0&J8FrvM{{r4 z#b<<-&ja-xB>PYJi*Cnc1nOswiGr;vRaBpmBzxuCX4n?kE8jK$H+p1BL>`65yJi?) z+AF`b3U1Gh=O&(;{N~%ycf0O2?wD)bF?)Kxv1@+A?s?aqv4fxNd~&ktZO6Tu*14M2 zna24VZ>qX;=E|IB>)i`u&waA*z~te#2kx!!oLk>HYn@-eD^>U8U2(3g>!%H4M?WiH zmpn6H4m;1MEo~D;om#th!MX2#Mb*v2Q-@RQ zx6K}!uh>0)@KaC4V)eS4uTH)C*65_PxMst&XS(UVws+co+>u(dWzw3l2~EevF9esp zWzHp!A4%F4YvtSRx7w%U^R?T?k3R6!Ci`!PZiQx^oL|4=W6zEUB{cw1)!MhWCtsa8 z@WGKgM`o|jw?8w#wtK#EKkPKzEtBHnI{EgITSum^&#&9^d)sHP|FgYw>zQq|2<(nCA4W=heHFV_jK3Z^mMwBW3V%J7~?p7Y4l zwF{p1S?j$m-E&*IKWtsta_m9XhG}c^`t+5Vni8APa7gEohOr3l& zRq+z^`=!-@QFY6Vb^7|umD!qE$KBm`J3hSfNi{OhS2w4sT4tn-S*-NxX^SiFx!2FR z*C$67+^xSI{2+2Ca<~7(7d||BcVNMLc(GcZu9~*Zm}Z`st)Fd}>6&SuRZ^9^Ck|zR zIVF=%OdMaVsJ&OwG*{6y-M>)L@xb`yU#Qr;SW=#RVy>kAe#x4fo+;0?b)lsBL3J~0 zojSW|w&rd{s&e1Np$G2TlpCbF8JiXEmqfs-d`iSCA%s@Q2HwfN=1r!)TT(+#Zgj`SVo=rb0LpAMs>0) zn>$C%V#;n`zE7(bF8zs;LHC*3rFgW+F2oFRI$_b%KxG1@2?=PbIpKsrDZW{eu&HGU z=fGnXEsAy2mMG4)Ln%^hy0Rb+#aY76)_SO8Mwz;Y3Hy$OQ*p46GcT_bsu$8R<6?Oo zEHBbYnAz?ir=oqN?OMimrDv!4rY%UXFL*NPrWo(@c!}tj7C9#!;QMzurPWPu!HGkk)71E!)RdpoaH_9Th_tAmlM+qiT;$LH2d=ou z;ZPHZ^=n9rpddgr7q;VXiMCje!bXKyuk+AXjp7tYmZdCYTL_CUtt7@)n*UGnrU(#k zfK`s^pPI2#Z;qSy4DBPPW@z6D@RxrNRj9AycE^-9dAD$;j+(9Q-9EDKxd<8H`jEOW z-b^8q26`EUdKrYWoTriS2WUc+6i)w{R^X3IduFdp_83cM{d`S(s=8z5^g`LTxze6r zMv1b#*4QMry3=;ZiC_k>&9D9w#4;{P{XT{MKHZ27RS7z22e#&eF|hS z7QLOI8+9seB{jnEP-}_$TNL+Wx)C{3-=!NX{s#!rNtq~Yx;W!eg09A39ikVmq#Zc_ zfEbeU({2`q)j|k{X+vs~vP%?~7QvqdmFsECP%k#Qqjc(I8JnVQg;x}Uq53b8-bYX) zBY4=M*aS<*16SQWSL2+kao*K5c5u<{89VfuoA~%|ejzkj>R|4)c0zl$XKLrerM`C^VKcj9~xUyCGrDL*$=*zyfR(? zR_~l=<8=IE&(_5{dD5|1Qa4>XSJE))UM#6dnx~wT5>Kj5Z=0{&H0RkgQ}?mwiN%gB zsgf;|j^ueG*O`zJEZXk?~cD6JrNC|UZJbKLU4S;Dx2#s%kkv@qG2 z+%|b+x_qu;!A-LOyCfs%I*EtK}m+j^GFCYLn>a{((i z{3#;7HHzI5E2u*6m8hR4x_%KB)94!NU__K%Ghs_$nD>lINK=M&+L)~(@hg7~|2)nG%>Oeq+76@dOoq;2L z2Rj$%m7hm;5L;{_b4?X!0jVdU_tC67X-07q5+ccA*aVR!Exp#tTD29FQ`7NiE$fmG zvfNxfwW0)QmW(dsWai`EC3A2zbT%+W0YRdnt${%$inDFHl7L~&5}+q^#?4LJwmcFc zzpCB%jWd6A0FaA=R^AVlI2@RD@}oa6u<68a^(S=uklsj4Of;!ims{7^X-|*AQ2iq$ zBulL5IRs#VQ6jjiCjD>k1SfspgE{kdbivbjzYJEMZ?%l~(B}HU#6YrozPNte{ApRu z#P*~zcHq99W>;+9zHw~-r$ug1o*QQ;&L%C%=)Aje-1NZd9y`qU-cgBh>3F&HhnNLf z8-GQ_F?&-0_VtQ{!^qh7!*TodiWN_*V#WbjB9+UofF1F)RxZ1=Bc>*$2)Uh#?QfD> zYlj^rxLEzQ%PPUo!nG?7qkboH7b_cZxL!KzQDnuvN{-@H;;G+-`e#) zlvoOgm!hp@tG3h}D97lOAx#CKBH@rJ9n-Hw*p4tA(XV<;-om|+6gtXZy=uOy!cbr% zWL2t>w`SG69GmFC{~9)mI|`2CuROMeTarC?3>d6IU27jxSAp@QT}$L7mjmnmMmg6a zXC2GAr(pk9uag`VZ1@}HB-aLVz;m`9#?19;+p&{pddO}$-q0<>*pf`>5hb%YGByms z3y{$Ol`sYXxa*~!rw$kxYK5CB69Yn)!AQ$eh3y+kP4l{HhZA3O`Gi&5==}q^dcMCo4H@E-z8UjvYCyFPEe`e!W!+8w8 z0gFc{ftdRNJeOYu+55cHx&?C)kG$*x^b8JTmAXhgS#}|pQC7^5f^$a1FvM7;OgbB| z>_VAFP5L-F)qjgrFsq6Hnfh_S2qVKoW(3j_{Uj!RFmg4JE`qL-0xB&x7|d%>dtX+6 zj}_3X$pIuq=IW(W_#H3H4xv8q{}+wnal9N89@MP6?Y!l@SJO6E)5b=#qUPq&siQZa zpL!lY?ZgE`iFU8Lb*{P<5w81HwQoUThhfft^L-az84X-U@dSH@`9}~~ZL|SHgG)p* z?Lw?Ea(WyYjK6JWdj)sQ3~SZ@7w;Gp)%z4$1^_yp4jUiHRgm0pvOWumoalc|z^F%V z4h;7#_ab0IkE+_6m!~d2ERsqbq&#(SURYG}W;gYZ_3*j3hk}oXSHY}UW-n`jNW6k=$4uRGB-Y=fgS}*c3TRup|Y>>i%YuLSvl1qa8VKQE% zsGT$&(aw^Jo9-!h$^$vDfGw>tCIlPSE^6trt1#Z_N`%#HY70ss1#wj`iH;2vGTka9 zg`iCaZOJw_w(i^W#yplX{`}nQn^X|># zrbV0MhI7Js&sIBUt4;2>z4zAM1zRh{LcqLdtC_RaBr9&Oy|s41*0ks;9k=s2WxgC3 zNf&85zlDX%EvS)Bl#p>au@~&D2A=%F`3wsHZStGGg*V3O3^CrRgNmKSf>sMYNSIoS zot(iAJC4vnBJ0!Y?z;oeB}W4z%+w!5hOLkPAL>y50=Fn37K9?c@nQyPiMtHgkTD^F zhSWdUeUZ%ewTsX#n5Ujfxz_#SzNZ>zwJ56gH%>t9ZeRN->O#ubq$1%BXQlZEVx_ro z$Gec~u^oqtu7rueLab5&5L`VKh-EvdAEyAs$+(1!BCyL#@+*f3PCRlmc?U^G0PAD7;Q-#NA z_E{c-UqJEN_4qtE`jm5E8Wdh^6t-gVzGf0}z(~Zu5m7s0WQv#c&;hUPAmK2Jq<(^W z_^^OxC9e1=Z!xVd*~@4TlzWvgG=3DOudv_HW*p@_N4 zH@(S)x&s|LNJ=3V?1v`B{38pxDVQf*S+#hbLE>-WzE>-toWerPF)IHf2AqU?v!me?`JO4XiV=6 zO8NDtH(yakSLw0B)|-ULHpv=k1uDn{7^+A{5NLKRyYd)5tW*m7rz;&rzM>h+KUOp| zk%Bjy_0?L-14g32fN>5C*gpNE3<^YVQ5<}3sM6kwnetXX=+ zNYx^u(+=1t4fAt#Y8nwhq3nvwxDmo$RLfUfC*u^U7nm3oITHhGFOU82gi5sSgvG-p z6qns#&`8J#O_9N!PG5KI%kZQ?uAjURiOGA3*3nng%H$EJ==moHQ_ zWr_u4a80?Arxr@;ACy;qRfj?z3b_5^OP5g7fF1wRH4kkE2nCwy=dXj{z`n`Wf`;u{cfC zHFq|k`*gu7xD0QI1}wXBF)_S1yRBTf9Gyxi)_)HlxT{923XC9pw!8gQnC_BXXD^Y}TEof~|v$g9i|njUnWXf4V?cEWQ` z=l_I43v^q7>VJ*cd@c#74wk3@svEJeQx~Em$VhyWf$Bx}=0$yJoAWf1pv18FXE41e zt(ZK0^ZeBL`O?Pe*n6YzjDB3YgOL9C)bZ(!?{&P>@#D@^#kL1n_>WB-OO`LV>K5xa zjUOPkAc^g`^8MWB@K{3+$=(;Vqe*jA|v4Ti!U8Q#d^pi?#fR}Djct6QiDEbtO{@#;MvwScT#0ERVU`K1FQ2f)xB5`Z~J13=m(2An)Fnd0kKfC)+l z&HUV}S%HwaZK$2dR5uTWt&GG*;~ry;<`G*7Ffvku0bk#6d*If<4@3XX)0Qlq6esK7 zl0NpdrEG1##Dkeeyya@h@3z5{*Pw`e4AU1W#((cB*a3(ZVFZ@VzyX{# zAntrP3a^|bV}R#cAx5Po%9^7Fp`SacD=yZR&phRm2fi0i*|-f^;gKSVE4Rtn6J~|c zUGI?o)RkyZ0cxnJq%E;w=!*-AeoTiCyLT{3c{+R+^%S+8T!N8-boJYoq;mW6t;_Q@ zo9Ed8JVuWA+xG&~@bqD{f{fBhoz0|LHZ*x^2vW?n%aIU{`V*guS!yi9ut=eObmn(6 zOON3gNJ2VQbketb=Zuh?tGuL!cq_VyE~^Dt>S&lm8akA#Fv_y}LO|;0<;(JB!6wQbqSngP6q9{N{0f=9+S}bJ`i!GM5lUHsIPYq{K z>e}fm?+w4hgLlQBSpL95b*+6^Y_qIIU4dJHjDX;b?}NY{9=vH$yh5aRmm&2hi{=$1ZPS=sJv6T zM8QnE)6%TJLXZO>BOo{%TcSs%)?umCQy@sN!y{88S*p;d_*8tl{=MdRnrG@iXu8uh zTl)Kzzgs!eKG(2ouKG!WauqeUJt^LH+;U8BeQ)PGJ7JVfO>C#;)^cBJ@FZ9HPUT!x zGrg##wzntiZ*RV}dHRL-&b)I5zD5X|?HQ|NX#t2pj(Hzo!A*6vK!hr(_%1&l!Nxva z24^6^Bn6Hypg1NsuF-Tkjw!8(EYnncy<|ATO;?x-HP4#XSjK(}c=d+q4f7k8H>|lt zQW0Up2p3!WQl=Bb-^e*24X4mhFcnB+!SQU&W_}goD6(uKDU=l{>-qAGn6t&;NDBP8CR}63G>B7QT)F^nL5>C4(FUSchCd+4(~OcC z4oftb86a`o_pj!E4vH^Qu+nL`L2NXWwa+yiK!m*x^jZDEi^JOaoxECt++URvVR~KN zQQS2M@+7nCUgdOuesFCC4ky&FiT8(jW<3`lY0?oeNeLW)-bAS6nBy(@H70F3A6;5n zdB;eu%1ceBHsn4pnN@2(e7$fv)CWz0jzhWL=2)5B=d$kC=wQ}27EVhB;F2xYYxFyN zj0rBZllugvy z%FnGG)ZFjsqsF~1VHlYX9nd9@N>JVq#Nb{U{+_P;14CHzxF;1I<_xqz1MO&LpEm{< z)PMJ2D=_r|H?*y}{nrIp4pdhG-$+IZNG+qpf22#+x zjKV8l2<#wvkz+)RupJ(2j=>oscNSEji&P^o$`B;-F&@L3Em$u=D;d))>*-rBC=|hI zRc$``@=X1R2x!R0r<=Z2l|xw>1YnDYvyB8r)PQXr?zoc9QE}}b-{c`9j@79Yhz{r( z5gDCK8PrU#R(At^2-7?ofOeadgdhh|?!*Tr=>B+R9P=eMk2Lt?*DM^R6(a^KNsZuS zk94wwneYX^&HEJV!3q|7I|%erA8v+G_$F=?j=fc|BFituI0I2==Urb-aDd#TnTfZM z^F}fg2WNK@rJaCLxD~d}@G=F5dl4MZR6js;u8^btE+XO^SJ0ILX5oXxRJI~HHw#~P z=I#qHBQAZf=AD|E#vj++tKTtKzhl1siIlu+q3+4Kb!UFLBq8-{?OyTk4ic&iz^e6h z`&)E9oZt1jm+tzeMX)w4@3hQp|8d8?hMjW_JLemArRtwtSpU>q-AlhzH=@e4TPJ+X z*&ySx^FTqOAZ;%!UB~SoN~B*JGfhC?f4nTr42dc4vTH(mUqd4}*&+o*p)`ia6LQ2g z0keiy^NG`kAOkcKkS0(hOs_Uk_%9Gv>!=^4`s{}jdOE}peyKz!VR{TVYaPSI)!Yt) zLIvVYkHN2OvLS-+%0;l#)}!-kG?Qbii8yPNxG4MqE@3|@0jd3`7uKDbuRfEKD()ku?xj@E ziwkux&DXq?k}5Nj%~Jht{d=3=+5Fq5-svR9zWVo+ujs+TnF^TyA|2}pK3Ot6I227= zFEb01yp2jSrgGwM>CbQj5{Y9aF@*S4Nbx)>W^MEec~#@yw)#cb^_kuk|AAP@ttwQO zhTF@6?{jR?3%<7~R(;#3;QO4jSUOq*S?#_Qu=*6-H~8rE2&p+W?_Z$zK7G-_;(6rM z^C$SBeeGio10e2R2E;zj;9zwKgXptQHOSAMK7OoYI7~*`%yb-HiJ>{;1)PDWV_2%o z{D?2C+u?SCj{Y(#PfHs=f+Dlbj88N^yOBL1?B(ZK^p%G>r2EU)Nmjmcx^OETXjyO*8T`t&CvQ!w(eSkaR^>(r_u$q-NSum?BkD3{LxIV zVAyJLR#c@PExmLC;xCx)m1XTC4O^#&Em zxj)ENRG6OIaNa;&BW6+K{guctc`9KR@XBu8$tM}*bH{r84RPj7mHN8gU%6xa8^Uhz;L5W^TEIo1yI-J4CFwYyz&9=*#Vv4Ul|}? zr4J0`!c}1*5(!93uS&vf>d3Z;W83Pi65E82Th9$|*|Ocw&+YRcfk)yd9>490M`E)U+=cHYNd#oIoe1^c z1Eo{{IoP1Da>AV5Dlkg5Uu9)yPV`9LhxQHpqIf+-G*eNM8Pj0DfT0t6m0IX z(finUa!fhKEpV*O4;g)8bC3IBRXF(~ZvWn1GEqHQJ{g?1%fCu^$!VqYNLKAUk{?wW z7ja5-E&T>=E013cIM~~~Th5UTt72E^NCtf@0p|aOQp1oP$1ZfH@vQwZ>1-&;5pbM! z!i3zBw)Tv`;zsoy02Emevk(pqE?&}Ixj+d$LjGxJb`ApPK$9`KnH<uSDTr+z*|JOaT5Ipp-8 zG#`w%`BhOUDJW zhQ?GQ3~gh|13qtP%Dvjegc>z+joU&(N5J9J!U}JfdC9GE)2J~`_rO0ht7&h;1!M&E zYuIPJM1iCd;e8?y>%Gedgd;9Z zJ*nHFu|8q$)0ps2mr)G&@p=LqV7t)j<#vQ{u0jRHU0U1OuYXMqx1%=f<$Y}vcOczr zHUN;es4L4ZQpvK-yzAO#9yK_(6Yv3cWjF}^1nu8x9parM7D>ZG1K|u-jpiMruyPl< zQt#@c2&O>cpJmJ0Q8ICaD+rMytts(h4JO*}KO(5mX?-k(I7M7>BR&zw4pPgl7Fc5x zG&H33i!gXe#ceehVb``GloXLH@3JBZQW>@nc%fbT42a_$ki?if36fz=@o%mIVQmfa zDOcI|O}dB;?dsDy3Z^xyB_cA*0LySG3v}8pgsJLo!YKwu60SH@|1(0lvm-500dc1W zPWq7|SbC98H*+{QaSkTtuvmF+>bc~VsblZ<%t#+N?l^w@{9O5V%oSVKq+G>^h=o?y zvYj}!jJ1RsQAr`T755ZEX&WXt)KxgZ#TvVp#o>#GXvWIDupN|_ZvU8C_$?Ioy716c zZLwvxN!eW;1o@6w45>foB=hQ_apggGbxIXV&xOc!ZV9&cT^cg zp}_~xR@Q|Tq>;XQ1m!O_l(Q}85r0lCr;{;gIqVHbeq#g&i^dPU39I!=inu;;ecZ!U zEn?i%E|XRTsk2|G;@HZxE(}o*Q6rXZ%XU*7-Tstn+lc(H3!g}>4<&5)C3|Qavvy{O zw*4nrYLbm#0`2(0JeDmFt8~(_^e)O-hE+JpT!=YdjTy#AHZ1r|Gs8KhC{UzGh4W*7 zjhJQ|OJgsbMk~vKbas?e1csc>Av;Dat**5F1Y{<5_B{UWZsvrZ{V+sVS`3J%y#x*v zOv;5Iq(FSRB`Z=x*?%|&rNju9ct*K26**KShC-gK5g?OOMzAbQPXUt!^7v)&Jy9<{ zC58h`D#=aSoBMA9E6Oj&ZxSQN&5 za3dU3TB3%fOM49%^fG^BQ3!H}sTr&-#Ej$#a(tqd8JUc^_Fo8xHX%7MwsK9fe(I&9 zGQD+rTk_Jl0v}!QT6H>A-9G&yK4OR&$PfI1ZesxQlxh-6VB}$(cNO+V^bHuI{roDV zUCsaK1GBQGa+X~=XMc2L6*l6dviSNJu_Els+K(#2YbM?94-N+Rp?iY*pXhcB(19du z|bY*gTR2b)^um&4naPk#ovyoE$pSyJ~wXS`p zJLU1FY+g==odpRnQ-EjL1xAl)+_{Mjv$$DCl%J!wbR#!N(aUHO@du*i88KruSvp{~ zVY$UjOggx|1(E5FSw^NiGPWYi*6C9j0S|6AvP8j5nP_R8h7&(LX1YH(c;_Gs&MIWV z(MVrT?j+id2kQ!}o%2BAA^6lZsTXiy16Ql`IZ>k1D(N#mS8xLZXc><6cRYEhRRZ1k zF{09D$kAytw!PVMbNUdsYkF2CHeTIIy?cd1uTfen{FZ=&;Koc&d?JXp=gBZcrBT+- zp3@h?BZJI?5%Xn~wnG)dT?6w2%@*eUL?r|BvZ)`ISBV_R`lAFaItjnYy=DZ&1fmAX#S4*i94@hMg+oarM zGudVVk@?pQ9mj`bl^p{ zYT5tR{~(k;FiUSd{o2!iDm6Ti++*Eu9RBX%aX;AK+FP~LJskI^kIb#3{oD;h7oQ8`gLFKk#84t(0u_P%AzJ$~gzVj_`zZqCy*FLXSxJ8x7^ zRF7FR)?(2;*^LtzqB~i?M2}1Zg-dzV6)nnvC@~|@!v~8i(fwtuL#!B&-58k|`4Yb? zGPN*=rh@RGg7C<=ip5QwHK)QhO-oeRrc48+WFM_G46RtUnFB1_lFNav)K-dR$!JEv zW99&R+8+5kr>hb+Ij!eKMrFY)dIcA6K+S~@8 zSc~f$7Pszv=)5k9wTljS#!P_+6_r##GCK8q#zGPB0O@evsGX>t?3vh*DPmDJ!Cg!x zPDUr5&)8WMjLs`>c1?9@re@{0B6H>53@aO!W>))>ntc~3!=6>O z{MpjRpS!x)^MS>-WI?)zVX;Cip4@tK=hRNv;)%u6+u7spM)vqA0D{Pj7j*WXSUx9~ z-xJr(iR->Hoit&@1-e5LGu35yL`V`kdc?(!&czLl@VNERzEiAPtXXs0b;~t<3U+oG zGa??WslC1K);id6ui2cjAOcWWQ5Pl;O;agc{l{(;!5AB;A6$QvEGD3GVl z?2!~jNktyI0QZ)=b8|DZJKubFA2&CL2(*7j{xbPlGa>)NKh-8x1}h6NxJVQ-MifEu zXu_CB@hYO`O^IWoK$vHW>!{x5Ud`=X);H$&kY|V@ohOQq`KPw5mBN2lyzbmskW2bO zGH}IHnG5l`Ak2kWs3zHz^~9QHUm7@hf{q&|wM}`NnU<4{WY zV=1QFOrfW;d^KsL(yGQxD(gxp#cY|Xx@{U(nk8-3(0fCl%fj$w5)&QKV%oUrhglO{F@w-q zC`6%sY4=SUDb|-VCgqf@^qDMeSbdKjJlHcRXRV$W#(R##Z4BVv4DHe}Ap?ExHC>agM;duNE*ygU7=$9kd zj(0%Mnt1q3)MU0`htV;8)h-MJs|&jGq!bt_M2mruMfn|enZe-dnfEjAWngf<<&y_L zdhk|Y#MOW|Z+tec!%F?x7~^LH(`H=cdn@5tft2t~JpiH&P4RCs@7;JF&PxE!OW^;k zGYC3^*-)&>X~HbvJ7bvgPS}U<$=Yd)=aYQOg8WO`)XM6%d=`?CG0ZKB8%isCOvf`i zPcMrnEQ55-hVZ=MVTP%UuJlqm3dy_vhLoJ8?)j$EvX)^MotadVlXOM}{ihgL11JEQ zpsZ$jg6m08NbpHR=?!tIlaTca8<#Vh%}rnbERH5%1)611*<>`4*vG}<`w|J-&DA6| z*|I1eFlvl*MJNvTj~G;@iBU8Aw5o&i*@WvJzrPj%I%8xsg)2G*>Rsh^_wYEV7I-!( zPpg1#Nm++KG&w2j6Rv{>gwIqJz&ox6F)uN}?0ChWMD1Ci>%=%1u`a5VomDN{-3*yq z$u&J%A7`2vHguMVaSuVi&P+AwJ|j_62!>`Xuu9b}o5>Jp+*B7_uqe!Kw|iemBd*HY z4_~Usv6t6?6`~QAft6>WyGU#VU*2+1a%^02{|Q$rD^r-*4eeLtHy*`PEfOOn=AC`} zyBrud+-WcF&Erw#bM1(At~Tx zMT5abk|R^Ky@H8K%hmR2PRxm~ggqoD=7b3$=lQMh2cJrE-b=#Ig%JYtWU8@ffsT!2 zW5TRk2_eULzClEGf~?cL=4i&G)i|xzH%Az^&~glPC2kTA_iRgj#Q4;1kh4xecaGc* zZ&?m^EQLGrqc_95=7qaW;rS>3-WFXLEw**%2XC}>7oJ{f>n?`7??yW3?d3@4Qlzu6 zrx-c17`+iW^6u89$dO{;2#@EQC}QE@Q5=H-L{Zo%idSF_+aP)QAwuTFO`|0?Mphsf zc8DY^#5}V{kvL$2@-JzlY5?^6ew?%q~k(CEEBvIV}mPvP=3HK9nJ446Sx%4yp?$~ z!-rRe_oeqFKK!8b!>(&xD=1KI^-BE(5QfX*nRhamK^TS~2p>wu_vTi|KtjQpQ?hVcq4&u~OKPH~@IB z(VuV$!VC}fAcc5t?HF6oYDJ0Lw9ef21`z3H9EDVG8OmS7B(1 z3q`!lVi|Uox_XeSR0%?(QYZ)2YJ<0-FI7HMd4S6h#!Vx|AC)#4kb#UvHN%YoHQ+{b zMg?zFd!JRcPysdeWSxVnws2xmHPNL~6uA{}3$(#7)d{36t}&`!VOhMc=>}I*i2}Y) zQCmI@42egjzUbGAhKc2W4d!8u=a~0L*!Zu2d4DD3M^GE)#5t*s0Z4YO@>gFH&C?TP z&X)|_vusX-b1&H1l@ zr`Q0Ghd~BkJsR2?nS@Ak;D-XQ+U?}RD|Jtm*85=z7k;^^C(=4k0=dAsW*g(rTTaM{ z)rf#~f41?BsJ4;|R9O_P{SB;wT5Te%Kpr>ok}$3^O|hI1P�KvYv!jQVl4j3%7`` zj*p$SnXWiKIi1F;ogidaoD+U0q_Y`!XgQKQ6~HMD0f>ma ztk+7rTWxkW-~rH~ItKeB++}?V-8oXCdzR_JC3^5CJ@f@>4IYMiKR>i^^iE`ZK6YvJ zR%Cx^=OYWD($2kKkU&e%!qA;9KeFZ_r~`zrI9| z<)u>?2tlPGIYpV0>E0LQ7MXy z11?p@0mCZefZ_E$E4Wxb5R_W;cA3Csap0Yy%R_v4^*iss_}+_r_`#VEr>{+4SFYvm zqmWBa@R_kNH`(#Qs|vi4a;qJQr>6V$rFrxRCx_z4pB*~>{E6XboEBFu&e6fbYVLS! z<^Um&HW;S#D}}o;Om!xZ@OQ4zGXfIB8acn5Oig)APDz79zk3Q5TWfevhA){ y{Ml1Ked-_LuKS`OjS6|s8%?h_-6uHyPv8-u{~m$v{-Cg5Xk9q{Zvq$Y)PDhVTs7zb literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/_identifier.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/_identifier.py new file mode 100644 index 0000000..928c150 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/async_utils.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/async_utils.py new file mode 100644 index 0000000..f0c1402 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/async_utils.py @@ -0,0 +1,99 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +if t.TYPE_CHECKING: + import typing_extensions as te + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True # type: ignore[attr-defined] + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e + + +def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + return iterable.__aiter__() + else: + return _IteratorToAsyncIterator(iter(iterable)) + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/bccache.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/bccache.py new file mode 100644 index 0000000..ada8b09 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/bccache.py @@ -0,0 +1,408 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" + +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: ... + + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/compiler.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/compiler.py new file mode 100644 index 0000000..a4ff6a1 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/compiler.py @@ -0,0 +1,1998 @@ +"""Compiles nodes from the parser into Python code.""" + +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(new_func, f) # type: ignore[return-value] + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: # noqa E721 + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "te.Self": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "te.Self": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in ( + (self.filters, visitor.filters, "filters"), + ( + self.tests, + visitor.tests, + "tests", + ), + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(sorted(vars)): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, sorted(public_names))) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import async_exported + from .runtime import exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() + self.writeline( + f"{self.choose_async()}for event in gen:", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.with_context: + self.writeline( + f"gen = template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + loop_body() + else: + self.writeline("yield from template._get_default_module()._body_stream") + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") + message = ( + "the template {included_template.__name__!r}" + f" (imported on {position})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. + ref = frame.symbols.ref(node.name) + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/constants.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/constants.py new file mode 100644 index 0000000..41a1c23 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/debug.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/debug.py new file mode 100644 index 0000000..eeeeee7 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: t.Optional[Context] = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/defaults.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/defaults.py new file mode 100644 index 0000000..638cad3 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/environment.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/environment.py new file mode 100644 index 0000000..0fc6e5b --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/jinja2/environment.py @@ -0,0 +1,1672 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" + +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: # noqa E721 + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: _env_bound) -> _env_bound: + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = missing, + ) -> "te.Self": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "

    CBB5>BU?z*cjU|4ET(kO`!jf=nXUEiVpBfwUIC%#S}rmMG6qiQD2<=4a7o< zwNLRR2?z))2l9FWqgqAi$XE%WF)$cl@FmO6W-e>8p?WL6?3^PUHci1%DDlq4)V4O| zf$%+6X=4Lf`^VUafK}R+tGAKSTN4PaS|Inpmx-2ZSPz>^)=Vx%g;DU*!ICwFuu!xu zdIXB1-&RFD4?5hW61@G5U1;{sfYV}Q+EXy5c2yC=82SJVQ$i8JFb-qxkMuLS# zifXNyUMxPhAe8mej*MtpWH{^OJ+1jE+R3x55!KX!^eUql2|ro@FL=?o4KQbZFKbIC zvUUs-CM?1~Svx==>oy7`HF_t0$vx@4n&Rv=9hR?wNRW;@}bj_fMP{KlrJ? zlr$Q?3Evxm1yAYifaIx|-1@fj?cv$l&<*#_#hTF7ZSys) z6Ee?%7B%4Jc|{oG{tc|MuC2(Lsqd#MqPox-Tcjd$e6kX|wIhLP{ZKF6*LB!Tp7JLK9-kk=1mQ6}{K4A^9*MSHB+t7*_*QX~WHuO>-riW*qY+ z+s8T<+$Cc#E|%8L*6)7*(EAU3P(HivEAyrMWnr3QGh4CZgm41@O+t{3poOes;&sWdx7kULLw2+n`Rb4C&XL{*T* zXiC%IPfMEiJkKYZHJMI>0r>v}mL~gQ_!YJ(;N3KhS!&uAD%?Jz#Pyi8-Q;Fh@D3;e zuY$E@+3(x1t&t~!D5Sj$NYefdUVwU%II-qe~0^+Kt6Z9dD-(5-K}Yl}oq`N_E6!!*!iwnH*4Z>!&P zND}E10sKS&o7qYVXXvzs-4N@GT!;g5f&JJl%Gj=jP#Iz%cEqD_ljDsMS&hA#g~Jlz zCz1x3Pz(7=xR{8TuyQ&+5GVhobc*XC*s_{6P;grmu5@}^&x`C?9_~Ol4JJn+b-01W zkM$C=<<5cCI0vx+n^0hFB$$jEajyI;o&>%w#PD%}8-)1^n89!nA0k3Q5+$T9b~5$rz+zK(NIa!6TGlo)N`pKok!Tc~D+vd} zgn=Pod8DS-%&Z|=f-@wcspTyE!q0=J6aM%@>?HC-6*J9ZWp5KLE}@c;0vld$8&5W6 zqX&+VqFjN*v znuT3W?q$ocPWn3rTD$~@?j;~(AlH6~#9l)9K>ADqEzx6CwMJ@kIl2OS?jaHHmlmrjngk7Yjf*DeN1 zE_Y0HOg{W>^VP5ZY3qF8zHxcU9~e6-h=QSvLvsaok8S7zDO`coIDuZpxT0c57xD)X zMx|tR0g5jqKSr&EdDD4hUvO-}MEBYb_yQDBljhZ({UkcAdQ8R|ZuiDG$;BSd;!?k* zsLU5p;rV0cE7lg$SJe}84E+tr4^#{AqcC?OjBf-bQPv9O?a|$ zZeq6#{h%7>jMzBPW(WXg9GV;kc7b6WoV(EN07;-GEp-kAOo{2y$ROcrp$VW$8O#}l z(zZ6X0;vSy91E{kus%db{>R_`4XJB5^Rc_vFEk%wI~z_!z<8ijL><$DUPZVvg8}6Z z^z;Ze>ftRkBhmC0G%0kWTpvgv$S|?EeRTW|l@a34V_Y#3YK2C^hlqe`br3kX?!pD> zobV(@E6MI72f|OD>1f$&4eGH7W=@ZSa%l0CuIz-svy=UJ2{AEE&rc(1I8#IC`kECL zr(BSJ>hLM${@r^??BP!E?>+Z4W1gc494%X+C4Jh^J)#`<9b+Z}EeHarrjBTH9_T2c z4xXUTSQnZRZh_RKguM;PuMcq4({rM|^T@*o&4D!|<{;I~jKHarr;j~D^LdI-voWd2 zV^_g67+Ok_+03~$J7R&5fS?uqAQL{3OVNSW69>C@k_ZTiQIDmq2Eo|iw87eL=Er07 zj8-fiVMQarlvhb%sww(}W==hO=IF^zr0jk8UbMvHYk5Y&!6IHy6KNKX6jid)ozT6I zN`IRX@>H*36+rp1i)rJUtOjr0CyznbZtUIys1CUwM4o17C?i)!50L zSE_2D95WBjHa|RHx&LP6;knAg3xUeXXF)ove8>r97jmvu4iJ^L(`kzTf^I`OfS=;g zdO;RJ2$DE6H)_wH=_}?U+E2>3RZsrh6`d~{+f-14W!cLY>G$WuW(Y*ekcD7bGsqgq zbFtDz2qqmCFo_%pp-nsb&#&VyC5rXgktfu7qW>-F+ctA7=J&Lewg`DYDMD90IEU5* z*m?LaeJC>WyOb!_YfI`ZoU^;s^W`mrTUh-RgA&z!msX1P)??10xxU5b+)RV)?2Y^( zx?`%O2(1WJ4$xi##DcLO#eyosH<*vhvu83XPlN)*6m)%r^nk8_R)orl9ZK0v60rj* z9n8@nR9i4}61zgWB&ryEFMPC!f(v?QFd}DCEd46OsUeUq1yUv1H&F&ZPz|(Gq=E;* z*wT?oDF-4N$QIcz3fTef5o1czplOVX%#1iU4}Qz&D(ne@|9LDDRZgB(o-swso}L$5 zPsGncoEdIy&rgAA#%whjH?*K;X{Cuta;UJDaBnKray9~ffV&0r=cN_NV%l5R=K3uv zGp#;NS}Fn);<Kc^ZUSlX#1bXAP&J+{QMIl=kqHEU{yq>+~2;k6LhG% zpei0=-soc*Y{=ZgNu~rhILNMeLSKzlH6e_pbp|s)4oHWwRs=lcyo|*kj6=r|ABp7! zQH$hKfLH-ys4=N&$c@B+!5ECg{f3gx=zuZ8HqNJ|5|-`O0RDW_Mo!{KXlnA-AwjoS zG>#uf!Lz}!ItKH66uAL|+C|8}D~LRRIT{n!3bYBEF$PQH#Q^~9p`J6^5Hv(6%Bm+~ zVHv1Qwh#$Cm#dqm-$wVDvj&XoaDl{LF$4p;J0YI~TtS3c0)WjI)~8~~WcDIK+|Zpo zbLfbPDY!yR47C0*t2X92&(&QkTw&8tD7q>pChKlLb?Q+2nf7ep#L0v0CyZZr^OF$`{>EX4v%HJEVO`+|U0)0M`rbmpuMY)^C}JUoC|pt-Nxo{!0DS#w#0V?DOT@ z#$5~k^6~wP)wNSkUwQgwb>m!h<5l~7b@O<~VzB)3#fgiTGZUHV4scAtmRV2BC+>=Z z__q(dbL6cfHygrp4dM4I|MJ-nF3sP6bav0N+1BIp4Uf+A`JY9%@72spnaNAn-J1%E zE(S`;ng3>B<6L0l?56$mfk%G4u0ZdAQ}m_e_kVfc#J)w3kIZ|QOD9TaYn#5e?MpVNYSo=?annG(LyEu-lUkeKL6;Sn4VKxr`9 z44A~Wu{iKu1n35p-|0w>gbO*SCVp_%tZ5W?zo=5ej>{nAV&@Jswqk5OUm795j5}IX zX;gku#yMR67MwG)b@GJ)IB`hxq5TQHdhyCS0TIbm)_M5Uu~Ua(r6LDvt)E{1fR}NH zi{UOzrAF2jnK|A7|C^@m0J6ZFz~=JSkiGuI#0h~Zei~44drQsdlEYi`v%tC~XfT1J zrnkSd>#beagWGY8|F&H!+kpd9$Z$umLNzbfZ;-z2Z7;R|*~WIS{X?%4!4&{utpUlK zh4xykg(U_d$#}ldE1PD-fEL_i18`gcF6^DXvB;nc&at}D+zKD<%$3Z{nfc((Seahftilf)(v=%i8 z&?y6#(?h{bNLugbgum#Gh1L{+3B6?Kk1xb(Q{cnpM?lf*UNnvXQM5)5J>Sj5xr=X6~!gLWX z>icQ=XXx#}OKEs;c=B?qw&^Z)6j3ziC16OqmTzpa15tAGV z=>TBtQVcE)F}1*UC3JLxeKnmXxEA=m3B_v5092Ax+U$){3)+De69YET|T(yCpEL(H9!i(ax3tUtO5_8)9}8iFmDfhYtA(aUowBG^pB$&`gw!PQbS z51PAA5;9*OBc`AOwk|I_Yei7zR`REbd(}ps~AqKaoe_tOyUnGm3|64&iaFtDIrz8bxx^={B}I3tigJP_duLuN@c&oJSb9 z1C5O?mQ_yqulT2r&y_WfJ3sXY7lRdiGmkv+wQ&cz8se(2$pO%4_s*;RbMCz)s<6J+O7LtYXT2#XVJerF1%dqimZY|6J~z=$uxkpPJb-{qT)I2$zSI zRS-vWGq`CkNIq!6?X#Zk25~;JeE+RUFTcs|S|ZU{yobsiwnx!dPTmgD~u>%OCkqr!reqF^V%yi zO`5`-=(g!8j?0iNiO?Dfs3A^xM21<)i(P`?2>BHDGRV+$c>oAf!311nwVj$W@s&8M zKuE3)heDtYhU{yiK0ZE!Bv=t~UWMqN81f2*89{fOa+ozVG!9TYQe{Dp0t}JThF4_9 zCb04roQ1*dg-}0(BCR~$uyVJwf&A?xJ0}kf1k`LIjH9}Mp>dddBe_>qCZ^l%<%&PVp(88S@xW|#(#w|-^s8?a? zyF~B>=a;Qic#&SW=tZvPqQV)3vUaR5JlP3apl9(QiYA91p%@F`U_U9}x(P(IUn2bg z;rJ;8pc&gMIqR2vfw6;2!OG92pi>#Qe*zR=Q8m?grSWFPwz-OJGpFY(LhNH+EIQ|~ zd+R=_sh{3`HGHGyq46W1d2pErT-50ng-QJzC*h>d!HYi)Y|3py3%M=0dTs3ZuWy$V zqQ@O?bU9?*Le09@j?jgWb$4{qC4N}$JK(T=FC7uEN>%mB*5qM%`@|tDXOC2+`gIcZL0D`di`rF^bTeA)2#qzE|ywfL9{X4 zJ3G?h6QJ~3B=MZ#OWv$dfZWDK2yoMA4A++qAK*KXkDbKDzuMQR9*^KF{u?#gNiQ-9 z3qM&7QHvve5JSoNM`2nT!_)b|N9?i@68In6N zt5ns z;*rDze1gzO`D4~y)GHQ%OZa%_ja20CJRsmg?_UtRk;lqgl0!dV(ddXb0c6a%L-)~@ z2)#qND;HNHXv8aIgE(V?^ZDXRVce;JZHyPZ-_Aw_p7=+qt(CI6$cZO;jyb@rmwiJ4 zFS_r?2cC-dHIo_Ikqf$s>W@X0~3MC)AOFXvGyfL$yocV$6h)%9{qaf zn2aOY^3G+CPYx~DyXBhORjqR4uT=R-S>EuOMDJe>+G=FwGYPNU9%;j7x|kwZ3GLiM z-G-cBmF4nA`|T_JB<@ZFQMwNTogv*WvjO!OO-xxCA6gl?aa!?NpFXXP4s7tPEr%*;a%=j?mrdlr0E;=ApB z{w_h&=0toBUXB$txLyi<{>*=`99+O;+3`iK=#HC0VyY t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: str | None, + errors: str | None, + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write(b"") + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.BinaryIO | None: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.BinaryIO | None: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: str | None) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: str | None, errors: str | None +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: str | None, + errors: str | None, + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.BinaryIO | None], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: str | None, + errors: str | None, + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: str | None, + errors: str | None, + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: str | os.PathLike[str] | int, + mode: str, + encoding: str | None, + errors: str | None, +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + atomic: bool = False, +) -> tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: int | None = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> _AtomicFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.IO[t.Any] | None = None, color: bool | None = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream: t.TextIO, color: bool | None = None) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s: str) -> int: + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write # type: ignore[method-assign] + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: str | None, errors: str | None + ) -> t.TextIO | None: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.TextIO | None], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.TextIO | None]: + cache: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.TextIO | None: + stream = src_func() + + if stream is None: + return None + + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: cabc.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: cabc.Mapping[str, t.Callable[[str | None, str | None], t.TextIO]] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_termui_impl.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..51fd9bf --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_termui_impl.py @@ -0,0 +1,839 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" + +from __future__ import annotations + +import collections.abc as cabc +import contextlib +import math +import os +import shlex +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from pathlib import Path +from shutil import which +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: cabc.Iterable[V] | None, + length: int | None = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + label: str | None = None, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.hidden = hidden + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast("cabc.Iterable[V]", range(length)) + self.iter: cabc.Iterable[V] = iter(iterable) + self.length = length + self.pos: int = 0 + self.avg: list[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: int | None = None + self.entered: bool = False + self.current_item: V | None = None + self._is_atty = isatty(self.file) + self._last_line: str | None = None + + def __enter__(self) -> ProgressBar[V]: + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.render_finish() + + def __iter__(self) -> cabc.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.hidden or not self._is_atty: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + import shutil + + if self.hidden: + return + + if not self._is_atty: + # Only output the label once if the output is not a TTY. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width and self.max_width is not None: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: V | None = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> cabc.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if not self._is_atty: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: cabc.Iterable[str], color: bool | None = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + + # Split and normalize the pager command into parts. + pager_cmd_parts = shlex.split(os.environ.get("PAGER", ""), posix=False) + if pager_cmd_parts: + if WIN: + if _tempfilepager(generator, pager_cmd_parts, color): + return + elif _pipepager(generator, pager_cmd_parts, color): + return + + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if (WIN or sys.platform.startswith("os2")) and _tempfilepager( + generator, ["more"], color + ): + return + if _pipepager(generator, ["less"], color): + return + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if _pipepager(generator, ["more"], color): + return + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager( + generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None +) -> bool: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + + Returns `True` if the command was found, `False` otherwise and thus another + pager should be attempted. + """ + # Split the command into the invoked CLI and its parameters. + if not cmd_parts: + return False + cmd = cmd_parts[0] + cmd_params = cmd_parts[1:] + + cmd_filepath = which(cmd) + if not cmd_filepath: + return False + # Resolves symlinks and produces a normalized absolute path string. + cmd_path = Path(cmd_filepath).resolve() + cmd_name = cmd_path.name + + import subprocess + + # Make a local copy of the environment to not affect the global one. + env = dict(os.environ) + + # If we're piping to less and the user hasn't decided on colors, we enable + # them by default we find the -R flag in the command line arguments. + if color is None and cmd_name == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_params)}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen( + [str(cmd_path)] + cmd_params, + shell=True, + stdin=subprocess.PIPE, + env=env, + errors="replace", + text=True, + ) + assert c.stdin is not None + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text) + except BrokenPipeError: + # In case the pager exited unexpectedly, ignore the broken pipe error. + pass + except Exception as e: + # In case there is an exception we want to close the pager immediately + # and let the caller handle it. + # Otherwise the pager will keep running, and the user may not notice + # the error message, or worse yet it may leave the terminal in a broken state. + c.terminate() + raise e + finally: + # We must close stdin and wait for the pager to exit before we continue + try: + c.stdin.close() + # Close implies flush, so it might throw a BrokenPipeError if the pager + # process exited already. + except BrokenPipeError: + pass + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + return True + + +def _tempfilepager( + generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None +) -> bool: + """Page through text by invoking a program on a temporary file. + + Returns `True` if the command was found, `False` otherwise and thus another + pager should be attempted. + """ + # Split the command into the invoked CLI and its parameters. + if not cmd_parts: + return False + cmd = cmd_parts[0] + + cmd_filepath = which(cmd) + if not cmd_filepath: + return False + # Resolves symlinks and produces a normalized absolute path string. + cmd_path = Path(cmd_filepath).resolve() + + import subprocess + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + subprocess.call([str(cmd_path), filename]) + except OSError: + # Command not found + pass + finally: + os.close(fd) + os.unlink(filename) + + return True + + +def _nullpager( + stream: t.TextIO, generator: cabc.Iterable[str], color: bool | None +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + for editor in "sensible-editor", "vim", "nano": + if which(editor) is not None: + return editor + return "vi" + + def edit_files(self, filenames: cabc.Iterable[str]) -> None: + import subprocess + + editor = self.get_editor() + environ: dict[str, str] | None = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + exc_filename = " ".join(f'"{filename}"' for filename in filenames) + + try: + c = subprocess.Popen( + args=f"{editor} {exc_filename}", env=environ, shell=True + ) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + @t.overload + def edit(self, text: bytes | bytearray) -> bytes | None: ... + + # We cannot know whether or not the type expected is str or bytes when None + # is passed, so str is returned as that was what was done before. + @t.overload + def edit(self, text: str | None) -> str | None: ... + + def edit(self, text: str | bytes | bytearray | None) -> str | bytes | None: + import tempfile + + if text is None: + data = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_files((name,)) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = ["explorer", f"/select,{url}"] + else: + args = ["start"] + if wait: + args.append("/WAIT") + args.append("") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = ["cygstart", os.path.dirname(url)] + else: + args = ["cygstart"] + if wait: + args.append("-w") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> None: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if sys.platform == "win32": + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> cabc.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + + if echo: + func = t.cast(t.Callable[[], str], msvcrt.getwche) + else: + func = t.cast(t.Callable[[], str], msvcrt.getwch) + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import termios + import tty + + @contextlib.contextmanager + def raw_terminal() -> cabc.Iterator[int]: + f: t.TextIO | None + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_textwrap.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_textwrap.py new file mode 100644 index 0000000..97fbee3 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_textwrap.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import collections.abc as cabc +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: list[str], + cur_line: list[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> cabc.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_winconsole.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_winconsole.py new file mode 100644 index 0000000..e56c7c6 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/_winconsole.py @@ -0,0 +1,296 @@ +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +from __future__ import annotations + +import collections.abc as cabc +import io +import sys +import time +import typing as t +from ctypes import Array +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +if t.TYPE_CHECKING: + try: + # Using `typing_extensions.Buffer` instead of `collections.abc` + # on Windows for some reason does not have `Sized` implemented. + from collections.abc import Buffer # type: ignore + except ImportError: + from typing_extensions import Buffer + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ # noqa: RUF012 + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj: Buffer, writable: bool = False) -> Array[c_char]: + buf = Py_buffer() + flags: int = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + out: Array[c_char] = buffer_type.from_address(buf.buf) + return out + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle: int | None) -> None: + self.handle = handle + + def isatty(self) -> t.Literal[True]: + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self) -> t.Literal[True]: + return True + + def readinto(self, b: Buffer) -> int: + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self) -> t.Literal[True]: + return True + + @staticmethod + def _get_error_message(errno: int) -> str: + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b: Buffer) -> int: + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: cabc.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self) -> str: + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: cabc.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: str | None, errors: str | None +) -> t.TextIO | None: + if ( + get_buffer is None + or encoding not in {"utf-16-le", None} + or errors not in {"strict", None} + or not _is_console(f) + ): + return None + + func = _stream_factories.get(f.fileno()) + if func is None: + return None + + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/core.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/core.py new file mode 100644 index 0000000..f57ada6 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/core.py @@ -0,0 +1,3135 @@ +from __future__ import annotations + +import collections.abc as cabc +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from collections import Counter +from contextlib import AbstractContextManager +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import NoArgsIsHelpError +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _flag_needs_value +from .parser import _OptionParser +from .parser import _split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound="t.Callable[..., t.Any]") +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: Context, incomplete: str +) -> cabc.Iterator[tuple[str, Command]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(Group, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_nested_chain( + base_command: Group, cmd_name: str, cmd: Command, register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, Group): + return + + if register: + message = ( + f"It is not possible to add the group {cmd_name!r} to another" + f" group {base_command.name!r} that is in chain mode." + ) + else: + message = ( + f"Found the group {cmd_name!r} as subcommand to another group " + f" {base_command.name!r} that is in chain mode. This is not supported." + ) + + raise RuntimeError(message) + + +def batch(iterable: cabc.Iterable[V], batch_size: int) -> list[tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size), strict=False)) + + +@contextmanager +def augment_usage_errors( + ctx: Context, param: Parameter | None = None +) -> cabc.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: cabc.Sequence[Parameter], + declaration_order: cabc.Sequence[Parameter], +) -> list[Parameter]: + """Returns all declared parameters in the order they should be processed. + + The declared parameters are re-shuffled depending on the order in which + they were invoked, as well as the eagerness of each parameters. + + The invocation order takes precedence over the declaration order. I.e. the + order in which the user provided them to the CLI is respected. + + This behavior and its effect on callback evaluation is detailed at: + https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order + """ + + def sort_key(item: Parameter) -> tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.2 + The ``protected_args`` attribute is deprecated and will be removed in + Click 9.0. ``args`` will contain remaining unparsed tokens. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: type[HelpFormatter] = HelpFormatter + + def __init__( + self, + command: Command, + parent: Context | None = None, + info_name: str | None = None, + obj: t.Any | None = None, + auto_envvar_prefix: str | None = None, + default_map: cabc.MutableMapping[str, t.Any] | None = None, + terminal_width: int | None = None, + max_content_width: int | None = None, + resilient_parsing: bool = False, + allow_extra_args: bool | None = None, + allow_interspersed_args: bool | None = None, + ignore_unknown_options: bool | None = None, + help_option_names: list[str] | None = None, + token_normalize_func: t.Callable[[str], str] | None = None, + color: bool | None = None, + show_default: bool | None = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: dict[str, t.Any] = {} + #: the leftover arguments. + self.args: list[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self._protected_args: list[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: str | None = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: int | None = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: int | None = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: list[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: str | None = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: bool | None = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: bool | None = show_default + + self._close_callbacks: list[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + @property + def protected_args(self) -> list[str]: + import warnings + + warnings.warn( + "'protected_args' is deprecated and will be removed in Click 9.0." + " 'args' will contain remaining unparsed tokens.", + DeprecationWarning, + stacklevel=2, + ) + return self._protected_args + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> Context: + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: AbstractContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._exit_stack.close() + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> Context: + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: type[V]) -> V | None: + """Finds the closest object of a given type.""" + node: Context | None = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @t.overload + def lookup_default( + self, name: str, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def lookup_default( + self, name: str, call: t.Literal[False] = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def lookup_default(self, name: str, call: bool = True) -> t.Any | None: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name) + + if call and callable(value): + return value() + + return value + + return None + + def fail(self, message: str) -> t.NoReturn: + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> t.NoReturn: + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> t.NoReturn: + """Exits the application with a given exit code. + + .. versionchanged:: 8.2 + Callbacks and context managers registered with :meth:`call_on_close` + and :meth:`with_resource` are closed before exiting. + """ + self.close() + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: Command) -> Context: + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + self, callback: t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any + ) -> V: ... + + @t.overload + def invoke(self, callback: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: ... + + def invoke( + self, callback: Command | t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any + ) -> t.Any | V: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + + .. versionchanged:: 3.2 + A new context is created, and missing arguments use default values. + """ + if isinstance(callback, Command): + other_cmd = callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = self + + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(self, cmd: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(cmd, Command): + raise TypeError("Callback is not a command.") + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> ParameterSource | None: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class Command: + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + :param deprecated: If ``True`` or non-empty string, issues a message + indicating that the command is deprecated and highlights + its deprecation in --help. The message can be customized + by using a string as the value. + + .. versionchanged:: 8.2 + This is the base class for all commands, not ``BaseCommand``. + ``deprecated`` can be set to a string as well to customize the + deprecation message. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: type[Context] = Context + + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: str | None, + context_settings: cabc.MutableMapping[str, t.Any] | None = None, + callback: t.Callable[..., t.Any] | None = None, + params: list[Parameter] | None = None, + help: str | None = None, + epilog: str | None = None, + short_help: str | None = None, + options_metavar: str | None = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool | str = False, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings + + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: list[Parameter] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self._help_option = None + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: + return { + "name": self.name, + "params": [param.to_info_dict() for param in self.get_params(ctx)], + "help": self.help, + "epilog": self.epilog, + "short_help": self.short_help, + "hidden": self.hidden, + "deprecated": self.deprecated, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> list[Parameter]: + params = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + params = [*params, help_option] + + if __debug__: + import warnings + + opts = [opt for param in params for opt in param.opts] + opts_counter = Counter(opts) + duplicate_opts = (opt for opt, count in opts_counter.items() if count > 1) + + for duplicate_opt in duplicate_opts: + warnings.warn( + ( + f"The parameter {duplicate_opt} is used more than once. " + "Remove its duplicate as parameters should be unique." + ), + stacklevel=3, + ) + + return params + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> list[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> list[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> Option | None: + """Returns the help option object. + + Skipped if :attr:`add_help_option` is ``False``. + + .. versionchanged:: 8.1.8 + The help option is now cached to avoid creating it multiple times. + """ + help_option_names = self.get_help_option_names(ctx) + + if not help_option_names or not self.add_help_option: + return None + + # Cache the help option object in private _help_option attribute to + # avoid creating it multiple times. Not doing this will break the + # callback odering by iter_params_for_processing(), which relies on + # object comparison. + if self._help_option is None: + # Avoid circular import. + from .decorators import help_option + + # Apply help_option decorator and pop resulting option + help_option(*help_option_names)(self) + self._help_option = self.params.pop() # type: ignore[assignment] + + return self._help_option + + def make_parser(self, ctx: Context) -> _OptionParser: + """Creates the underlying option parser for this command.""" + parser = _OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + deprecated_message = ( + f"(DEPRECATED: {self.deprecated})" + if isinstance(self.deprecated, str) + else "(DEPRECATED)" + ) + text = _("{text} {deprecated_message}").format( + text=text, deprecated_message=deprecated_message + ) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + deprecated_message = ( + f"(DEPRECATED: {self.deprecated})" + if isinstance(self.deprecated, str) + else "(DEPRECATED)" + ) + text = _("{text} {deprecated_message}").format( + text=text, deprecated_message=deprecated_message + ) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: Context | None = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class(self, info_name=info_name, parent=parent, **extra) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + raise NoArgsIsHelpError(ctx) + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + extra_message = ( + f" {self.deprecated}" if isinstance(self.deprecated, str) else "" + ) + message = _( + "DeprecationWarning: The command {name!r} is deprecated.{extra_message}" + ).format(name=self.name, extra_message=extra_message) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: list[CompletionItem] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, Group) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx._protected_args + ) + + return results + + @t.overload + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: t.Literal[True] = True, + **extra: t.Any, + ) -> t.NoReturn: ... + + @t.overload + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: ... + + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str | None = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class _FakeSubclassCheck(type): + def __subclasscheck__(cls, subclass: type) -> bool: + return issubclass(subclass, cls.__bases__[0]) + + def __instancecheck__(cls, instance: t.Any) -> bool: + return isinstance(instance, cls.__bases__[0]) + + +class _BaseCommand(Command, metaclass=_FakeSubclassCheck): + """ + .. deprecated:: 8.2 + Will be removed in Click 9.0. Use ``Command`` instead. + """ + + +class Group(Command): + """A group is a command that nests other commands (or more groups). + + :param name: The name of the group command. + :param commands: Map names to :class:`Command` objects. Can be a list, which + will use :attr:`Command.name` as the keys. + :param invoke_without_command: Invoke the group's callback even if a + subcommand is not given. + :param no_args_is_help: If no arguments are given, show the group's help and + exit. Defaults to the opposite of ``invoke_without_command``. + :param subcommand_metavar: How to represent the subcommand argument in help. + The default will represent whether ``chain`` is set or not. + :param chain: Allow passing more than one subcommand argument. After parsing + a command's arguments, if any arguments remain another command will be + matched, and so on. + :param result_callback: A function to call after the group's and + subcommand's callbacks. The value returned by the subcommand is passed. + If ``chain`` is enabled, the value will be a list of values returned by + all the commands. If ``invoke_without_command`` is enabled, the value + will be the value returned by the group's callback, or an empty list if + ``chain`` is enabled. + :param kwargs: Other arguments passed to :class:`Command`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + + .. versionchanged:: 8.2 + Merged with and replaces the ``MultiCommand`` base class. + """ + + allow_extra_args = True + allow_interspersed_args = False + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: type[Command] | None = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: type[Group] | type[type] | None = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: str | None = None, + commands: cabc.MutableMapping[str, Command] + | cabc.Sequence[Command] + | None = None, + invoke_without_command: bool = False, + no_args_is_help: bool | None = None, + subcommand_metavar: str | None = None, + chain: bool = False, + result_callback: t.Callable[..., t.Any] | None = None, + **kwargs: t.Any, + ) -> None: + super().__init__(name, **kwargs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: cabc.MutableMapping[str, Command] = commands + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "A group in chain mode cannot have optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def add_command(self, cmd: Command, name: str | None = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_nested_chain(self, name, cmd, register=True) + self.commands[name] = cmd + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command] | Command: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Callable[..., t.Any] | None = None + + if args and callable(args[0]): + assert len(args) == 1 and not kwargs, ( + "Use 'command(**kwargs)(callable)' to provide arguments." + ) + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> Group: ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Group]: ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Group] | Group: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Callable[..., t.Any] | None = None + + if args and callable(args[0]): + assert len(args) == 1 and not kwargs, ( + "Use 'group(**kwargs)(callable)' to provide arguments." + ) + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> Group: + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(value: t.Any, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + inner = old_callback(value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv # type: ignore[return-value] + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> Command | None: + """Given a context and a command name, this returns a :class:`Command` + object if it exists or returns ``None``. + """ + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> list[str]: + """Returns a list of subcommand names in the order they should appear.""" + return sorted(self.commands) + + def collect_usage_pieces(self, ctx: Context) -> list[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + raise NoArgsIsHelpError(ctx) + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx._protected_args = rest + ctx.args = [] + elif rest: + ctx._protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx._protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx._protected_args, *ctx.args] + ctx.args = [] + ctx._protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: list[str] + ) -> tuple[str | None, Command | None, list[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if _split_opt(cmd_name)[0]: + self.parse_args(ctx, args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class _MultiCommand(Group, metaclass=_FakeSubclassCheck): + """ + .. deprecated:: 8.2 + Will be removed in Click 9.0. Use ``Group`` instead. + """ + + +class CommandCollection(Group): + """A :class:`Group` that looks up subcommands on other groups. If a command + is not found on this group, each registered source is checked in order. + Parameters on a source are not added to this group, and a source's callback + is not invoked when invoking its commands. In other words, this "flattens" + commands in many groups into this one group. + + :param name: The name of the group command. + :param sources: A list of :class:`Group` objects to look up commands from. + :param kwargs: Other arguments passed to :class:`Group`. + + .. versionchanged:: 8.2 + This is a subclass of ``Group``. Commands are looked up first on this + group, then each of its sources. + """ + + def __init__( + self, + name: str | None = None, + sources: list[Group] | None = None, + **kwargs: t.Any, + ) -> None: + super().__init__(name, **kwargs) + #: The list of registered groups. + self.sources: list[Group] = sources or [] + + def add_source(self, group: Group) -> None: + """Add a group as a source of commands.""" + self.sources.append(group) + + def get_command(self, ctx: Context, cmd_name: str) -> Command | None: + rv = super().get_command(ctx, cmd_name) + + if rv is not None: + return rv + + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_nested_chain(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> list[str]: + rv: set[str] = set(super().list_commands(ctx)) + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The latter is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + :param deprecated: If ``True`` or non-empty string, issues a message + indicating that the argument is deprecated and highlights + its deprecation in --help. The message can be customized + by using a string as the value. A deprecated parameter + cannot be required, a ValueError will be raised otherwise. + + .. versionchanged:: 8.2.0 + Introduction of ``deprecated``. + + .. versionchanged:: 8.2 + Adding duplicate parameter names to a :class:`~click.core.Command` will + result in a ``UserWarning`` being shown. + + .. versionchanged:: 8.2 + Adding duplicate parameter names to a :class:`~click.core.Command` will + result in a ``UserWarning`` being shown. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: cabc.Sequence[str] | None = None, + type: types.ParamType | t.Any | None = None, + required: bool = False, + default: t.Any | t.Callable[[], t.Any] | None = None, + callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None = None, + nargs: int | None = None, + multiple: bool = False, + metavar: str | None = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: str | cabc.Sequence[str] | None = None, + shell_complete: t.Callable[ + [Context, Parameter, str], list[CompletionItem] | list[str] + ] + | None = None, + deprecated: bool | str = False, + ) -> None: + self.name: str | None + self.opts: list[str] + self.secondary_opts: list[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + self.deprecated = deprecated + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + # Skip no default or callable default. + check_default = default if not callable(default) else None + + if check_default is not None: + if multiple: + try: + # Only check the first value against nargs. + check_default = next(_check_iter(check_default), None) + except TypeError: + raise ValueError( + "'default' must be a list when 'multiple' is true." + ) from None + + # Can be None for multiple with empty default. + if nargs != 1 and check_default is not None: + try: + _check_iter(check_default) + except TypeError: + if multiple: + message = ( + "'default' must be a list of lists when 'multiple' is" + " true and 'nargs' != 1." + ) + else: + message = "'default' must be a list when 'nargs' != 1." + + raise ValueError(message) from None + + if nargs > 1 and len(check_default) != nargs: + subject = "item length" if multiple else "length" + raise ValueError( + f"'default' {subject} must match nargs={nargs}." + ) + + if required and deprecated: + raise ValueError( + f"The {self.param_type_name} '{self.human_readable_name}' " + "is deprecated and still required. A deprecated " + f"{self.param_type_name} cannot be required." + ) + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + "default": self.default, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self, ctx: Context) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(param=self, ctx=ctx) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @t.overload + def get_default( + self, ctx: Context, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Any | t.Callable[[], t.Any] | None: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is None: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: cabc.Mapping[str, t.Any] + ) -> tuple[t.Any, ParameterSource]: + value = opts.get(self.name) # type: ignore + source = ParameterSource.COMMANDLINE + + if value is None: + value = self.value_from_envvar(ctx) + source = ParameterSource.ENVIRONMENT + + if value is None: + value = ctx.lookup_default(self.name) # type: ignore + source = ParameterSource.DEFAULT_MAP + + if value is None: + value = self.get_default(ctx) + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the option's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + return () if self.multiple or self.nargs == -1 else None + + def check_iter(value: t.Any) -> cabc.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + if value is None: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> str | None: + if self.envvar is None: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Any | None: + rv: t.Any | None = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: cabc.Mapping[str, t.Any], args: list[str] + ) -> tuple[t.Any, list[str]]: + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + + if ( + self.deprecated + and value is not None + and source + not in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ) + ): + extra_message = ( + f" {self.deprecated}" if isinstance(self.deprecated, str) else "" + ) + message = _( + "DeprecationWarning: The {param_type} {name!r} is deprecated." + "{extra_message}" + ).format( + param_type=self.param_type_name, + name=self.human_readable_name, + extra_message=extra_message, + ) + echo(style(message, fg="red"), err=True) + + ctx.set_parameter_source(self.name, source) # type: ignore + + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + + value = None + + if self.expose_value: + ctx.params[self.name] = value # type: ignore + + return value, args + + def get_help_record(self, ctx: Context) -> tuple[str, str] | None: + pass + + def get_usage_pieces(self, ctx: Context) -> list[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast("list[CompletionItem]", results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page and error messages. + Normally, environment variables are not shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. A deprecated option cannot be + prompted. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.2 + ``envvar`` used with ``flag_value`` will always use the ``flag_value``, + previously it would use the value of the environment variable. + + .. versionchanged:: 8.1 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: cabc.Sequence[str] | None = None, + show_default: bool | str | None = None, + prompt: bool | str = False, + confirmation_prompt: bool | str = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: bool | None = None, + flag_value: t.Any | None = None, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: types.ParamType | t.Any | None = None, + help: str | None = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + deprecated: bool | str = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + default_is_missing = "default" not in attrs + super().__init__( + param_decls, type=type, multiple=multiple, deprecated=deprecated, **attrs + ) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: str | None = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + + if deprecated: + deprecated_message = ( + f"(DEPRECATED: {deprecated})" + if isinstance(deprecated, str) + else "(DEPRECATED)" + ) + help = help + deprecated_message if help is not None else deprecated_message + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # If prompt is enabled but not required, then the option can be + # used as a flag to indicate using prompt or flag_value. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + if is_flag is None: + if flag_value is not None: + # Implicitly a flag because flag_value was set. + is_flag = True + elif self._flag_needs_value: + # Not a flag, but when used as a flag it shows a prompt. + is_flag = False + else: + # Implicitly a flag because flag options were given. + is_flag = bool(self.secondary_opts) + elif is_flag is False and not self._flag_needs_value: + # Not a flag, and prompt is not enabled, can be used as a + # flag if flag_value is set. + self._flag_needs_value = flag_value is not None + + self.default: t.Any | t.Callable[[], t.Any] + + if is_flag and default_is_missing and not self.required: + if multiple: + self.default = () + else: + self.default = False + + if is_flag and flag_value is None: + flag_value = not self.default + + self.type: types.ParamType + if is_flag and type is None: + # Re-guess the type from the flag value instead of the + # default. + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = is_flag + self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) + self.flag_value: t.Any = flag_value + + # Counting + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if deprecated and prompt: + raise ValueError("`deprecated` options cannot use `prompt`.") + + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("'prompt' is not valid for non-boolean flag.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + flag_value=self.flag_value, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def get_error_hint(self, ctx: Context) -> str: + result = super().get_error_hint(ctx) + if self.show_envvar: + result += f" (env var: '{self.envvar}')" + return result + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(_split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(_split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError( + f"Could not determine name for option with declarations {decls!r}" + ) + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> tuple[str, str] | None: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: cabc.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar(ctx=ctx)}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + + extra = self.get_help_extra(ctx) + extra_items = [] + if "envvars" in extra: + extra_items.append( + _("env var: {var}").format(var=", ".join(extra["envvars"])) + ) + if "default" in extra: + extra_items.append(_("default: {default}").format(default=extra["default"])) + if "range" in extra: + extra_items.append(extra["range"]) + if "required" in extra: + extra_items.append(_(extra["required"])) + + if extra_items: + extra_str = "; ".join(extra_items) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + def get_help_extra(self, ctx: Context) -> types.OptionHelpExtra: + extra: types.OptionHelpExtra = {} + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + if isinstance(envvar, str): + extra["envvars"] = (envvar,) + else: + extra["envvars"] = tuple(str(d) for d in envvar) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or (show_default and (default_value is not None)): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = _split_opt( + (self.opts if default_value else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + elif default_value == "": + default_string = '""' + else: + default_string = str(default_value) + + if default_string: + extra["default"] = default_string + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra["range"] = range_str + + if self.required: + extra["required"] = "required" + + return extra + + @t.overload + def get_default( + self, ctx: Context, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Any | t.Callable[[], t.Any] | None: + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return t.cast(Option, param).flag_value + + return None + + return super().get_default(ctx, call=call) + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + # If show_default is set to True/False, provide this to `prompt` as well. For + # non-bool values of `show_default`, we use `prompt`'s default behavior + prompt_kwargs: t.Any = {} + if isinstance(self.show_default, bool): + prompt_kwargs["show_default"] = self.show_default + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + **prompt_kwargs, + ) + + def resolve_envvar_value(self, ctx: Context) -> str | None: + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + if self.is_flag and self.flag_value: + return str(self.flag_value) + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Any | None: + rv: t.Any | None = self.resolve_envvar_value(ctx) + + if rv is None: + return None + + value_depth = (self.nargs != 1) + bool(self.multiple) + + if value_depth > 0: + rv = self.type.split_envvar_value(rv) + + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + + return rv + + def consume_value( + self, ctx: Context, opts: cabc.Mapping[str, Parameter] + ) -> tuple[t.Any, ParameterSource]: + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option can be + # given as a flag without a value. This is different from None + # to distinguish from the flag not being given at all. + if value is _flag_needs_value: + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + elif ( + self.multiple + and value is not None + and any(v is _flag_needs_value for v in value) + ): + value = [self.flag_value if v is _flag_needs_value else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt if + # prompting is enabled. + elif ( + source in {None, ParameterSource.DEFAULT} + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: cabc.Sequence[str], + required: bool | None = None, + **attrs: t.Any, + ) -> None: + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + if __debug__: + if self.default is not None and self.nargs == -1: + raise TypeError("'default' is not supported for nargs=-1.") + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self, ctx: Context) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(param=self, ctx=ctx) + if not var: + var = self.name.upper() # type: ignore + if self.deprecated: + var += "!" + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Argument is marked as exposed, but does not have a name.") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}: {decls}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> list[str]: + return [self.make_metavar(ctx)] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar(ctx)}'" + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/decorators.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/decorators.py new file mode 100644 index 0000000..21f4c34 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/decorators.py @@ -0,0 +1,551 @@ +from __future__ import annotations + +import inspect +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound="_AnyCallable | Command") + + +def pass_context(f: t.Callable[te.Concatenate[Context, P], R]) -> t.Callable[P, R]: + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: type[T], ensure: bool = False +) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + ctx = get_current_context() + + obj: T | None + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator + + +def pass_meta_key( + key: str, *, doc_description: str | None = None +) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: str | None, + cls: type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: str | None = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: ... + + +def command( + name: str | _AnyCallable | None = None, + cls: type[CmdType] | None = None, + **attrs: t.Any, +) -> Command | t.Callable[[_AnyCallable], Command | CmdType]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function, converted to + lowercase, with underscores ``_`` replaced by dashes ``-``, and the suffixes + ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed. For example, + ``init_data_command`` becomes ``init-data``. + + All keyword arguments are forwarded to the underlying command class. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: The name of the command. Defaults to modifying the function's + name as described above. + :param cls: The command class to create. Defaults to :class:`Command`. + + .. versionchanged:: 8.2 + The suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are + removed when generating the name. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Callable[[_AnyCallable], t.Any] | None = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast("type[CmdType]", Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + if name is not None: + cmd_name = name + else: + cmd_name = f.__name__.lower().replace("_", "-") + cmd_left, sep, suffix = cmd_name.rpartition("-") + + if sep and suffix in {"command", "cmd", "group", "grp"}: + cmd_name = cmd_left + + cmd = cls(name=cmd_name, callback=f, params=params, **attrs) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: str | None, + cls: type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: str | None = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: ... + + +def group( + name: str | _AnyCallable | None = None, + cls: type[GrpType] | None = None, + **attrs: t.Any, +) -> Group | t.Callable[[_AnyCallable], Group | GrpType]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast("type[GrpType]", Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: type[Argument] | None = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: type[Option] | None = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: str | None = None, + *param_decls: str, + package_name: str | None = None, + prog_name: str | None = None, + message: str | None = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + import importlib.metadata + + try: + version = importlib.metadata.version(package_name) + except importlib.metadata.PackageNotFoundError: + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Pre-configured ``--help`` option which immediately prints the help page + and exits the program. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def show_help(ctx: Context, param: Parameter, value: bool) -> None: + """Callback that print the help page on ```` and exits.""" + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs.setdefault("callback", show_help) + + return option(*param_decls, **kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/exceptions.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/exceptions.py new file mode 100644 index 0000000..f141a83 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/exceptions.py @@ -0,0 +1,308 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .globals import resolve_color_default +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints(param_hint: cabc.Sequence[str] | str | None) -> str | None: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + # The context will be removed by the time we print the message, so cache + # the color settings here to be used later on (in `show`) + self.show_color: bool | None = resolve_color_default() + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.IO[t.Any] | None = None) -> None: + if file is None: + file = get_text_stderr() + + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=self.show_color, + ) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: Context | None = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: Command | None = self.ctx.command if self.ctx else None + + def show(self, file: t.IO[t.Any] | None = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: Context | None = None, + param: Parameter | None = None, + param_hint: str | None = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: str | None = None, + ctx: Context | None = None, + param: Parameter | None = None, + param_hint: str | None = None, + param_type: str | None = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: str | None = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message( + param=self.param, ctx=self.ctx + ) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: str | None = None, + possibilities: cabc.Sequence[str] | None = None, + ctx: Context | None = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: Context | None = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class NoArgsIsHelpError(UsageError): + def __init__(self, ctx: Context) -> None: + self.ctx: Context + super().__init__(ctx.get_help(), ctx=ctx) + + def show(self, file: t.IO[t.Any] | None = None) -> None: + echo(self.format_message(), file=file, err=True, color=self.ctx.color) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: str | None = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/formatting.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/formatting.py new file mode 100644 index 0000000..9891f88 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +from __future__ import annotations + +import collections.abc as cabc +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import _split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: int | None = None + + +def measure_table(rows: cabc.Iterable[tuple[str, str]]) -> tuple[int, ...]: + widths: dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: cabc.Iterable[tuple[str, str]], col_count: int +) -> cabc.Iterator[tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: list[tuple[int, bool, str]] = [] + buf: list[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: int | None = None, + max_width: int | None = None, + ) -> None: + import shutil + + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent: int = 0 + self.buffer: list[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog: str, args: str = "", prefix: str | None = None) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: cabc.Sequence[tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> cabc.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> cabc.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = _split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/globals.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/globals.py new file mode 100644 index 0000000..a2f9172 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/globals.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +import typing as t +from threading import local + +if t.TYPE_CHECKING: + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: t.Literal[False] = False) -> Context: ... + + +@t.overload +def get_current_context(silent: bool = ...) -> Context | None: ... + + +def get_current_context(silent: bool = False) -> Context | None: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: Context) -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: bool | None = None) -> bool | None: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/parser.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/parser.py new file mode 100644 index 0000000..a8b7d26 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/parser.py @@ -0,0 +1,532 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" + +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + +# Sentinel value that indicates an option was passed as a flag without a +# value but is not a flag option. Option.consume_value uses this to +# prompt or use the flag_value. +_flag_needs_value = object() + + +def _unpack_args( + args: cabc.Sequence[str], nargs_spec: cabc.Sequence[int] +) -> tuple[cabc.Sequence[str | cabc.Sequence[str | None] | None], list[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: list[str | tuple[str | None, ...] | None] = [] + spos: int | None = None + + def _fetch(c: deque[V]) -> V | None: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def _split_opt(opt: str) -> tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def _normalize_opt(opt: str, ctx: Context | None) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = _split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +class _Option: + def __init__( + self, + obj: CoreOption, + opts: cabc.Sequence[str], + dest: str | None, + action: str | None = None, + nargs: int = 1, + const: t.Any | None = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: set[str] = set() + + for opt in opts: + prefix, value = _split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: _ParsingState) -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class _Argument: + def __init__(self, obj: CoreArgument, dest: str | None, nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: str | cabc.Sequence[str | None] | None, + state: _ParsingState, + ) -> None: + if self.nargs > 1: + assert value is not None + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + if self.nargs == -1 and self.obj.envvar is not None and value == (): + # Replace empty tuple with None so that a value from the + # environment may be tried. + value = None + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class _ParsingState: + def __init__(self, rargs: list[str]) -> None: + self.opts: dict[str, t.Any] = {} + self.largs: list[str] = [] + self.rargs = rargs + self.order: list[CoreParameter] = [] + + +class _OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + + .. deprecated:: 8.2 + Will be removed in Click 9.0. + """ + + def __init__(self, ctx: Context | None = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args: bool = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options: bool = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: dict[str, _Option] = {} + self._long_opt: dict[str, _Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: list[_Argument] = [] + + def add_option( + self, + obj: CoreOption, + opts: cabc.Sequence[str], + dest: str | None, + action: str | None = None, + nargs: int = 1, + const: t.Any | None = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [_normalize_opt(opt, self.ctx) for opt in opts] + option = _Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, obj: CoreArgument, dest: str | None, nargs: int = 1) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(_Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: list[str] + ) -> tuple[dict[str, t.Any], list[str], list[CoreParameter]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = _ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: _ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: _ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: str | None, state: _ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: _ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = _normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: _Option, state: _ParsingState + ) -> t.Any: + nargs = option.nargs + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = _flag_needs_value + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = _flag_needs_value + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: _ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = _normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) + + +def __getattr__(name: str) -> object: + import warnings + + if name in { + "OptionParser", + "Argument", + "Option", + "split_opt", + "normalize_opt", + "ParsingState", + }: + warnings.warn( + f"'parser.{name}' is deprecated and will be removed in Click 9.0." + " The old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return globals()[f"_{name}"] + + if name == "split_arg_string": + from .shell_completion import split_arg_string + + warnings.warn( + "Importing 'parser.split_arg_string' is deprecated, it will only be" + " available in 'shell_completion' in Click 9.0.", + DeprecationWarning, + stacklevel=2, + ) + return split_arg_string + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/py.typed b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/shell_completion.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/shell_completion.py new file mode 100644 index 0000000..6c39d5e --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/shell_completion.py @@ -0,0 +1,644 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .utils import echo + + +def shell_complete( + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: str | None = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: str | None = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> tuple[list[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import shutil + import subprocess + + bash_exe = shutil.which("bash") + + if bash_exe is None: + match = None + else: + output = subprocess.run( + [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], + stdout=subprocess.PIPE, + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]") + + +_available_shells: dict[str, type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: str | None = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> type[ShellComplete] | None: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def split_arg_string(string: str) -> list[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + + .. versionchanged:: 8.2 + Moved to ``shell_completion`` from ``parser``. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: list[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + args: list[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + with cli.make_context(prog_name, args.copy(), **ctx_args) as ctx: + args = ctx._protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, Group): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + with cmd.make_context( + name, args, parent=ctx, resilient_parsing=True + ) as sub_ctx: + ctx = sub_ctx + args = ctx._protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + with cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) as sub_sub_ctx: + sub_ctx = sub_sub_ctx + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx._protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: list[str], incomplete: str +) -> tuple[Command | Parameter, str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/termui.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/termui.py new file mode 100644 index 0000000..dcbb222 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/termui.py @@ -0,0 +1,877 @@ +from __future__ import annotations + +import collections.abc as cabc +import inspect +import io +import itertools +import sys +import typing as t +from contextlib import AbstractContextManager +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Any | None = None, + show_choices: bool = True, + type: ParamType | None = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Any | None = None, + hide_input: bool = False, + confirmation_prompt: bool | str = False, + type: ParamType | t.Any | None = None, + value_proc: t.Callable[[str], t.Any] | None = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(" ") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: bool | None = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: cabc.Iterable[str] | t.Callable[[], cabc.Iterable[str]] | str, + color: bool | None = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast("t.Callable[[], cabc.Iterable[str]]", text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast("cabc.Iterable[str]", text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +@t.overload +def progressbar( + *, + length: int, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[int]: ... + + +@t.overload +def progressbar( + iterable: cabc.Iterable[V] | None = None, + length: int | None = None, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[V]: ... + + +def progressbar( + iterable: cabc.Iterable[V] | None = None, + length: int | None = None, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[V]: + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param hidden: hide the progressbar. Defaults to ``False``. When no tty is + detected, it will only print the progressbar label. Setting this to + ``False`` also disables that. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionadded:: 8.2 + The ``hidden`` argument. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + The ``update_min_steps`` parameter. + + .. versionadded:: 4.0 + The ``color`` parameter and ``update`` method. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + hidden=hidden, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color(color: int | tuple[int, int, int] | str, offset: int = 0) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: int | tuple[int, int, int] | str | None = None, + bg: int | tuple[int, int, int] | str | None = None, + bold: bool | None = None, + dim: bool | None = None, + underline: bool | None = None, + overline: bool | None = None, + italic: bool | None = None, + blink: bool | None = None, + reverse: bool | None = None, + strikethrough: bool | None = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Any | None = None, + file: t.IO[t.AnyStr] | None = None, + nl: bool = True, + err: bool = False, + color: bool | None = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +@t.overload +def edit( + text: bytes | bytearray, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = False, + extension: str = ".txt", +) -> bytes | None: ... + + +@t.overload +def edit( + text: str, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", +) -> str | None: ... + + +@t.overload +def edit( + text: None = None, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + filename: str | cabc.Iterable[str] | None = None, +) -> None: ... + + +def edit( + text: str | bytes | bytearray | None = None, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + filename: str | cabc.Iterable[str] | None = None, +) -> str | bytes | bytearray | None: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. If the editor supports + editing multiple files at once, a sequence of files may be + passed as well. Invoke `click.file` once per file instead + if multiple files cannot be managed at once or editing the + files serially is desired. + + .. versionchanged:: 8.2.0 + ``filename`` now accepts any ``Iterable[str]`` in addition to a ``str`` + if the ``editor`` supports editing multiple files at once. + + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + if isinstance(filename, str): + filename = (filename,) + + ed.edit_files(filenames=filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Callable[[bool], str] | None = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> AbstractContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: str | None = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/testing.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/testing.py new file mode 100644 index 0000000..7c0e874 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/testing.py @@ -0,0 +1,565 @@ +from __future__ import annotations + +import collections.abc as cabc +import contextlib +import io +import os +import shlex +import shutil +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import _compat +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from _typeshed import ReadableBuffer + + from .core import Command + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> list[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> cabc.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class BytesIOCopy(io.BytesIO): + """Patch ``io.BytesIO`` to let the written stream be copied to another. + + .. versionadded:: 8.2 + """ + + def __init__(self, copy_to: io.BytesIO) -> None: + super().__init__() + self.copy_to = copy_to + + def flush(self) -> None: + super().flush() + self.copy_to.flush() + + def write(self, b: ReadableBuffer) -> int: + self.copy_to.write(b) + return super().write(b) + + +class StreamMixer: + """Mixes `` and `` streams. + + The result is available in the ``output`` attribute. + + .. versionadded:: 8.2 + """ + + def __init__(self) -> None: + self.output: io.BytesIO = io.BytesIO() + self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output) + self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output) + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + def __next__(self) -> str: # type: ignore + try: + line = super().__next__() + except StopIteration as e: + raise EOFError() from e + return line + + +def make_input_stream( + input: str | bytes | t.IO[t.Any] | None, charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast("t.IO[t.Any]", input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script. + + :param runner: The runner that created the result + :param stdout_bytes: The standard output as bytes. + :param stderr_bytes: The standard error as bytes. + :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the + user would see it in its terminal. + :param return_value: The value returned from the invoked command. + :param exit_code: The exit code as integer. + :param exception: The exception that happened if one did. + :param exc_info: Exception information (exception type, exception instance, + traceback type). + + .. versionchanged:: 8.2 + ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and + ``mix_stderr`` has been removed. + + .. versionadded:: 8.0 + Added ``return_value``. + """ + + def __init__( + self, + runner: CliRunner, + stdout_bytes: bytes, + stderr_bytes: bytes, + output_bytes: bytes, + return_value: t.Any, + exit_code: int, + exception: BaseException | None, + exc_info: tuple[type[BaseException], BaseException, TracebackType] + | None = None, + ): + self.runner = runner + self.stdout_bytes = stdout_bytes + self.stderr_bytes = stderr_bytes + self.output_bytes = output_bytes + self.return_value = return_value + self.exit_code = exit_code + self.exception = exception + self.exc_info = exc_info + + @property + def output(self) -> str: + """The terminal output as unicode string, as the user would see it. + + .. versionchanged:: 8.2 + No longer a proxy for ``self.stdout``. Now has its own independent stream + that is mixing `` and ``, in the order they were written. + """ + return self.output_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string. + + .. versionchanged:: 8.2 + No longer raise an exception, always returns the `` string. + """ + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from `` writes + to ``. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param catch_exceptions: Whether to catch any exceptions other than + ``SystemExit`` when running :meth:`~CliRunner.invoke`. + + .. versionchanged:: 8.2 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 8.2 + ``mix_stderr`` parameter has been removed. + """ + + def __init__( + self, + charset: str = "utf-8", + env: cabc.Mapping[str, str | None] | None = None, + echo_stdin: bool = False, + catch_exceptions: bool = True, + ) -> None: + self.charset = charset + self.env: cabc.Mapping[str, str | None] = env or {} + self.echo_stdin = echo_stdin + self.catch_exceptions = catch_exceptions + + def get_default_prog_name(self, cli: Command) -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: cabc.Mapping[str, str | None] | None = None + ) -> cabc.Mapping[str, str | None]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: str | bytes | t.IO[t.Any] | None = None, + env: cabc.Mapping[str, str | None] | None = None, + color: bool = False, + ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up `` with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into `sys.stdin`. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionadded:: 8.2 + An additional output stream is returned, which is a mix of + `` and `` streams. + + .. versionchanged:: 8.2 + Always returns the `` stream. + + .. versionchanged:: 8.0 + `` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + stream_mixer = StreamMixer() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, stream_mixer.stdout) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + stream_mixer.stdout, encoding=self.charset, name="", mode="w" + ) + + sys.stderr = _NamedTextIOWrapper( + stream_mixer.stderr, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: str | None = None) -> str: + sys.stdout.write(prompt or "") + val = next(text_input).rstrip("\r\n") + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: str | None = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + return next(text_input).rstrip("\r\n") + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.IO[t.Any] | None = None, color: bool | None = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + old__compat_should_strip_ansi = _compat.should_strip_ansi + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + _compat.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (stream_mixer.stdout, stream_mixer.stderr, stream_mixer.output) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + _compat.should_strip_ansi = old__compat_should_strip_ansi + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: Command, + args: str | cabc.Sequence[str] | None = None, + input: str | bytes | t.IO[t.Any] | None = None, + env: cabc.Mapping[str, str | None] | None = None, + catch_exceptions: bool | None = None, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. If :data:`None`, the value + from :class:`CliRunner` is used. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionadded:: 8.2 + The result object has the ``output_bytes`` attribute with + the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would + see it in its terminal. + + .. versionchanged:: 8.2 + The result object always returns the ``stderr_bytes`` stream. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + if catch_exceptions is None: + catch_exceptions = self.catch_exceptions + + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: BaseException | None = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast("int | t.Any | None", e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + sys.stderr.flush() + stdout = outstreams[0].getvalue() + stderr = outstreams[1].getvalue() + output = outstreams[2].getvalue() + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + output_bytes=output, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: str | os.PathLike[str] | None = None + ) -> cabc.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + try: + shutil.rmtree(dt) + except OSError: + pass diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/types.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/types.py new file mode 100644 index 0000000..684cb3b --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/types.py @@ -0,0 +1,1165 @@ +from __future__ import annotations + +import collections.abc as cabc +import enum +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + +ParamTypeValue = t.TypeVar("ParamTypeValue") + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[str | None] = None + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: Parameter | None = None, + ctx: Context | None = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: Parameter, ctx: Context | None) -> str | None: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> cabc.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: Parameter | None = None, + ctx: Context | None = None, + ) -> t.NoReturn: + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType, t.Generic[ParamTypeValue]): + """The choice type allows a value to be checked against a fixed set + of supported values. + + You may pass any iterable value which will be converted to a tuple + and thus will only be iterated once. + + The resulting value will always be one of the originally passed choices. + See :meth:`normalize_choice` for more info on the mapping of strings + to choices. See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + + .. versionchanged:: 8.2.0 + Non-``str`` ``choices`` are now supported. It can additionally be any + iterable. Before you were not recommended to pass anything but a list or + tuple. + + .. versionadded:: 8.2.0 + Choice normalization can be overridden via :meth:`normalize_choice`. + """ + + name = "choice" + + def __init__( + self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True + ) -> None: + self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices) + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def _normalized_mapping( + self, ctx: Context | None = None + ) -> cabc.Mapping[ParamTypeValue, str]: + """ + Returns mapping where keys are the original choices and the values are + the normalized values that are accepted via the command line. + + This is a simple wrapper around :meth:`normalize_choice`, use that + instead which is supported. + """ + return { + choice: self.normalize_choice( + choice=choice, + ctx=ctx, + ) + for choice in self.choices + } + + def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str: + """ + Normalize a choice value, used to map a passed string to a choice. + Each choice must have a unique normalized value. + + By default uses :meth:`Context.token_normalize_func` and if not case + sensitive, convert it to a casefolded value. + + .. versionadded:: 8.2.0 + """ + normed_value = choice.name if isinstance(choice, enum.Enum) else str(choice) + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(normed_value) + + if not self.case_sensitive: + normed_value = normed_value.casefold() + + return normed_value + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + if param.param_type_name == "option" and not param.show_choices: # type: ignore + choice_metavars = [ + convert_type(type(choice)).name.upper() for choice in self.choices + ] + choices_str = "|".join([*dict.fromkeys(choice_metavars)]) + else: + choices_str = "|".join( + [str(i) for i in self._normalized_mapping(ctx=ctx).values()] + ) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: Parameter, ctx: Context | None) -> str: + """ + Message shown when no choice is passed. + + .. versionchanged:: 8.2.0 Added ``ctx`` argument. + """ + return _("Choose from:\n\t{choices}").format( + choices=",\n\t".join(self._normalized_mapping(ctx=ctx).values()) + ) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> ParamTypeValue: + """ + For a given value from the parser, normalize it and find its + matching normalized value in the list of choices. Then return the + matched "original" choice. + """ + normed_value = self.normalize_choice(choice=value, ctx=ctx) + normalized_mapping = self._normalized_mapping(ctx=ctx) + + try: + return next( + original + for original, normalized in normalized_mapping.items() + if normalized == normed_value + ) + except StopIteration: + self.fail( + self.get_invalid_choice_message(value=value, ctx=ctx), + param=param, + ctx=ctx, + ) + + def get_invalid_choice_message(self, value: t.Any, ctx: Context | None) -> str: + """Get the error message when the given choice is invalid. + + :param value: The invalid value. + + .. versionadded:: 8.2 + """ + choices_str = ", ".join(map(repr, self._normalized_mapping(ctx=ctx).values())) + return ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: cabc.Sequence[str] | None = None): + self.formats: cabc.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> datetime | None: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[type[t.Any]] + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: float | None = None, + max: float | None = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: t.Literal[1, -1], open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: float | None = None, + max: float | None = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: + if not open: + return bound + + # Could use math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if value in {False, True}: + return bool(value) + + norm = value.strip().lower() + + if norm in {"1", "true", "t", "yes", "y", "on"}: + return True + + if norm in {"0", "false", "f", "no", "n", "off"}: + return False + + self.fail( + _("{value!r} is not a valid boolean.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Files can also be opened atomically in which case all writes go into a + separate file in the same folder and upon completion the file will + be moved over to the original location. This is useful if a file + regularly read by other users is modified. + + See :ref:`file-args` for more information. + + .. versionchanged:: 2.0 + Added the ``atomic`` parameter. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + lazy: bool | None = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: str | os.PathLike[str]) -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: str | os.PathLike[str] | t.IO[t.Any], + param: Parameter | None, + ctx: Context | None, + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("str | os.PathLike[str]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast("t.IO[t.Any]", lf) + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> te.TypeGuard[t.IO[t.Any]]: + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: type[t.Any] | None = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: str | os.PathLike[str] + ) -> str | bytes | os.PathLike[str]: + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: str | os.PathLike[str], + param: Parameter | None, + ctx: Context | None, + ) -> str | bytes | os.PathLike[str]: + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} {filename!r} is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: cabc.Sequence[type[t.Any] | ParamType]) -> None: + self.types: cabc.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple( + ty(x, param, ctx) for ty, x in zip(self.types, value, strict=False) + ) + + +def convert_type(ty: t.Any | None, default: t.Any | None = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() + + +class OptionHelpExtra(t.TypedDict, total=False): + envvars: tuple[str, ...] + default: str + range: str + required: str diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/utils.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/utils.py new file mode 100644 index 0000000..ab2fe58 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/click/utils.py @@ -0,0 +1,627 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: t.Callable[P, R]) -> t.Callable[P, R | None]: + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: P.args, **kwargs: P.kwargs) -> R | None: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.IO[t.Any] | None + self.should_close: bool + + if self.name == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> LazyFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.close_intelligently() + + def __iter__(self) -> cabc.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> KeepOpenFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> cabc.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Any | None = None, + file: t.IO[t.Any] | None = None, + nl: bool = True, + err: bool = False, + color: bool | None = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: str | bytes | None = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file, color) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: t.Literal["stdin", "stdout", "stderr"]) -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: t.Literal["stdin", "stdout", "stderr"], + encoding: str | None = None, + errors: str | None = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :param filename: The name or Path of the file to open, or ``'-'`` for + ``stdin``/``stdout``. + :param mode: The mode in which to open the file. + :param encoding: The encoding to decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + "t.IO[t.Any]", LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast("t.IO[t.Any]", KeepOpenFile(f)) + + return f + + +def format_filename( + filename: str | bytes | os.PathLike[str] | os.PathLike[bytes], + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict"``. This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no effect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: str | None = None, _main: ModuleType | None = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: cabc.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> list[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__init__.py new file mode 100644 index 0000000..0bef221 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__init__.py @@ -0,0 +1,102 @@ +from . import json as json +from .app import Flask as Flask +from .app import Request as Request +from .app import Response as Response +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import abort as abort +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import redirect as redirect +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string +from .templating import stream_template as stream_template +from .templating import stream_template_string as stream_template_string + +__version__ = "2.3.2" + + +def __getattr__(name): + if name == "_app_ctx_stack": + import warnings + from .globals import __app_ctx_stack + + warnings.warn( + "'_app_ctx_stack' is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) + return __app_ctx_stack + + if name == "_request_ctx_stack": + import warnings + from .globals import __request_ctx_stack + + warnings.warn( + "'_request_ctx_stack' is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) + return __request_ctx_stack + + if name == "escape": + import warnings + from markupsafe import escape + + warnings.warn( + "'flask.escape' is deprecated and will be removed in Flask 2.4. Import" + " 'markupsafe.escape' instead.", + DeprecationWarning, + stacklevel=2, + ) + return escape + + if name == "Markup": + import warnings + from markupsafe import Markup + + warnings.warn( + "'flask.Markup' is deprecated and will be removed in Flask 2.4. Import" + " 'markupsafe.Markup' instead.", + DeprecationWarning, + stacklevel=2, + ) + return Markup + + if name == "signals_available": + import warnings + + warnings.warn( + "'signals_available' is deprecated and will be removed in Flask 2.4." + " Signals are always available", + DeprecationWarning, + stacklevel=2, + ) + return True + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__main__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__main__.py new file mode 100644 index 0000000..4e28416 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29e381ad120b1d76671c3d74dd3f5313cdc1bbc4 GIT binary patch literal 3269 zcmb`JOK%(3702)JHGGI7^`d0GIM%~7ZHctyCPkApZE7cN7I6YQNP)YV4mp?NSo7+g zpv|%A&|Qha5?fDg-V%AP;|Y?m7Sa znmLz$FPDo9uCFV9>wiAZ*f)5ST&WSf_*!A?&&*_|VlzkKih`W7Q%;(viPOLto*~Wv zXL*)5Yv&x5tHe1w?-Y1}Shb5ziI<4;z+-%jxBy({W#S_6I3Fi2*%hbCtHfi#6MTZW z3_QsviN}Gb_!M!)o_1#V3~?2>#%shAz_WaocoKMy&k;`nU*T7Xr-A4BJn;r@C|;0c+I})Z14@@b>L0DNqh~s#aqM;;5Kgq zU+1^X=BJF`KDg1m`3&}%HI*pyDDYhP&AwwB!481>K>U6nf)FtOKm@+$1_HS7D|;Y( zX}Q>tyX(0mv>S;%6AcDXePQd7R62-GUm`NXCdRv4#-3U{6Akf$r0r+d^4~65~ zMksV645if>ggD8vW9$eR#mTJmQka$$UDPcE!Zr1tWn<*j@J4!$J`C{W0l7md3`gIy z!v2|Ar~_&1Jx@Y}itBClFn9vyG+Gng_k3TN=beL~PtMshk)beP7q)fN+rxdUbp#0G zpj{I;Vl*vinc4PE*Iw**g&z)Asxn%OWNjd}nyh@!a;;IPmBbf>h74&O(~0ZcASRM- zN5i0C$Ui@%+BugVz}maGrxhSvxI_qNcFr{lKFn^l?zFbL`1~eU79b7Z7k{Pd^)Xbh zo$HLrH8W*0n;j`;+RVWFnmS4;>|^DTnk1h7n%OX)+?lzr)GtvFE{IP(WT2S8pjZIK z>=9JOOB9QjDyB)XbWSm4j$sWwg4%kCV);_V3@MIZP^^Gr{s=1cC5qKc6|nE*eBjqA>W{X{6N0X-oCm99w zJ*8iCAKq(RbiVW$qMQi2h7a{aZoxbcI}NN(JFTJjrRB7D9Un@b)^H5DGw=hWCr+i@ z0Nzov73JQeM(Fa+*)E6P|4WxAQc0H+fwk=#HdOds!?KNzEe?OzxZr#Fz8?-{HA4!` zu=k9EKs)K-!)7tc?-|mCauP)9w(WIb1acGR9A(fSP2L+lEl>o1I}DV!vAKA*pRqyQL&T!y9p#74p9ycX84CA@l1%)-EdzP zFc|+p%MzL~G_Rs5qk;d^OjgiT!9;3b*uIc~oIuwk8mxnI8qExv8k$)&b7-!hnMbn# zCQ?VQi(Ew45}IW+bu=29t7ulxtfE;%vkoRIj*d`x5#%-WHqgLn$Yc}S;W62Tk-=Lq zdQ84x@=a`g1I%~%HyqC#*y2t3F5F_h4n76*Jgq27%;sZOkJ)O>)??O+*;>qg7PI$a zb|+@9$E+Q*g_t$y12OP5zSS3{*487i4H znO`yjxtff(SaK6H^ZYcKZZRk4WEL?41y?eB2C4j2qMwnUo2s9ipOKiGn4({lT999? zZ)jkk>ylVmtm~hq>ztpGsvnkFT$-4p5L{B4l9{gn5>f~#%FjwoE-BV8OU*0O&&f>E zFQ_cZ$j>v@Gc?jK&MZmQEl5nxPE1cN)=$exEY8-Cj|Vv-K3=b&@)w6qZhlH>PO4oI e2hb59M;7w}i4V+-jEr{~L?1G+w6Ybk0Yv~iv_(Gv literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbc0206341db7098e9521bfbe9cc9e733c0925fa GIT binary patch literal 83201 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 z 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 L`=499$|w0hSZ~p< literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/blueprints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1003af9d675061788f7de5425cf09bd851313e1 GIT binary patch literal 30787 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�G5V0~ILdtWjE1q!W}h(Ikp#JO3;`Jp0aT=~(d~KMbnMhd5$(9C z*h$|6mHI$T!NB5X(YrDA|56ns#elpva^C7ihwN!&4EeFO%HwJ8apt8^3$|V*yi0Y< z&!mMtAG!9bd&G{S`c;7d-uZ{$g(&t0_eL%DiEZ52A$m5L+j)qM8k0V2-z1NHzThr0 z$~jVYFyk=u!;o$-=)7PEpZ}nCz7`G)hNG0(6Nsz(3a8B1l3&q0?Q)ywjPha;T)Z6f zwJ*VH2;br2`C7E@ddrR!+iX$75I#jW^++s9IdS)-ig5S7Rs5bd3*X`sh7itdZKbcf z3b#K_h%fJYPkTSc=^?#dFE@)G6|U(zKkJ$Y#ws-a`PxC$DVEJ!9KJB`w32xjqd>*F z-|4IyxhnIr;8p5QxyP$F#v^wD*DcIV`CB%m6>y&rec!FnTZ7V}IBrk57I^8Exms{? zm9M*IOHi(UV@u;ic=IlOwvKTx-r%@z0P~0*ZOAZn`Lj7zv&A(BV5S#BAgCb8>O>lsnS&07nG%Pc2>@%l`Eh1rOH#je`Nc1 ziGvH-XMMBf2=^fDr0{InY^kveyeThMw!l23JhZako^b$%$BA&}U61b7i*SBnW2iu1 zd}yIS4XFy&LcqbnU4~YJ&{5unk_BS*-t&6Nt$D@pijoClHcVY!%Y?Y)l`2Vq={2y;RlB0rdPa^N*8jN8a`Lt(l{XPN%981A0Zk%=_kR z3)f?D3@+TugL*CIvv5t8)}KgiGDlxVYv>JWFY>Nq+yeh%jkY)av(>5U@gsRz@T%iG zmR^YdR_mjh4WNcXIRZwGnpDkAZ^}RZ^u~5(Yk=(w#J^UXs(CGtsu3MY6e^sDrBsUn z!XeQ%kwZ5x)z{|Jm z9o$S+$i{25R)A^gyW+;&|yI&pMJw zp?*X(35oem0lCaO-G9+9>1}f-~V6ORqVnvLwx|{K}`C>Zsg0F8^=kyYID6*06-Tb z5?N@-Vn=eNsdk`lFwLnZLW+?wm|{pNYMHwN<6*L7&R{fyAXN8e9n2*J>hCX}-~53M zLzMmhL5QaLr%QF^C5BwJYLT3(I7oew^uV~LuS(J;bbiivCQE33n1-M;+1N>n0o{~h zS$mS$lO^UtCSiEF6b}o`hIg=&FdGhfT_>GY&?@)$ZqR@3CQ+Ao)bH?TIG&jTUIYsd zFL!?4HqHGef13wG1{QvX`+fTjUiv1DqZK!pMr^(PitWl2Q)_7wysG#7+&y?T91XuR zB^^q3Jgu9a4IFH$J&kOGAm4Ekx&HdkN#S^}^U{j6Y+Dw;TOxN}`WaJ_{r$2EemLpt z8zd9?0QsTNEFDscR3j*~@&nX2;?hDk-1G}HLDljm5YV)|1(*e$-2hYCuCXRI66+ye zIUrt!Fu{YHh`%B>&rAT#uU_cWmts4Q8I=|A(cuj73)Xb_aJWJC`R2XxbZQK6t!FLY+ z&f!lvTg9GRXBLhw2C`c^mb&k>uZSzpt?pdCxO#l$@WRoozh%je^Cua9x9sm;KJk%% z_a{yiQFYJE+G;Vw_M!H!4v9cWg>Pb~l@b%jFx?Lh62XglnlcU3O{7c}Fch+5cZPGA z>dkzb5`A#w6pd7@wo=IuseY7lguEl9DXNTCSoNkaGo0d?saf&op2uWH=(tjqbAD5c z4Cv=F^~0N5e6__(#WZ3oH5AQODCbmVTxl>&@MJ;HInxt6Hk!V#>>riG@(;F5dsSJLI(nett7`L31SYvudq91lF@3%hS0x^+nQv}T32 zcgx->TTaNro>hk|4Bi_1V8`4u+3mYm68E+rSbTahu{gGLyUjNOQGd`={={`e5dD}7(>R>dJhBeR%E=*vbUL?&*+q^I@6Wg(%YU)`}Sw+ zn=|!&a(!R6u64bbD{c9Vy7fsJ=WV^$e&92Qy>t)!{#)8I&3onMy_x0%a`S<;=7XPd zp3*(HN*3%3m$J>Ri!a?0SK3zsD=)8BtvZ)qU9kVCw(Up$T9n+i?++Wk*YF2TKXp5+ z1D|ko!;!Pz#bZm|Xs)g)dvqvsbXYz*yms`tpW1CL^*`)Cyy9Nnvv_JLap&Aaiur`I z)z$yRj-n5puDZ$v=XxdAw`akg@oklTTbJVZeBJ9c=+1gQ*VdWYvRB@+H?!q{yyd{! z7W9)xKg$+ei|yII-Bf0a?Ax;RhA|@g9y6mba$M zyU?%O#kYzxK0)>g8DFRD>jcER?z%GD_RHJ$f8-m;R3#rC?;C9QcmUKl= zc6;CZeRumP9;1Fx-k2_L&k9``VGlO$LMiIk&KH$;uau_yPd)J0sV6cuigml$o>m3(N;7p4&L)^!#Y%=sqNYBC(#VWWGe!hidMOzHC?eI z+ufh(J|K4=pfuUH?ZLL5xzh`?vbO^#med`%7+*U5$KJkA_G7|+_V5%B`2HD#ZDt<+ zcLy3TmR0^yP3c8f;~%vbA-v|Id(OdgavJgwdq*BlZ}4x}-mt&nc*A*{o3}~jBG^0T z=4P-$RwuZ5yVPNN6U^fzjxLK!btq{sz(4jfzrfvu{ zW7BXQg6lr>53zda6Cokq+h_@_H!OHKEDh0WW2>sKt(Jp~b(YhHL_JL>TxJ?%6%3G< z!T|HoCQDlnarcjIf@(5FI@MFJuTwt)U^?>=ud$i8o`SIrUdQDt-F z1!6*(zXWMuzXL#GCrtB}m0sr^^ZdLM=RN@{5da#U`-HjQHl);PV#$c%46D<8Sjl0O zqBC%Oobe2*jr=y^*zr2X-Kz&2Z_>qR{O7L0iQwcFF?cAs&E$ryi*J!Nw4Cn~`6q2O zc;bcVLhyF#NQB>Tq1Jh7M+TALDUe5Wy0zs{RuXLO0a|c0(}ZlQB~%2J;$B z;KU!zE_1xlPHL*XB{4)5NZ1J4@v3%ylrEJ)q46dIh5LPndU+lh{?|?JlV;BAU$ig2 za;KabHHX$J&!xTR{>@g!d(8}=nPh7W)+ZzCHP&mJt!-H|$u_YIlM?VwhTa1o-_X8p0<8tP{;FEJ#AbT3<2c*|rjisC5MMR5k+z-nnnu*NtR`wr zIYk>~fSJkl1H&qiYmOOuADJ7|jR-_#Yd>;$NW+tes>H?zy3p+V=0?of79@VKZ9yiG z@7M^x7Scwi;6wx$WKA@MHITc=-L;Vu5gGgN6`2}>TPW?!FS@9`zH3+bF;%uA!;UIx zYa2ju8_ti(ehVaRti{|2Mu~re1${_vx+EQXeHrgI*}HAIV#S~KZoBV&B3tF3JIRDT z!2A-jNq)MKLSGHFB6L@CG@>y`@8HI|H>x`tRTUUdvgwf>T}7|rKGX#E{I3EwcQv-7 zuP&{-#S*mYmjSs?B8DiO>LoV^ZxjZ(bR-|O zI%pS|nNib~wO7d54+iAICS- z<_mfP3?lao$COln*)4ce+~bkxco5%&x~>$f`zg*)HUO9T&@Ca8DpC?O3HrXO(4|FV zev^Y1ur0h(%{{iE^hW?Ore~wQcIfcj@i$M+pUQY!WN%Bx+bMg&eBawPu)_ag$@fa` zc@Jp1mLR%xmzS>4LvtTnLRduxzlV_OKBjLs>9-M;Z2iK1{s(j>UXQ%A#cFx?Q*;uX zyi&?~nb$4#z+z-EZ0j9*=~m{r`#) z5a}(fB4|hT2HHX0mEI;0vBEV&(Mi())tiHbsEi522A%lt1TI!Ou~qhNU3z&rk@jxA z@7=SJPLP+3N+(#Tm0o{G?}`qrO2vk@lMNQowURLEn1WtB)agR~-wIs_ewm>B7*v6V z{fp5ARzpGC(^q^e{9Vxt>0Q97;-q;~>4bDw2V9*tNQ8Kk0~S!trv_Bo+(#Q|!T+TF zL<)1F1%n53X+a0H088S%txqlo-ygp_e$Tt#LJOqtqLlRe)FYyeu%ij8D6xV!>uHjL z=-@A@T~eG9+Hd6Dhkl7zzjKqVqJF3FZwK$IZT<2wzdnYqDDK}VH>e%n4Et{;C#a=N zxHa&9DP$Jup8{@jgaNYFsYsrMTIqEolFt> z1sVRxmkX_rf!fuf{$j{otK*lB-qm`0gfA7||85a{u{y>_qxeTL{Azh~vur@}_}VWg zkx}_^(Dy3xJ(6!%o2x>d2Hy?@{#blF5el|v`Vk=IPGO-~J6vW_!_G6EUGlB7mZM_1 z_EhatG1}S5FpkO4*I?LJaeLVDD|Y&eeF6c;&gl!d=9!NCk9p(?yt3Yr{0s*oXgLi=LGJGqX3G~Z>{!HM295}Fg44+&K9M1&K%7L>V zer+vq?xyx#Fk&3g5mF#oI-)8fmCB7RTMt}pOx;SoXi|Ft6{#*d{)zY8XLcLDvR1_T zD&|}pWyoI?7XPso7IUol8Yr?j;md@?+*ZHhfH+IbZ2+S51H5j8z#SG&mVMazkpTEa z0RZfi1AUpmfE*ZD-SYv==*KdFGjia}hey@|LskHkJ}^3Kjs7q$#2;-y{KrB%z%tK8_>w8^v_3+H#YtihsD<(2Nrjl%T6G; zVUQbv@hm|C5mgI0-X{n4Wdcvjfu}#%^C7U|*-YS~9JrVszO)v2?$OX#U9j04!M;$x zj#=SR{k{Nca{t8p+@s;q5T|M}g3T>|$=|fX9rMCd5g3`U>05yWa*suGtzU#9Q^;c? zzMLk%2+;OmEZ?!w7ex!(;S9^BmDL3Y2lI4DW9Lu<#}Ti>%z7sfAk)QW*6u=HpeAcL zZ+uf)XA*6yVZv)26;8x59`V=Fmdc;e+87!q#wi}og-&a66EF>--Hg&%$L9%3$T<+O zn(jQj^zysY?@VVp_sgC8SKHS*4}ZX~bv|u{PjqUD`olU!K(5;MG!u!cO13f&0L?Gx z)Ze2n)SxD4pqRz6QT8_8Z+iN^_vl6~as{=`tc@(xidXcAaj>jM?-)JOt&Kj~KGrT+ zPtWJ4ou|I&`ec0IAkWT-RO9+Z+1B5)?w`VrqmR3j45a-xV<9$a{EPO~-?2P(6D#qB zZ0r-c+oSMEH|~lt0)spZzFQ9L&IAt0fkUf_4=$_)PG$n<2G@c8QEz+=zG z)z+tUBNR^2s^^LIJLSO6OkhwB46Y7;uxl-FA`^I44m|r|a4m5D(Ll)Xpmjp?@t`%0 zv>^t-S!Mb28vw4$uUej;qVb=k8w;I6=<{0jo9D53?|GchUuBfI82qiu2Bam9jvqsu^Jp{A!e!;-44=?)l`ZQoVeO3;sD)P&OsxcwNzBFCbK8@A$$?ut2%)_MMd}1jSZj9 zrzC5}61^Ab1Jra-k$FpLgS}0u9{R-mBR&zYyEYJlP%EXDle^4uzwm8h=GQLJX{lbQr8>2Twyu8{~3hA-Lbg8iv>S|&> zFw#+qJw~_VbQ`9dn{GXH`#Rm=L9DtrGA|T%a7P-WxL>2&KDzxb-F};H-=o_K-M&w^ zRl5Bvy8TCoN4ouIy4|DON4P1a+P51+;faZn5qQL1Kx~}H?J3o~$#x^%ZcsuS zc;mmOUo_Z-Uo^PJbB(QOM=gG9VE4Z4*6rCnPi9*?;Iob+4|Es0)@wSPgX{+j@PukI zP`6%8A^iMK|GJw(C0u>`x`#quu71~gDTT_o>X!9#3gL%)n%65RRLRwBS+AmypW>=1 z6hP=F)WX9d-sLPqN>Rn9wj$?_hjxV4DTEp*&g0yz#UX_6)Ewte<8yt*&NFYL=eu^7J#SdCL*6n4^x-3Ra&j;=U zpE~i>vLUoCP`1NIDY++GfwL?0+%?Fa58S1cy~oJjqh_aCeOj$}K5*~*)QP8-4WadR zs+H!!N40KKpZx>u$!bNsk-bOFzM)q1wLq=ZS5_A!5o}1MAsjb*qp|ymNwi1sQ zw{CMgE3y?k*6nycaCdy_#8ayaA%G77iH9blYu%0~n+QC$JP6^u3guz-AP=jjwNO1~ zKR=@$Gxa+oWL-VA#N4LxI0O2wrkS*7}z_C?r> z^rg`g+7IU`#lt{^&jlsLe}t627gQ^fUP>bTs#HJCKGK<=Mi^P~AE#5+Cz+8+GK!Jl zh@WNDesR%=CcLZ&I{7)Op3}oGf`!;mFB;hhQ7ZvGTOM)r=OpG)l4?ry>m_sO8+k-2 zl{jR8d7w|o8?6yuRvMA;9DPmqyyd4FjVuhc6PKd0C#@9PLAP$);0v$*V9X)uFY!v) zGY;g);am{Uf6Q(9G3WjhuJU89?PIR}zj5^+bG;vPEgy5uA9Jk_?2b1Mf9vqaj`|0+ zb#Is4DM`2QPqz)M9{IuP@1IV$osesvNpscN%7%s3+g-Q1(v3S-E@bwemG_>#U-|6K z@@!S(!p__KZ|zSv^{q&medpwT=k8aXPjkM_ih_&^C1NiYwf7KC&t z$0?DC5>bh(MOB#mzjHXO9In52zJL1GH#qLM^h3Q|a)O^fYT~$S zoXClMH`l|r^E{<>-MV%i`>Su)v%f;S!2TNA4eYP6-N^o$+D+`Qx!uhETH3AntM9h; z*xT)_E}`4elh>Z7)az__;=Q3ezsJ??V$Y1-?jBFOhow#3-kyT?0+u#+7xomj7a?sC zt=+{vCG90FZR;-WDQhodX*<&8?d3cdvUWAAL(BY?j412quI#C5ui`l!x0e(1Ugbn* z$l3K|CYPFeS1+g9mx=kWa_!Zk3-=n)jeD)=!F{?#gb5+=oP&;O5Zgq_13c8pOs^I`+0JGXgb5y}IF7$1gUqUT(OtM(gEc zY%bPfF4l#bv~h0|*JGYGi;@@>H@s?Se_Y&%-_0!VW5~M+^LAEkBlA})zeU`P{99T6 z$C1Ao`E&G6%fF5F|K&_gYD#=U+;U^9+JBa7NPU<2D{d3Fi%*I>ZtPU&@u4|e#9iWU zanF~?xfgY8c~@yf+=q3v|B;t}*# z*;NnCcNF=a`V#q$p(n?`M7}nW*3>p_{7;93u2(WMuBN(PRa2S2KhTNK{7`@6*+g7}rp zx(+ppG4aJ$g{A#&-}BJ&FNuLn`G>BG6Jn6P`);OxYDzr$E-$CW4pF=jdgMy%#L78! zdXTVe9CZq)=}xfEMvH4{Zg+(8+$3?+%{A6DK{PN&;de7V16w4xcvc=?+HEbjY(T z-<2un=kxLV8W-Z)d65H=z_;r$V0}8THL|0xZ}<6*P#=vpzW!J+91V%SaHlWW>qFb! z;SM$rz794gzLOzeXQaPZ^hG2e8-nO>trybfK%f^h5D28Lfk010?C++uJrMY6f3RD5 zV+x?F9f80*+&p#eex&Jiq$kwW6FD9135rcps4o(2TDxXV0R$%yRIpUFVol;>^KuV6^b@t zvZ802I=aLDz6%mjPwZBXM3f-mt6W;xDix{EJCy0dZ;o@|e?UQg{%?TwL2L1#uRv=J z60N1*#l2X?af7;;0#7+^fE&<>g1TA<^)XOr@-?6z;MJ8FgcbpSYrpv76 z%KYuJWzuR&U8%dcD?*3v6xX495u+ItvRV-qwUR#|T-9Cn2;86nxo9lx8Zc1ES7{v3B+ z|2%h&uXn}I?G0n6_<}xpWBS6q(O9szBjk&n4o7_eJ0aX7zRobVb?kHqdpsKRVKYX< zC%Z#dAFgab5bkA}l)3;0Bmx;xf)^nbj`&$Ai5M9v54U<DO=76!cZF))_hW)xjkJ6{(!*ZF-QhoWhHcc@neg>F^~ zSuuApD%IKF+d*g`ZE3sE7uqdJ5h-01ph1Vk0F4v!yVnySHYwmGwLkYTCSTWW)9=_?FEPQO(cGu>fwpAo;6=P>UvaOoa zBc>PsLcr_{J$ueX6YTdk5z9oOjin6ICp%qzW$5YQ?ZWle=d87?` z9|P#+JJY(@$tcyL>~smlH^**IBM~KG$Pl-X&siN;%16q-T{*@lEu}*{=LCnrnaax_ z?oByeSH3p#wQ1+Fq;uK$Q*XDw*`9PZ%@&n^>gF8IIVb1#UMsy?I=pkv#yMRhy>t0o zzV}lz-hDQ*^L~_QzU#F++}wLy9^Kvg9R;Aj@Kn8Mb+Fa=U96}qIuBUg!e!{YoNJ5k zvZ&Q${%R{$e?w5|zMN}JA5-LcpdR%xZ9R7pTwZdi^+>J(eJ+Yt?V*g1d*3qU#@piXBJ&$9^k>5TYjj2SJ~gM@aTJvx^s^Q`&{2em}JQX z3fQDjz@XbfVQCb27m@W#t^t$UI;i0iMh%-#Z{?C~_=$SW9l9`4)(xoFJYeqfJ(%ke zt(m*3A1tHx;QPAEe)PaNXztCPCj*-&WA;2@-PNh}fUnS2(V!*Ps6OxVtEtT20gV!r ztc)tQ3}8(R7~kT*%MaRmbpw_`Th^Dh4d}ELpc}A(1ISSM`GA|NGBv9yP^vEUmlNID z6fo#syP5-ZFC@fSH9ass5mc%QO%>YNbPn^*sAw~zqH7;on|0}`%B~IlAn?L2^rL#v zn$-{6fPnQ#)O4h`1V_3H1;yhr&(w7rA%Ht(Tr zI={HhdQbejGOkeo^eINj%aQ^gX!oG+Y)}dZL8kkN5+>3ygN6LQ7Eo>sJ7gXb-3dC8 zfqPI|8ZXd5Wo5j;-f8uUVWOqGFDxbL(?SRYB?J)ysK8J>KSS066M;I9*ZF{UNQeNs zFbpy}(?tzC5&rYH##il8=uUK?GX$vzSd*T9@E{O21bwm)g^jP-cc1si8<#evQPO=n(-8(W zuXVv6U%P|a4vP=6F$@tC8xc7f3x<19jATK+I*GthTvz9>FO?uwP{?_GFd9o6*kq;+ z^vV0u!pVquA#FQ;p*I#h&&YF`kY9#EX`z+Su`Vp81^Vu3fu=bv5UrlJE3*=yZC22X`R?v+g6hq|ocBvlew3(=U zT81)1AcW5MNoj#S*h}w?XUv;Hlv~$%3aqB{?fnd6i@5$GQ`%o=Vt{p?Tssbl^BJ zc-IWLm$PHBNoOs_n$MY?)25Q72}77NRn6(FmV%Gng=0d(T{mt_y6Z+-<_bBd2keu{ zHCi*;KV_;&Io-q7yVl~R+{ROAvTH&&r{^sV^LjmT8G3{9vxN&hXD_;kv==PWgFTyd zdgcr|i+4_s9RGZ8CFgyT|6{t~sn2GdCHFXkrFg-}d6uQz+i#n14ScvZk$;%Y=d7m) z#T>`1p_H?iQX4MTM%{!ketsf$bI)HL`O71T^?Pmy6ZU;<9%h~S)SByaYR>if zf|tujD`rcXcrt;qtX_bTu?(mI82f#lPYmNWd6jKhI_-1f5mNTic|qKR0%R@uJw2S53YK9S{I3? z1?o@Q3~^z%oQgvK5d$lmHlGYe*}&2!5Jc1}a5BA28-bZZy<*xJIvWz)!}X_Y1gu(YuR}1q^s`YfuY^Q>r)VM zgr4su(Z5V_H1}HXFF`%GXD}u3(T^w|D3ugl;zH zOhM7LXRkhc?ZvAvj&GPOSUF-H7KX)?*)we}O`1!`HcXj)ca`!lkG%Z)$u~}2KlMiU z_3nucH!CJ9w@*2rOxa!F&uz|yJkD&pbpGP`QU2oBM#Vd((iyYuih0C*#W~^}<5^X+ zw!ABwM>dZhd{Y>&9v70{<&(A*31J1()3kK}9%`4yyKe)Jd5!pWO_r2_64<#J-a3co zVt`|kC1`1eY#F`7fX26iFDg)5%+}=`CwafJXE+Z0Mmt*4U~n#ZfhHMXvaDQkDXBK5 zK|E16z=31YXY?{%Buig%sdfH<`=JJ_MD7(pYAHXfF6?jAWyo-ul;?Tw0;h6f^~P3d zE$WWvKYJRR*e9<$5<TRS9l%GH> zWXr06?GK6gCkX&cR?4L*N1(`LqJOCuZ&LU_`aj|}#Lej(2G0yA!zZT9 zRSV@@p6kjBBQK1VB^}F$_RN}`2~*LGvwZ9s&{YX@?OjNrR!pp%bgoaB*MGLKoKZkF zg9o&X-Faop$d+$!8(WsNl~3Dh@7QV?y;wc|#CQ`ZjCEBrRV$~f)+ejhPgZSAR6YiR z%C#8;6$lO^=LNx|cN9Z(mFGjTM9qeqFWfwGdu?Lb?n(Ea4|gT(M}K2?&lRDq`%zlP zuh<^v{(6URXSx3UG9LHbJLB(>^BQ!M5^=srFTEuG0_irnZhlY?n+|=qu17y8U?pqV zJD2QA%+e`-@v0OJ;JZm{sL!<{uxcNoPrPBu;3M=r2R>3)KD771L9#lDshq%+0@$Ao zNm1xB0)hLcqf9;Qi<_*nwk2-0J{ywG#6$h3e8_C*h;&D!dTZJxg`(l^Fsa>%@516w zo6jj3WzMV*(}(=fik|@k+;JL`&^{nFTCV9l8L6oaOA_S;7Ze5tNb5Ud=NUH_?2!)Q zg+$bZMAa>Y{5DeTE1j1HkYSE8ox*L1``DI03Pz&-j<-H#&ik$4`9!F=D_AZaxOgCC zb-lK7+FhS?*H5}vCtM9!aE(w|l#e=)ssycDKJ8tZ^sY>J>WNNXjU@+WDLfMXy~SWK z&e=JG`O?0N`@VUA!P&T_u~F$nyy*Dp$T^0W<>^zN`}bg6!s$?VU)m1T8;OPjGAC&! zKAG)f6YL&3VXu%jBN2i|Uh2R&v`Ycy{QP5hwAea9HcAr>ON`Tuq8{d9f@l&2m~$9l z!(dKZk9UAMj_rqBI`~b%|9$8Y#PX4oWF$Zog$R5uGwly3+n~6Ez#Oy#{_7`0gYFBY z=wq}S>_jRs}%CEN?K0_5-^xgrP}!m&Ck11_Gu>t$sXfxQ@xf`I5C8NN!^ur-6$ z_V+?M5Al1*r%Yqi7wJ@F1&nA?`psyko(QBM-QhDKbPMb30;??OI~hKOsq{&a?hy6= zLLZDYsOPLpvbGZ)B|fi{FP<1+Qt+M(fGd|SejjE^DSAJB*& z-~vd=*8uQbK*QURS8@Rjs{-G00S)7e^iHey0{0HziY4eI*?@v(h-{Nc4xAQXu@g+^ zMHku404~TzE6l7$NDI+Wcc=6x$j=H%!$>Vg9MUs*6!&D7m|rC$Vf)HONq7MalE?X) zhJ`6}IW|?<@?qh!6N&oONLW&p4fLigRo^%)d}J5J$;k<(FFpi(AE*4< zbfGuObj=5tq7$Y zW3Y5E%dn|!K^A)MHfaR?ly@-g<+M%; zNiWeO;+hz_C(B7`drKr`OdFUj9XPXZ(IZkbF&<4iN-u2+Fd=qrDRwr~ha~8+2qvfx zYY8U&1L^=wuyXc%nLA6^>QbJfX-`ekQG;F6T7Axo=i48d3)KUch`r)?XyYm;gs7ux)$iWvhb>PR2UUO zbyhV_v`tp78@0_8`o_y9#L2?-SM{^yYawBCRgUhOsa^xygX+gd56+a`ULE zpLDa*_t=TVtK6qLqrp7qg@*@ALSp_kJe1>-% z;72rR48V&n_!-9WER0V{W1!12>6dD0jDfHETsHBMMl84^`$&Au?qOqD4mH1*nMl`P)eRDWAQ_qC0bA{EYD9T?OlQE^8xc+cEB`D0&y67Pbfl0z&Pm_I`+Ac^ z6{j8YmI}z^ue^n6Z>Js1@C=BLnO4iTWXcC53ESDonGlFT1I$li=Ot1!Nl(#@!Su~Y zX%Ku!mIPR|B^9q`Rbxe{J75bTxbEmSzm|sx)94XY^VtyhpPi*CchR(adD6Z7t*%M; z+G%%l(%n4i-ZI<*0oSy>Drv78*T3z2(>du|J7r%t>nt1YCxy`1j)b#mT)5+GnlQq8 zC1Gw-0H@TCs?&BNt6@IFwxL9T1kjKAF8vTUWIi8|UHXwmcLV#hk zO&f}mhN5|$!LVjt&l#c6K?<@rd+AvH_*0X%x`a^2deDJF+NCTHex3;E#q5}QxQ{up_8WCJg6Vg1N;l|UuVs4=sZ9ccs=3@*~HMiL|~6E zPg4{$i((5v7Qe~|&>)~Xf*fDKCr_0M*uH3*wCehMyTKyM7zjKs!EVt9R+H8^}9 zTPMUjo~<`Klb)@&f|H&n6ZR)%sKTf9eUUzuxXtvFdLjKA+*tQc098LJckf5kz5J!! zlc+DXc=b7>W{WGY#jnN_)$4DzO%^o|+y5ZwEjxHnN%0&Dz*)X4k8I;?&Y76 zpsU;9QBw3=Oz8mkAbJ5$^Va__8%GRv2EmodVCEDFQ~>ZuP?E)rsT)t7zG?$Dmf2(-PylTejl}#&sNvChzn{aNL0E*gl6DVp^!n}zsrq+kh-n3*`i%V&5 z)^obi=Z=z6lxS~*!F(^zZYY^AHySpxirEksiL7Zb_@AHOg#;~_A&90yO`x8oSJt9Y z-U3$Y2J~5iBb~aH_0kxM%LD~+htM97a6 zsY7CjOPTCLgRmTdmTKBo4nhCx?US~ZL%ULCzM)-HLUGELKXizVFs^Id5jQYCIBnd2 z_~?;iZSmg|wWvu5GzuJ8OttY<(G(#dVk;X|#+PKwzB*YMBD(_keTSK9gh}mytb#tc zf)U9t^RL80GtQZWVt!vMVTK2Y=uQA{dP=-D+#TqT+AI2*ah<>~)K{naPv9r<1tc#- z%XP#mXZbxaF=56g3X9tWGzEHCk_KtoFVc||$fTA~%91NX7v};fow~CesYakUfyqNJuyjn50Og`@Mg11kKY&$NFSMrlwP}7$ z+9u09cJ1Ez^xk??+Dn3c=oK(kV4VUoJPnj;9Z`rEN+gaCpa2={fdF z5t%%=c8zj1OIELytzIVMkp2c0{D{_XI}!i`Mku(Z9m}EJ8V|kQ^=8+kV=bw<90^zo zb$Ryd`NvioIxgRK2& zlz(dWi_8&+{AbktOiVAnCfk|tPRhU{7};CojSG*)wCWWq?{_JTek#1e&Y*ZyT|{Xc zlRU|7KCn2X{|Tj*tPFPmjRy!UFuxws(n#+i+y6`}qyq`ILd*^Z<9;i6=LD0%n=-rP zRWWX!GS|bh%8);5m=X%vhyQG$fayTV`Yz8io##vD`BL_sseBKZr3DlD#E@+qtf|Nn z47u({NwqlQs^i|S*If3_SGbDV0$eG}U_`ySfgE^&!QQ3l$ z$xNxN-}i{G;0GuYVsLKC35U?Eb}1``pZ^{nkvJ#YcQ&Jy63vUQ z*|tK0-AcN8Qa=S*C1U6-oSR7lCq^Kk=PH5U#60k8boXkQgr89UM zrFxYdSPLpQhmOiNQiPca7=a9t$BmED306I;%d!+!ZkSdCvV$sE)La(SY4)+*Nfq|O zYKvS)n`tXHpYUTxpP-tx2TU_SPqpcxoJ1$%tHg5eaKG!sZ^{h%^X(vMdKs!^}Bwx_gwf;3) z8~Z_dk{>eR#)c(eTiqp0@`CS4%Psfn(5hpW^p9S6?7ORi)oh}W(jXl8`TqrokO@{5 zf&xUHF(=6Zl0@ZL&+}1uuVjdjLDPUKmo;uoYcXb45lx1y?9?pIK(6Se0@RViay6Ex zmV8&~AzIcC7|-$&^Yu{(Q5Z^)Ra+M^U`sAh5DjY2K?0Fdgi;1vCNgfC0a>UJmfmb}(!eYK@t{F>-NWSEknw$>~!vY8IyGLGC)M zAIwS72?C@mVi)X!Os#1nqq(DuQBCJ7QdT06V*m-!w3`HmL=}NM3Bc;IGYmr=M!D~) z_oRhxC_1FKQ5{)$BG87I&d-ogG9-po0XCEZwbKp-fXMHp02R$!4B4fBOAigey&*}~ zVv)pEx=lBx53>>WQ8rZCMxjL19}b34w4Zs9HpD_CJ7yRP-r6$64)k^Rp9*WmqV*Og zI!Jq|;-zSf>FF>Jc(tUTnI0K1cqu6T5?xGNAZsTABM@Me9HBY76j_&SFp&|FY6cVk zH<6hC5fwnTwczI5g`=Ts;j7_s^F-}rVbh($jW^d#x*i)gLZoDIUU7^#ri$url>MY9 zQMhZ$y!$t{ij>`bZf}}0AG~XJjF^(<;-q=axG`Z~GqL=RdChDod?YSAQ)Me;U8Z8B@f%xJ3R+ux zdD33~`U_|#^XtVa`|8ZEm!|9uvvsiS_{dz#nEgcpOcH%D9_AmBU_31TF1?7m%*Ziv z2`^!4{}rqV6En-x_Xrevq*uT%uG>I14!OXCDBRH8*kC^ar2vffxh@FemR=CZ+eVp^8L&aFjBK-MFWF|R*Zq!|rQZ>+%#5s|EHxABPu4i`JVpSh;?F1y45+!b zdaLv+%D)b`v|U|-M3*oQM*2_m+^z9O0kuAuo%O=HJkSS=>sVB}L)ipc|BR_trDd$N zF4VV3Se7o3W9KZ{CUIFd!)R)M&Kxz6J48Ft5+p%3=d`Wv4wU)>mX@Na|L&7^z#J&w1m9p0%eq_JafJbV4wA3Q&y`?2XA(?|9- z%n4C$P{3Qw6611y;Hi20ZU2T z(#$+m0ry#w%`23F_Oqh1h%)2UJQ5nhjv96>QL?_YQ4O8|38K{aQi{IyIu#|63rVBH zFy{CcJ&4nd*~I9iv(lf_uTr{^*_)KcElP9@0e@Ty{Qoa_5--ex|Ex6`KW(7h^9y7E z3P_pl)8^`=xq8Z63;U8h&&ab$hi}|7E>1dD59?-aj^S-7Pr>m1S*Ls2Nh0dEN++Gz z7IS6+zI8C2X}sF_{iflT-^1g-?DaF#m0OdQTj6eSJDRLKkg_|c?G;Ic%IJ6_ay>Fx z*)(NegPO?6VcJ=pbXJeApAaUUjR|ujNigy&@4=6*c*gF!a&Y9}Sl#%t>FRaK>UERV z8xqSl-aM8l-h4~E-T#sO@QkPEb26YUz8@t=nxE$Htl{3Tv9$Q~?>DS!Dbs&YW||CKAZ z`;)rIa_xd#(Bi?q0sbu0+R&tQY|m-<1$%BAECI=;hh4eg1ooVe3pS`d{DM6vye#DI z1NI@_o#SJ)rrCv_G^58~*prw>-sTD;u&6&Ur(X&Ka`!})DoXzwx>4_9+Z`b{LNR&I zJBSEXX}oA=*QbqgU^>|d>c66F1_Vg|JN^7Wa7$aX_-;}cJv>7XAvl(xD}Z_@v(w4a zT;AoG4Nhw}dwb90cf2@jdoSwS5!&GYfGkTk_+3Z-YXw(}lCBlw(Mi|pNk_x54hCdP z_O-=wkWay{Y5&OnQSn;O)t>K1rVHznh4s^go05f_Zs{irw@lf$LI9axIC}Ei6sPC2 z1rOW1dP^%0DB^H`;r5-jA5Pj2!w*<1|M`NA`HAY$v{wH0$EVAhl4VVkWor|q>uy#j ziZ|ZcaC`T!><8{T3zUZEY*gfalo*@$xXnBD-1~aVE}Q;+`>Ga${sY6~NdMf*b4+fmTef9OQ)@FaLJkxX{$?-@rMHV!*wLk&L!x^yDYyW zJaG`-3W-uEYpXS`Uc&!67s&W zGi{Z^@hK}ELUs_Avg6%eD)TwrKBgN(XiL}oKjTfjC~LiE*GcZ@(F@4&8N}vZu3_C} z-4*MIHQ}jCnpZBsN3U#b!*to|WZCK|Tf>aK=n#<)qp(sgwyubN&D)FmYeRI$ENI??>fEoZI+GKjKlH1Az^M{>|nj2t+lPKtv*kh zrY?VvZsl~lO1G5u?6#H~)>5<3s`9-xnaE zc#*B+xK}ppX^~CIR2y5ix*?(BSbg^$i!xzf#Hl{`e94tcdNn6Y!MvIz7GvNW_)&2~LY+KD-+UuNK3R@-v&@*OA zB43)*N;3fVn;MH7yABlOHfdN$$k-`v4K`p`j#7GRT zR0i2Hv=*f0f$cGw{IQC(?jXdhQHK1_V@OhvZa^#`V!GwPC?J*kfH3H7+Q7z;9dj)0 z0u({;LckZb3CV_KcZoLsW|YbDrzQ{1F<~t9R?CF&ulJ81OjNF!uH2NY-1Jl3&y0U< z1bZ=Qd-C?~q-}pf*#Ds9hX5q|;x|!0IV6*PA2iqS8M(MVL(Atv;W@2tH6f_v0gaza ziUaN84V(H!k8>9+qGb?ajv)JKgzN`S&AFsJ1A5VP!=aWM1U~|QnUXKl0*DFIpzd-L zg4e>stPP#GIYllfQ%U0NEW3COC3adZqIp51OGx`KOH;_SZ%{}w4KQ;mf~PL)1&Y!f%K;!DpI5YV zvQBbw#6kqMA|)P0H5#P@XDp2p2z(8gMSwpQ&Ji|iN$WK|4p zWzFBBZ>bJd`{>NFi!_AV@CaDTvBv1bp+IjP7G3V)LT$htE!1u>v2W{rfz-eEE&fjO z217Fbl5dr-E!@WfRLXjOA7vq{GA)xlA+)ri&IfMU74cQ~g_S5}&;lTyUvI#(M zd;DqR1<)Fib8Wx_{|G=L{SLQ1aYKKsvvD&?q18#ndk27xgtJYUD-UYuI443uLPUsc zXv3HchD?kIii<@in_@DK`ZjW)@_ z*5QWHR{rvPoXJo~0jvs?0GYKDv4nHkq;tct@EfNmW%tgS^VBdM6Lkr5>6Ce0%2hC8 zoO7b&oSU<|hYo+Xu$7tcSPTUp+nlehySC}-rfb`-ZW~{LaI`m${rK5;p8fGl@4R&D z;8f#2MM8!UQLgQ?p0bp;82;mqJn|tcnDd~9`%xknUlDe!<=$JnV_8dq{sS+M`y$H7 zfGiA8eisQ)Mhf)LNOhqdp%APkUu@nDUsMW4sLzD8APjV|;t{2U0VpR#1FZUt2tc4o zr4UE}t=603FEWRBrt$JYMJ>f((W{71WwQv`hJc(i8F_>#F9d=CYoV%ZV7n-Msu$Fb zVsfBH`edsr-Pl1yN+Yc;(LwLBqqjh%}xf!`*_E7{hbKb0}Fkz~m zF*_LJTCjTJNMiMtTRRe-ZByp$vnH&{V&&y%;GL)6Y`bMh)NVuUvX9J9B1W;fM5cjI zt9B{hlArhC(PFzPQKwo$!GE7?H(oHn>dn!DAUQ|Lq>W6n7I#u zBr==mKxUAiiVci!2km);{sC6P7f_6TSSTKvT-v+jOa@~YcDe#;s0)gxBOP^QZ2`yw z)T|iGk|Bd^z@(aLzZ{Kr`;Q+#q%c!xlSLGeKO&3q1pGjQ6aMv^rsDM|HQY*^#sL6>?R*=%5Wzg6#{E6#WqNWlpWHA zzF6cGd}B_N&(cZQ5M1!Lkqa#%t&m91203@MJ7eG~{S0H0d{|*=4cOu# zDQ(ZLOClRmX&G*a|Do+sI1|zikRz-x1AivkAh&F(j&AqyHcIQ5h&Wtqmyl~uFMwq% zUa)wlD39;bM)^Nc2nbtevK0T?UO1OuXmP`-n_!-bsC%unPdY>5H4ZJ^Qy5mGFN0ZApBI){I5pc=`Ivh;ErGD*c{y z7NNT8(UJSnjTrJPh~RL^y`B5B>Mi=8ZEf-D-`gte)al;md8FUhRqw1dykBde^y=lf zf8f^P-iq&#OJ+oxMA_b@o<0V_9$9iyOeq`=C*MA%`7XgDk_hP`5rQkdduZ1^fj6}A z^G2V+EtjGK9SU$k?ko^IhBpthyU1l;1GGng zOy)CDb(z&-7Sd*o&Y4FD@j;ZFBY)1MQfp9;R^}j@~(|Rb{B?ju2;it5c zh7+a~5ep2gVp}qJsJT8#tC5KXXJVscrRg9L=o*@+OQg4BfaCM@FU zKcWqQN2olUSDHtf83(h11to;9)abd9uMh2;6AXsOerIqT7Hk~0 z%4FupHUy#2VCIvzYi{>v;_Jfi#9o;7`p}0RiQ~^LdY|vr-Y1st{m}DaXwu!5u(!=t zEF0fA_QJ59DBRJ<5U~(qV!LbT(5EH@xVT>YW_wn-UAH?v+&Jk*bls<*su?=;*}{6p z8u5m*R6*&ttgz29l*z{m{3~JS6Wsex*jg<556nF79hd{{qJ@NupRdM!ss8}8=hwmd zUtsq92FPIbY1eUz_y`mV|Bl#cMhpKB57NTSkUQ8x2X>KYhlztAoL~}FvVvEtATL~O z3&x8aIS$)pq7v2DAaz%sIMFOy96v!juoqU=y&@>-dcSXX5O(#fKCDw#f%?f|2u^LP z1hT9~pw6CPbh^AN7pXgmWx?{`=SedCaLb2`-2m(Wl$nEz2-z#4hCzgoLwJ4=HSFLk zC?^Mvh%;aSA(Ta4BEWy10Qvi%@wggH-gr*Yo9NSS7Ohh?^JJrAiXA6N6GT5UjSKMWAFO&q3r{hfTX-3> zQZ`s2_4me0j*&wHEZ><^2MgIFbC!P4a8_`dIJu6Lc5!1PD8Xn9-aMz{mbL3P`Pbmz z+IR_p`i$QPfn|2gRD@1uGARNt=8Qu%kShvm=nD@++Z6XwS$f2vxl)X>5wwi2Wd1HV z@+p{2elnI%6%6fbYddM&J8M@L$0=}IWFuTmpWYG)45lV0p zpexyZ4v!FomYnSU@nXe;09IXD&UX0quohVrc<*1@qWa=dEh3~7c?C2g!WyKsQM5`w zVSlVXi7$I_tSpk1Tmlp6k2~PqK$gVJ)hil5yqkWoxhFJEB4Ox=&`V6YJVgYXWT7nF zUDXr92$*4dAVypS@Z_+gdg*am>e@Gt!zmGgM7#S%Iv9|SZ0wE3d-s5hh{AVBj?za{ z4@qKYFMB}1l4V2i97r8WKL2IAB^P_3XC1_@sFw{1Jpsi^^z)LPIB5`NNH4uK{?n3C zYiQ4G1NtGH+5v)9V1KhBat_dGayhIuR3a6eaTcEmAZh_wD=>g+8ZbjDq4bu{#azPU zuE)6-BgUj2Yo)KMH-QAek3T#m_qGp3RC zLePwfk%15k&XNlh$*KmX@5qSaNT8Dqw)*-dicyJhi@i9_!nYqjsj7ckpAJ3TEbd|C1bHf zehtGDP|K$6Ab_>wOyyrHK*1?d3{-@~v<*DIN>rw83<5AG)Mz?i*_tHTVw(q&cxKG{ zdo(DEJc(a{n2RDwQAA)C!Hr2Y<;ac1o7Fp*-5SD?0tX?EH;@K}6C-In97#!@iit;z z4gjox0>2pTEA1dqv6F5z2eM%+6RZ9XKcf!Z6a>%yD5!LjveIoc&CHLGz|71Y)j187 zsXX_Uo{^q!M~3waKF(1#X)hnz4e#oqms767VWS*QIOQoGHs2KrNBhUb>B@D<%5_u1 z`ny6NOk&x8wp0PA&5D$(0^;?Qw<=Xq|4$w(owxvEwBR1+FjUUiYNl+<$zrWgjyp7E z$4LqvSi=guqZS0N$2;c5NpTAf{QP{*i6XMS>NoOtd+Obh250IYAsv(EqEmuJO zO!#o=@vK8YH9hx6I=of0YR}k|LbO-4v^N>82xJqQ?mA<`4<1`b|1#hmHonUqtR*X? zGchGgE)|%+i_Jh6ki>F11@l9VCKoMe2dkbg(B+1U>lGUZ&!7=PZELr;r(n5D?M_8%vSR^rn+9%TLbgj>>NludpH)H)EqpP)`de7;|-k!(5%YPyt zg9_OQ5%4ml4&;UdV?WKrC7wrdSFAxd{%4$+8K?hBfqXy8R z*u3)gQJ={41cLKqPC`(iKdXTSoW$A147)JhxZEz-Jy;(QAqx6A489LN=p;{Ub~Ll1 z99Gr+fXAKv-Ard9#{i^qQS#9CMSH_ItN`WFa|HK;M*t(}>D)fnzCzEDzqZm?CJeCB zqO9-&L{NvMs6%Lhv`Sya9j7XRWQ!ZEJNlsPjoYmI$+!S06Ur>d(dXOt9cew@w&Pga z(?=;dcBljX2solaoAJ|;$eBO@%!Q=|Lg;P^l>tt{DC@CE6bzT<`cjB&&}rFY$V5mN z_5;#6w9Z@{B+@D(go4sAQ<`L1jyB*^%i%uVNTmfhtM^JzP!WppM1t=$BFw{$Xn~%& znZYOf5Gn?feDs3Oi4YOHH3Sd6ZYsz+E45Oc4yg1Am&(u5W-Unq83 zRy5{%qwsp+4~oY(P3)O;t-pDE%KrEt;Oo?kz9H~9LWx|)8IO%gXXB)^X-ZhLfTKpM zUXLbfAHTI>vgpZ#;GH!UB}_GQIQ7~<=W0V;43cd^wq7klj)Wvuu z8{xj)J9aVB^~lk-{n)lpg0t5Yw`7PG8x>tdlWG(}8j8b9)=PQWy8R3m$wd`(X)<jmt<>360g?R%e=ErQ&egVv*qkl4kqeb zc^T$uI1j80qIeAGc5!OmT3^|bob=|!*GXapj7S2TC6{RIDp>LeKV#%s#4eN~<;ao? z4(C?jXChD8rM5kwk7GvE9;km$>EMtqNR4nP*C-CPB&2M4I2yv3%X6;RhUetpu;fzQ z-8C8s*g0p-DD7KP6hGBop;S)4zRZ!Gz~287UZ!Tzf)SWSt7yYt3r4a6hjZp02`nFB z)#1o$!;&kfn3t6!XI-K*D@X1+@-sQWz#F=19vo|if*P=N)jjw=W6`VDb;G5m*!--1 zu#D&)FlQ*e%z>b>CN(eKEBi(L3+bu#l2wtPLhbe~YizBWd)SIK?78)6pYqg6-uX0(3Y1-7* zAMDSdgL?U5E!r`CF%$r$>FC;^jxqCh!1Ud$6?l1tAd5IwsyQ^;@MkJ*s2ogc)s85& zpX2I_Fgwfdb~|k0J4={6WyRq~UxK`*V;Vq2pb6;**zN*uyzvrTq*38jt1m2sKZ49g!`5)r$RXMxlh^_UnWn& zgOUU-%RG@MKJ@gne;~&Bj`x`lg*O{V+pazTz2|SX{nbl<`O;)TOVazyADOWG8?|+O zT-V@Z2e72gyESwwya2Jq9$(h5)KkPl8{X%SDq*5-m2l z%}8WTE&w*-a-$OYLR@Yg>7~^Ls!XDH@g%~T3V9%WA(0-W=#g`2KD=nUq;9)z`4$b0EYjJ~XftT5CZChf zWx$bsI8=jd=)g(guKS@u85G*Spr@5lFWl$97S}azxz7)_s&XY7n$%C@&Aj($H#T!YvE9H?DeW-@m_h1uM`&Z^<~oEp@i(k zZ0eV~u^9WHt^|t^AW|wSYdX(To_lmV!#+R|el$c~NkMw{PjsWz!Xk69^)7|!CtKqJ zkzEok2WWo~+5Eh8i1MFg4-jA-QY8AgX?;)deA*J~?Z;`S(AeP=bmnLcPwkgc7lKs7 z?M2!0X#?w9+R01;L!$QFdO8>lXrv%?Z>$RvEw{AkG*m+Pg97 z-8gi3#^s&#K9e~5^py9RN!K$&2U0f2(5~5hh^nlHl3`)io=<^05cPmuJ74P@6X|rg zJC*Bibi5n7`SoPQp2@pz9PMwxNgecI*UW&NSV9g+T&LrpE6fKYIemoVjFG20V{I_XmhTZ%P$>!JdwA2Xm83< zG**Ih7ce%HD`j?G$s5Ugv*PO6n+K=NPo`k_XdkhUJ~w5qoE2=BS}(SaJ~kzkrf{m# zp^Jw`3lY+DPS6`1)P!Zk@>u00KjEEn`9I3@Cme@{_TZKRf5OU)Kl3Y3!#F?M zGPdmdd+&G}ri4a1nihx2V)_5%`CDfvH}07#-aF~sJG2kSM1XHGtQyvSBC9oKZidiT9S7b^H#Mv#iY`TISD$xz(hAc^k$)#Y*I&O>3 zsicx5`JkgTNERS_nldaoEDaZHeMyUsiNLQ)NgY^D;YR4Sc1SSWG7sEUj&m&R)QE1iDMT2l);=H#iUoMA*~IGy+1@J z|H;Q(1p*SypF~!%(sH^n>v|@uxlBLT(Tzx#v=K(Epe)ina5xKti{3_AIQ+Dk0t(VG z5DYdmIG?u4lLFCLhy_rUk5nTrGM%rU+U6&n4C-Wxgmj+vm=<%C*$}2pr@A92VRWOQ z6;fsc@XAUCVzAPVw&#!T4z%ps-Et7th_ar5z-`+4GzHbzElKDW>C@yB3W=0t#}sCr zJ~KesjmqasP=;^N6Au$DvEcvOfdlD$_FE3l2f-Nj*&9^gExNr)x4)pD3A%4(#Dq4kuX&7471RpXG>eQMgVV-Wzu)wyhV;*x=s2wXbAst(Sz6m07yLl z30M7F&iZRE@7J8=*PN5x@iYI|ocj~5_7kq^x19YGZUqvba2r42R{m$s_X$^nSF?KI z()L%je`rj`_l$-7%7u01{AQf-@U@YzEpSNAZ!_|)xl#@XKZLGyk94OD zmf=l9N8pD6Bw{Ip6fMuq+ACNnvO9G{w)x6D6sYE06{Ci0_N(@kp(Fw9V<~01iWV#e zmu|>0m+$3WDNEs;p8i&?mj7 z@Syx+`S9s6Vf;*D^YJOZZSg}fv3BnizfXIZ66_ya3cp>IvaF{MVln7+ko4*DdOCR8jn#_x#1*N>4&i$!wGj9Zsq;t;~;Mu$f)y><`lX(Y*Am5xAr<_8*{XFG< zn%%d}b@3=ZcNWSI`!wfHa_(uaB*~SGEgO4rilb8>wQqDTQL}4`-<{&~@97$Nob1l& zTy)#R&k6WF_Y#ya>i0aKsNFfmw`6}M&@U-V0oGUfNO_`g-=t-K3Wm{`mbwLpG8W~d z4M%WZ!MbBp{BhQnpI@c51%qBTNHn{PpDV?yPr%8Lh&C!D7-4>F0}i>|HY_ X*oWhH^d%n)=5OwSTv{k)dg%Wb(k#V5 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66abfe31a410194b17a4c9264c607e62adecf477 GIT binary patch literal 15399 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 Z8|CevNVwhGHXD-n$mNm$lGqD_`oCSK3(f!l literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/ctx.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b3f75a23c3ff2c1b7d7efcac42d4233880d900e GIT binary patch literal 19583 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 S6rT^vLpHhcUnDB|QTyMfpe)}2 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/debughelpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9747bd6787464af29ae6bc23b2f8ace7fced7686 GIT binary patch literal 8583 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 pM__VRxczCvZ8`(;J75QzvE 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 IDlrNDU+z>*SO5S3 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/logging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34b02b322bd77b7e8468bbd7392be3e48fdeada1 GIT binary patch literal 3288 zcmZt|U1%J~d1mkbPIqTXmQ%Z`GbECwQ|&va!3|thyVTanCaP_)nzUEK-RgGkZl%55 z>&%>`6LL6GgY9B)`;f{B0r#n-m_i?0C=~kI7b{Yc*fiia4K&aPVY!g{so%`r>SRj; zyYtOA-~Y__ee>63GLB&UGyRwPOEH8#mkWP{JOJY?dF^p(v{;)5$H?uI%gsnuQuh<7P5hGzlZU!HA35rRh z&xqa(7E>Cc+WhezpAXUGL+ruDL-f%6t3JLrE6$PL+J}so&*{%#Z_a7c15MDFw zTK1YU?xJoR7G)q@vNiNJS=4O-+Lbh^M%2MF-v!SjWxb@=K|zayG*UG!O2ALUtcYFh z%2fgyl(33!j|pNnnhpa6QmSDxS`k*;Qx5wOkSc{>ImCo`a>Z6I(}flR35qFKE9-JMvJU@m$?$&|Jf*>kZw= zG1_!^?zPjWPhHU4{M41|sq>COb8nfvrCa2hXc?wMB#OY5oCgPZ?mCFiS>{}>*%o!j zem(ozw{qMR^i)%?Ea)}LJ?nG6_06_Bu-^lg25aQUW!iPne-ESVnY(Y?J9p>Y{qL?N zGLM26{`BgfC;m7A080W%rJINVA|$V@y7a#R;Fh+ER?z(3eMtkuPxPN_E9eGZ!E90h zmp5)}Rczp!(G@(un*jbELKk*$I{!%&N=~xJ@z(NZq@X#I#l3bfZQpbzNa}K^9HR>XJzkb?`OF9b4v3jj}OL@(n8L z`7*6m;fP?1SoAuz$mF~JAkR3pJqmqob6tu=b|fP^tvo5lK{Mr-$WP+%L;mD z5UD86`_Ao|?`R9h5c(Bf#TeZk3ZgdpU0@Msuqp&vy+xAjQnhNmuf^x0Ile&f1|HD=#y08z|MupYskJjx8>zxZqOdji(&O}z%{2KWO}6^_ffarsGSw|_D^u5&o}2F>ty$mqC=oUO~HyjP>+4aaC%u*yrAat>*l;rq@UP6O{e0dt{^ z>}JzJtpl>{fSmC&1@1gLC{Nfo56%((GT;-S_Jy&hef7Pt1xsHWMnaYmHCC{Xp#*;6Rt649;kd0hyWFN5%`*B?rXeA27=N^@3XWNOA`k$<}msov#!cQ2Je z=UTP0EF;v`=PYWRB)scD*AR6P{05gdbfNcp;)SX2|8N?(tI8Qp;29#>d%YD5_llJ5 z>{cniH+u3RIxm!*lSDTRqAR=oCcImOp6|l4&w6y#mR-r0yRJ#evSsgY8D$8ms6)w| z)45rZ>rsB-59WgOj*ij&G(Hwqrk$inA_l>aJC-8dM1(W}F5 z+MrdvWeLCVWHcxe@Y?x0+!`*QQG|FopRB-xN6?ZN3N{W~Z%CS}@av$b$53i$GkJV1 zdHgK zCiC8n)GTKXim~_JNY4KF>Qw3c#i{deUb;NJN1Mz`FTly?j-H*6Li*q+3hE36Wo~R2 zRFPyd*U<1* faHuoA85~**4m~<@c|CaLX+Xo;)A$e`P-gufr1McK literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/scaffold.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/scaffold.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cc394dba2126a7b4d856b9ec1ac05aa3241f9e6 GIT binary patch literal 34893 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 IJ+KM>FGTz&(f|Me literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/signals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b556c6d565744e011513b7d5330a92f1b0c406e GIT binary patch literal 1759 zcmZ{j&u<$=6vt=n_0Pmv+i~hN&}1={QX|>hrUfbi4WWT!QmGY47Sd|$9orkPcbD0* zQ(Ki9Aufmm$_0~C&M5o~T)1*s;fpmC3DI)sEmh#s6K`$rk`#HQ-I;mwnfGSiyzeim zR1!h^Q~J5t7ZG~uP5c&~41}}q1cU}iLz-ZqwonlSZyYj0mGHP1Duh+yA@aeTmVg?Zjh~x|+8W3|ch*&_(&miIfk(xmy0%BnXkqiiF z1~C^9=^4a)KxAeRses68lD6=bSXu0ais|QG5{m+#!=`C5%yi3ic3_^^!ENH$xJLRJ zM%uQ487Wa>YJ?K4f2m697WEA!ALvVze9<8eD>)2P24LDZ)OAyLnqbNK7Dh1D%|=PH z_RaoM!(!lmvY9-r5!*XSKaXv@W|@pUWDw*WpEp!3|QX8`xuN z)1vY2j3V$si3(?*!(f0OL3y^WAw;jRfZ7Xr;Kine7!>-XY2hEm6Ti$+FT!H}$|K~b z`%9r1-QgKWZ&F?=tYRNqC!D%OG81JSd7h zzK^L1@8EFJ8}aP+G$Q2xv&j-)*z%9`F{Ks-C!*<hHc{GE6SuLZP-0t- za^w2-(l#8Rv|BITwKSr9syiKQ$oE-C(=FLE$@i$WM{3Mby2R`%hF(?d9&1|W&GL;6 z#nGYQp#EC$evaZjU<+*HB$n+SpHtNafqG?BRjCB$$iwGs!0!N!Vsoxk_%&8|5>J1d z`Z{$Q5>mIH&99E~%l{-IiR9@#O6Q&>m%q;qldG<{dIq~tQKTv8c-Uc-M=4<)YW5?n zyk+)^Ii6J2dIwAdqInO_qpW8`*0{iE!kfpchHkb9rCxFHxH>&5k4^?W5RvMOh)+c{ zHK@LbxGy4gDkAQSNcBa;eG$Q?u_#neMBEb*cpHmI4MfDxiRdDKPBH34MErtjEF$iU zNS%skob4YFO~Xa$0{mXa-)~!5#~^p;RhW83;rs-@)36{2zoWual>H4!f1xWcqG*2U zoA(alf8<^t>>lpASKl4xZo4Qmy8OoR+R>U@+!|i~$VHb%*_DBEsJMlj!|bgCX|(v- zVDoU(ee><%;yW%%kMe7S$A^#I^$&*mJ1)wNmgQsVNOG@j4wpZ4(b8z8aI73D?pt?< YE88y0k6sP;>ilB3zoSWEZG63d0lBo`@&Et; literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/templating.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50829a02c818d0e9f84b7cd45a96af39e232f371 GIT binary patch literal 9941 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a553ad1b366a749737e9bcd6ed066749ccec429f GIT binary patch literal 13243 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 Yu1jqXIC?%%ZO#0FOD}!E;lYOUe~4O;G5`Po literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/typing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ae408b82c3055a169003437005f338f6230be0f GIT binary patch literal 3806 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/__pycache__/wrappers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a7420ac5044adf205852e37d4ddcb2973741696 GIT binary patch literal 6108 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/app.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/app.py new file mode 100644 index 0000000..3b6b38d --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/app.py @@ -0,0 +1,2213 @@ +from __future__ import annotations + +import logging +import os +import sys +import typing as t +import weakref +from collections.abc import Iterator as _abc_Iterator +from datetime import timedelta +from inspect import iscoroutinefunction +from itertools import chain +from types import TracebackType +from urllib.parse import quote as _url_quote + +import click +from werkzeug.datastructures import Headers +from werkzeug.datastructures import ImmutableDict +from werkzeug.exceptions import Aborter +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import InternalServerError +from werkzeug.routing import BuildError +from werkzeug.routing import Map +from werkzeug.routing import MapAdapter +from werkzeug.routing import RequestRedirect +from werkzeug.routing import RoutingException +from werkzeug.routing import Rule +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import cached_property +from werkzeug.utils import redirect as _wz_redirect +from werkzeug.wrappers import Response as BaseResponse + +from . import cli +from . import typing as ft +from .config import Config +from .config import ConfigAttribute +from .ctx import _AppCtxGlobals +from .ctx import AppContext +from .ctx import RequestContext +from .globals import _cv_app +from .globals import _cv_request +from .globals import g +from .globals import request +from .globals import request_ctx +from .globals import session +from .helpers import _split_blueprint_path +from .helpers import get_debug_flag +from .helpers import get_flashed_messages +from .helpers import get_load_dotenv +from .json.provider import DefaultJSONProvider +from .json.provider import JSONProvider +from .logging import create_logger +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import find_package +from .scaffold import Scaffold +from .scaffold import setupmethod +from .sessions import SecureCookieSessionInterface +from .sessions import SessionInterface +from .signals import appcontext_tearing_down +from .signals import got_request_exception +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .templating import DispatchingJinjaLoader +from .templating import Environment +from .wrappers import Request +from .wrappers import Response + +if t.TYPE_CHECKING: # pragma: no cover + from .blueprints import Blueprint + from .testing import FlaskClient + from .testing import FlaskCliRunner + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(Scaffold): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class = Response + + #: The class of the object assigned to :attr:`aborter`, created by + #: :meth:`create_aborter`. That object is called by + #: :func:`flask.abort` to raise HTTP errors, and can be + #: called directly as well. + #: + #: Defaults to :class:`werkzeug.exceptions.Aborter`. + #: + #: .. versionadded:: 2.2 + aborter_class = Aborter + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute("SECRET_KEY") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute( + "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta + ) + + json_provider_class: type[JSONProvider] = DefaultJSONProvider + """A subclass of :class:`~flask.json.provider.JSONProvider`. An + instance is created and assigned to :attr:`app.json` when creating + the app. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses + Python's built-in :mod:`json` library. A different provider can use + a different JSON library. + + .. versionadded:: 2.2 + """ + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options: dict = {} + + #: Default configuration parameters. + default_config = ImmutableDict( + { + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "SECRET_KEY": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "SEND_FILE_MAX_AGE_DEFAULT": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: The :meth:`test_client` method creates an instance of this test + #: client class. Defaults to :class:`~flask.testing.FlaskClient`. + #: + #: .. versionadded:: 0.7 + test_client_class: type[FlaskClient] | None = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class: type[FlaskCliRunner] | None = None + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface: SessionInterface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: An instance of :attr:`aborter_class` created by + #: :meth:`make_aborter`. This is called by :func:`flask.abort` + #: to raise HTTP errors, and can be called directly as well. + #: + #: .. versionadded:: 2.2 + #: Moved from ``flask.abort``, which calls this object. + self.aborter = self.make_aborter() + + self.json: JSONProvider = self.json_provider_class(self) + """Provides access to JSON methods. Functions in ``flask.json`` + will call methods on this provider when the application context + is active. Used for handling JSON requests and responses. + + An instance of :attr:`json_provider_class`. Can be customized by + changing that attribute on a subclass, or by assigning to this + attribute afterwards. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, + uses Python's built-in :mod:`json` library. A different provider + can use a different JSON library. + + .. versionadded:: 2.2 + """ + + #: A list of functions that are called by + #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function is called + #: with ``error``, ``endpoint`` and ``values``. If a function + #: returns ``None`` or raises a ``BuildError``, it is skipped. + #: Otherwise, its return value is returned by ``url_for``. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers: list[ + t.Callable[[Exception, str, dict[str, t.Any]], str] + ] = [] + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] + + #: Maps registered blueprint names to blueprint objects. The + #: dict retains the order the blueprints were registered in. + #: Blueprints can be registered multiple times, this dict does + #: not track how often they were attached. + #: + #: .. versionadded:: 0.7 + self.blueprints: dict[str, Blueprint] = {} + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions: dict = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class() + + self.url_map.host_matching = host_matching + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_first_request: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called" + " on the application. It has already handled its first" + " request, any changes will not be applied" + " consistently.\n" + "Make sure all imports, decorators, functions, etc." + " needed to set up the application are done before" + " running it." + ) + + @cached_property + def name(self) -> str: # type: ignore + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @cached_property + def logger(self) -> logging.Logger: + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @cached_property + def jinja_env(self) -> Environment: + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + @property + def got_first_request(self) -> bool: + """This attribute is set to ``True`` if the application started + handling the first request. + + .. deprecated:: 2.3 + Will be removed in Flask 2.4. + + .. versionadded:: 0.8 + """ + import warnings + + warnings.warn( + "'got_first_request' is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) + return self._got_first_request + + def make_config(self, instance_relative: bool = False) -> Config: + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def make_aborter(self) -> Aborter: + """Create the object to assign to :attr:`aborter`. That object + is called by :func:`flask.abort` to raise HTTP errors, and can + be called directly as well. + + By default, this creates an instance of :attr:`aborter_class`, + which defaults to :class:`werkzeug.exceptions.Aborter`. + + .. versionadded:: 2.2 + """ + return self.aborter_class() + + def auto_find_instance_path(self) -> str: + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", f"{self.name}-instance") + + def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + def create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] + + if auto_reload is None: + auto_reload = self.debug + + options["auto_reload"] = auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=self.url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.policies["json.dumps_function"] = self.json.dumps + return rv + + def create_global_jinja_loader(self) -> DispatchingJinjaLoader: + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename: str) -> bool: + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionchanged:: 2.2 + Autoescaping is now enabled by default for ``.svg`` files. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) + + def update_template_context(self, context: dict) -> None: + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + names: t.Iterable[str | None] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(func()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict: + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + @property + def debug(self) -> bool: + """Whether debug mode is enabled. When using ``flask run`` to start the + development server, an interactive debugger will be shown for unhandled + exceptions, and the server will be reloaded when code changes. This maps to the + :data:`DEBUG` config key. It may not behave as expected if set late. + + **Do not enable debug mode when deploying in production.** + + Default: ``False`` + """ + return self.config["DEBUG"] + + @debug.setter + def debug(self, value: bool) -> None: + self.config["DEBUG"] = value + + if self.config["TEMPLATES_AUTO_RELOAD"] is None: + self.jinja_env.auto_reload = value + + def run( + self, + host: str | None = None, + port: int | None = None, + debug: bool | None = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :doc:`/deploying/index` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Ignore this call so that it doesn't start another server if + # the 'flask run' command is used. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + if not is_running_from_reloader(): + click.secho( + " * Ignoring a call to 'app.run()' that would block" + " the current 'flask' CLI command.\n" + " Only call 'app.run()' in an 'if __name__ ==" + ' "__main__"\' guard.', + fg="red", + ) + + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, env var overrides existing value + if "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.debug, self.name) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, host), port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: + """Creates a test client for this application. For information + about unit testing head over to :doc:`/testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) # type: ignore + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 0.7 + """ + blueprint.register(self, options) + + def iter_blueprints(self) -> t.ValuesView[Blueprint]: + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return self.blueprints.values() + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, str): + raise TypeError( + "Allowed methods must be a list of strings, for" + ' example: @app.route(..., methods=["POST"])' + ) + methods = {item.upper() for item in methods} + + # Methods that should always be added + required_methods = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options # type: ignore + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an existing" + f" endpoint function: {endpoint}" + ) + self.view_functions[endpoint] = view_func + + @setupmethod + def template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def teardown_appcontext(self, f: T_teardown) -> T_teardown: + """Registers a function to be called when the application + context is popped. The application context is typically popped + after the request context for each request, at the end of CLI + commands, or after a manually pushed context ends. + + .. code-block:: python + + with app.app_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the app context is + made inactive. Since a request context typically also manages an + application context it would also be called when you pop a + request context. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def shell_context_processor( + self, f: T_shell_context_processor + ) -> T_shell_context_processor: + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + def _find_error_handler(self, e: Exception) -> ft.ErrorHandlerCallable | None: + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + names = (*request.blueprints, None) + + for c in (code, None) if code is not None else (None,): + for name in names: + handler_map = self.error_handler_spec[name][c] + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + return None + + def handle_http_exception( + self, e: HTTPException + ) -> HTTPException | ft.ResponseReturnValue: + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPException`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e) + if handler is None: + return e + return self.ensure_sync(handler)(e) + + def trap_http_exception(self, e: Exception) -> bool: + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def handle_user_exception( + self, e: Exception + ) -> HTTPException | ft.ResponseReturnValue: + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) + propagate = self.config["PROPAGATE_EXCEPTIONS"] + + if propagate is None: + propagate = self.testing or self.debug + + if propagate: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: InternalServerError | ft.ResponseReturnValue + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), + ) -> None: + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def raise_routing_exception(self, request: Request) -> t.NoReturn: + """Intercept routing exceptions and possibly do something else. + + In debug mode, intercept a routing redirect and replace it with + an error if the body will be discarded. + + With modern Werkzeug this shouldn't occur, since it now uses a + 308 status which tells the browser to resend the method and + body. + + .. versionchanged:: 2.1 + Don't intercept 307 and 308 redirects. + + :meta private: + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.routing_exception.code in {307, 308} + or request.method in {"GET", "HEAD", "OPTIONS"} + ): + raise request.routing_exception # type: ignore + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def dispatch_request(self) -> ft.ResponseReturnValue: + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = request_ctx.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule: Rule = req.url_rule # type: ignore[assignment] + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) + + def full_dispatch_request(self) -> Response: + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self._got_first_request = True + + try: + request_started.send(self, _async_wrapper=self.ensure_sync) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request( + self, + rv: ft.ResponseReturnValue | HTTPException, + from_error_handler: bool = False, + ) -> Response: + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send( + self, _async_wrapper=self.ensure_sync, response=response + ) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def make_default_options_response(self) -> Response: + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = request_ctx.url_adapter + methods = adapter.allowed_methods() # type: ignore[union-attr] + rv = self.response_class() + rv.allow.update(methods) + return rv + + def should_ignore_error(self, error: BaseException | None) -> bool: + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def ensure_sync(self, func: t.Callable) -> t.Callable: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + return asgiref_async_to_sync(func) + + def url_for( + self, + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, + ) -> str: + """Generate a URL to the given endpoint with the given values. + + This is called by :func:`flask.url_for`, and can be called + directly as well. + + An *endpoint* is the name of a URL rule, usually added with + :meth:`@app.route() `, and usually the same name as the + view function. A route defined in a :class:`~flask.Blueprint` + will prepend the blueprint's name separated by a ``.`` to the + endpoint. + + In some cases, such as email messages, you want URLs to include + the scheme and domain, like ``https://example.com/hello``. When + not in an active request, URLs will be external by default, but + this requires setting :data:`SERVER_NAME` so Flask knows what + domain to use. :data:`APPLICATION_ROOT` and + :data:`PREFERRED_URL_SCHEME` should also be configured as + needed. This config is only used when not in an active request. + + Functions can be decorated with :meth:`url_defaults` to modify + keyword arguments before the URL is built. + + If building fails for some reason, such as an unknown endpoint + or incorrect values, the app's :meth:`handle_url_build_error` + method is called. If that returns a string, that is returned, + otherwise a :exc:`~werkzeug.routing.BuildError` is raised. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it + is external. + :param _external: If given, prefer the URL to be internal + (False) or require it to be external (True). External URLs + include the scheme and domain. When not in an active + request, URLs are external by default. + :param values: Values to use for the variable parts of the URL + rule. Unknown keys are appended as query string arguments, + like ``?a=b&c=d``. + + .. versionadded:: 2.2 + Moved from ``flask.url_for``, which calls this method. + """ + req_ctx = _cv_request.get(None) + + if req_ctx is not None: + url_adapter = req_ctx.url_adapter + blueprint_name = req_ctx.request.blueprint + + # If the endpoint starts with "." and the request matches a + # blueprint, the endpoint is relative to the blueprint. + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + # When in a request, generate a URL without scheme and + # domain by default, unless a scheme is given. + if _external is None: + _external = _scheme is not None + else: + app_ctx = _cv_app.get(None) + + # If called by helpers.url_for, an app context is active, + # use its url_adapter. Otherwise, app.url_for was called + # directly, build an adapter. + if app_ctx is not None: + url_adapter = app_ctx.url_adapter + else: + url_adapter = self.create_url_adapter(None) + + if url_adapter is None: + raise RuntimeError( + "Unable to build URLs outside an active request" + " without 'SERVER_NAME' configured. Also configure" + " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" + " needed." + ) + + # When outside a request, generate a URL with scheme and + # domain by default. + if _external is None: + _external = True + + # It is an error to set _scheme when _external=False, in order + # to avoid accidental insecure URLs. + if _scheme is not None and not _external: + raise ValueError("When specifying '_scheme', '_external' must be True.") + + self.inject_url_defaults(endpoint, values) + + try: + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + values, + method=_method, + url_scheme=_scheme, + force_external=_external, + ) + except BuildError as error: + values.update( + _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external + ) + return self.handle_url_build_error(error, endpoint, values) + + if _anchor is not None: + _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") + rv = f"{rv}#{_anchor}" + + return rv + + def redirect(self, location: str, code: int = 302) -> BaseResponse: + """Create a redirect response object. + + This is called by :func:`flask.redirect`, and can be called + directly as well. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + + .. versionadded:: 2.2 + Moved from ``flask.redirect``, which calls this method. + """ + return _wz_redirect(location, code=code, Response=self.response_class) + + def make_response(self, rv: ft.ResponseReturnValue) -> Response: + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``list`` + A list that will be jsonify'd before being returned. + + ``generator`` or ``iterator`` + A generator that returns ``str`` or ``bytes`` to be + streamed as the response. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 2.2 + A generator will be converted to a streaming response. + A list will be converted to a JSON response. + + .. versionchanged:: 1.1 + A dict will be converted to a JSON response. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv # type: ignore[misc] + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv # type: ignore[assignment,misc] + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + f"The view function for {request.endpoint!r} did not" + " return a valid response. The function either returned" + " None or ended without a return statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, _abc_Iterator): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class( + rv, + status=status, + headers=headers, # type: ignore[arg-type] + ) + status = headers = None + elif isinstance(rv, (dict, list)): + rv = self.json.response(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type( + rv, request.environ # type: ignore[arg-type] + ) + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it" + f" was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it was a" + f" {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) # type: ignore[arg-type] + + return rv + + def create_url_adapter(self, request: Request | None) -> MapAdapter | None: + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + if not self.subdomain_matching: + subdomain = self.url_map.default_subdomain or None + else: + subdomain = None + + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config["SERVER_NAME"], + subdomain=subdomain, + ) + # We need at the very least the server name to be set for this + # to work. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + def inject_url_defaults(self, endpoint: str, values: dict) -> None: + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + names: t.Iterable[str | None] = (None,) + + # url_for may be called outside a request context, parse the + # passed endpoint instead of using request.blueprints. + if "." in endpoint: + names = chain( + names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) + ) + + for name in names: + if name in self.url_default_functions: + for func in self.url_default_functions[name]: + func(endpoint, values) + + def handle_url_build_error( + self, error: BuildError, endpoint: str, values: dict[str, t.Any] + ) -> str: + """Called by :meth:`.url_for` if a + :exc:`~werkzeug.routing.BuildError` was raised. If this returns + a value, it will be returned by ``url_for``, otherwise the error + will be re-raised. + + Each function in :attr:`url_build_error_handlers` is called with + ``error``, ``endpoint`` and ``values``. If a function returns + ``None`` or raises a ``BuildError``, it is skipped. Otherwise, + its return value is returned by ``url_for``. + + :param error: The active ``BuildError`` being handled. + :param endpoint: The endpoint being built. + :param values: The keyword arguments passed to ``url_for``. + """ + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + except BuildError as e: + # make error available outside except block + error = e + else: + if rv is not None: + return rv + + # Re-raise if called with an active exception, otherwise raise + # the passed in exception. + if error is sys.exc_info()[1]: + raise + + raise error + + def preprocess_request(self) -> ft.ResponseReturnValue | None: + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv + + return None + + def process_response(self, response: Response) -> Response: + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = request_ctx._get_current_object() # type: ignore[attr-defined] + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(response) + + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + + return response + + def do_teardown_request( + self, exc: BaseException | None = _sentinel # type: ignore + ) -> None: + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def do_teardown_appcontext( + self, exc: BaseException | None = _sentinel # type: ignore + ) -> None: + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for func in reversed(self.teardown_appcontext_funcs): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def app_context(self) -> AppContext: + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ: dict) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with app.test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ: dict, start_response: t.Callable) -> t.Any: + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error: BaseException | None = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if "werkzeug.debug.preserve_context" in environ: + environ["werkzeug.debug.preserve_context"](_cv_app.get()) + environ["werkzeug.debug.preserve_context"](_cv_request.get()) + + if error is not None and self.should_ignore_error(error): + error = None + + ctx.pop(error) + + def __call__(self, environ: dict, start_response: t.Callable) -> t.Any: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/blueprints.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/blueprints.py new file mode 100644 index 0000000..0407f86 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/blueprints.py @@ -0,0 +1,626 @@ +from __future__ import annotations + +import os +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from . import typing as ft +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + +DeferredSetupFunction = t.Callable[["BlueprintSetupState"], t.Callable] +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) + + +class BlueprintSetupState: + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__( + self, + blueprint: Blueprint, + app: Flask, + options: t.Any, + first_registration: bool, + ) -> None: + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + self.name = self.options.get("name", blueprint.name) + self.name_prefix = self.options.get("name_prefix", "") + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: t.Callable | None = None, + **options: t.Any, + ) -> None: + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + + self.app.add_url_rule( + rule, + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), + view_func, + defaults=defaults, + **options, + ) + + +class Blueprint(Scaffold): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :doc:`/blueprints` for more information. + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically set + this based on ``import_name``. In certain situations this + automatic detection can fail, so the path can be specified + manually instead. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + """ + + _got_registered_once = False + + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if not name: + raise ValueError("'name' may not be empty.") + + if "." in name: + raise ValueError("'name' may not contain a dot '.' character.") + + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.deferred_functions: list[DeferredSetupFunction] = [] + + if url_defaults is None: + url_defaults = {} + + self.url_values_defaults = url_defaults + self.cli_group = cli_group + self._blueprints: list[tuple[Blueprint, dict]] = [] + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_registered_once: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called on the blueprint" + f" '{self.name}'. It has already been registered at least once, any" + " changes will not be applied consistently.\n" + "Make sure all imports, decorators, functions, etc. needed to set up" + " the blueprint are done before registering it." + ) + + @setupmethod + def record(self, func: t.Callable) -> None: + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + self.deferred_functions.append(func) + + @setupmethod + def record_once(self, func: t.Callable) -> None: + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state: BlueprintSetupState) -> None: + if state.first_registration: + func(state) + + self.record(update_wrapper(wrapper, func)) + + def make_setup_state( + self, app: Flask, options: dict, first_registration: bool = False + ) -> BlueprintSetupState: + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on this blueprint. Keyword + arguments passed to this method will override the defaults set + on the blueprint. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 2.0 + """ + if blueprint is self: + raise ValueError("Cannot register a blueprint on itself") + self._blueprints.append((blueprint, options)) + + def register(self, app: Flask, options: dict) -> None: + """Called by :meth:`Flask.register_blueprint` to register all + views and callbacks registered on the blueprint with the + application. Creates a :class:`.BlueprintSetupState` and calls + each :meth:`record` callback with it. + + :param app: The application this blueprint is being registered + with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + + .. versionchanged:: 2.3 + Nested blueprints now correctly apply subdomains. + + .. versionchanged:: 2.1 + Registering the same blueprint with the same name multiple + times is an error. + + .. versionchanged:: 2.0.1 + Nested blueprints are registered with their dotted name. + This allows different blueprints with the same name to be + nested at different locations. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + """ + name_prefix = options.get("name_prefix", "") + self_name = options.get("name", self.name) + name = f"{name_prefix}.{self_name}".lstrip(".") + + if name in app.blueprints: + bp_desc = "this" if app.blueprints[name] is self else "a different" + existing_at = f" '{name}'" if self_name != name else "" + + raise ValueError( + f"The name '{self_name}' is already registered for" + f" {bp_desc} blueprint{existing_at}. Use 'name=' to" + f" provide a unique name." + ) + + first_bp_registration = not any(bp is self for bp in app.blueprints.values()) + first_name_registration = name not in app.blueprints + + app.blueprints[name] = self + self._got_registered_once = True + state = self.make_setup_state(app, options, first_bp_registration) + + if self.has_static_folder: + state.add_url_rule( + f"{self.static_url_path}/", + view_func=self.send_static_file, + endpoint="static", + ) + + # Merge blueprint data into parent. + if first_bp_registration or first_name_registration: + + def extend(bp_dict, parent_dict): + for key, values in bp_dict.items(): + key = name if key is None else f"{name}.{key}" + parent_dict[key].extend(values) + + for key, value in self.error_handler_spec.items(): + key = name if key is None else f"{name}.{key}" + value = defaultdict( + dict, + { + code: { + exc_class: func for exc_class, func in code_values.items() + } + for code, code_values in value.items() + }, + ) + app.error_handler_spec[key] = value + + for endpoint, func in self.view_functions.items(): + app.view_functions[endpoint] = func + + extend(self.before_request_funcs, app.before_request_funcs) + extend(self.after_request_funcs, app.after_request_funcs) + extend( + self.teardown_request_funcs, + app.teardown_request_funcs, + ) + extend(self.url_default_functions, app.url_default_functions) + extend(self.url_value_preprocessors, app.url_value_preprocessors) + extend(self.template_context_processors, app.template_context_processors) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if self.cli.commands: + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + for blueprint, bp_options in self._blueprints: + bp_options = bp_options.copy() + bp_url_prefix = bp_options.get("url_prefix") + bp_subdomain = bp_options.get("subdomain") + + if bp_subdomain is None: + bp_subdomain = blueprint.subdomain + + if state.subdomain is not None and bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + "." + state.subdomain + elif bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + elif state.subdomain is not None: + bp_options["subdomain"] = state.subdomain + + if bp_url_prefix is None: + bp_url_prefix = blueprint.url_prefix + + if state.url_prefix is not None and bp_url_prefix is not None: + bp_options["url_prefix"] = ( + state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") + ) + elif bp_url_prefix is not None: + bp_options["url_prefix"] = bp_url_prefix + elif state.url_prefix is not None: + bp_options["url_prefix"] = state.url_prefix + + bp_options["name_prefix"] = name + blueprint.register(app, bp_options) + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for + full documentation. + + The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, + used with :func:`url_for`, is prefixed with the blueprint's name. + """ + if endpoint and "." in endpoint: + raise ValueError("'endpoint' may not contain a dot '.' character.") + + if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: + raise ValueError("'view_func' name may not contain a dot '.' character.") + + self.record( + lambda s: s.add_url_rule( + rule, + endpoint, + view_func, + provide_automatic_options=provide_automatic_options, + **options, + ) + ) + + @setupmethod + def app_template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """Register a template filter, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_app_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a template filter, available in any template rendered by the + application. Works like the :meth:`app_template_filter` decorator. Equivalent to + :meth:`.Flask.add_template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """Register a template test, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_app_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a template test, available in any template rendered by the + application. Works like the :meth:`app_template_test` decorator. Equivalent to + :meth:`.Flask.add_template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """Register a template global, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_app_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a template global, available in any template rendered by the + application. Works like the :meth:`app_template_global` decorator. Equivalent to + :meth:`.Flask.add_template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def before_app_request(self, f: T_before_request) -> T_before_request: + """Like :meth:`before_request`, but before every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.before_request`. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def after_app_request(self, f: T_after_request) -> T_after_request: + """Like :meth:`after_request`, but after every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.after_request`. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def teardown_app_request(self, f: T_teardown) -> T_teardown: + """Like :meth:`teardown_request`, but after every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_context_processor( + self, f: T_template_context_processor + ) -> T_template_context_processor: + """Like :meth:`context_processor`, but for templates rendered by every view, not + only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_errorhandler( + self, code: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Like :meth:`errorhandler`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.errorhandler`. + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + + return decorator + + @setupmethod + def app_url_value_preprocessor( + self, f: T_url_value_preprocessor + ) -> T_url_value_preprocessor: + """Like :meth:`url_value_preprocessor`, but for every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Like :meth:`url_defaults`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.url_defaults`. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/cli.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/cli.py new file mode 100644 index 0000000..f7e1f29 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/cli.py @@ -0,0 +1,1067 @@ +from __future__ import annotations + +import ast +import inspect +import os +import platform +import re +import sys +import traceback +import typing as t +from functools import update_wrapper +from operator import itemgetter + +import click +from click.core import ParameterSource +from werkzeug import run_simple +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_load_dotenv + +if t.TYPE_CHECKING: + from .app import Flask + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify the correct one." + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = app_factory() + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory '{attr_name}' in module '{module.__name__}'," + " but could not call it without arguments. Use" + f" '{module.__name__}:{attr_name}(args)'" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify one." + ) + + +def _called_with_wrong_args(f): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(module, app_name): + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = [] + kwargs = {} + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.keywords} + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = attr(*args, **kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +def locate_app(module_name, app_name, raise_if_not_found=True): + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[2].tb_next: + raise NoAppException( + f"While importing {module_name!r}, an ImportError was" + f" raised:\n\n{traceback.format_exc()}" + ) from None + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from None + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(module) + else: + return find_app_by_string(module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + + import werkzeug + from . import __version__ + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {__version__}\n" + f"Werkzeug {werkzeug.__version__}", + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the Flask version.", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class ScriptInfo: + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__( + self, + app_import_path: str | None = None, + create_app: t.Callable[..., Flask] | None = None, + set_debug_flag: bool = True, + ) -> None: + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data: dict[t.Any, t.Any] = {} + self.set_debug_flag = set_debug_flag + self._loaded_app: Flask | None = None + + def load_app(self) -> Flask: + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + if self._loaded_app is not None: + return self._loaded_app + + if self.create_app is not None: + app = self.create_app() + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, 1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(import_name, None, raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + "Could not locate a Flask application. Use the" + " 'flask --app' option, 'FLASK_APP' environment" + " variable, or a 'wsgi.py' or 'app.py' file in the" + " current directory." + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. + + Custom commands (and their options) registered under ``app.cli`` or + ``blueprint.cli`` will always have an app context available, this + decorator is not required in that case. + + .. versionchanged:: 2.2 + The app context is active for subcommands as well as the + decorated callback. The app context is always available to + ``app.cli`` command and parameter callbacks. + """ + + @click.pass_context + def decorator(__ctx, *args, **kwargs): + if not current_app: + app = __ctx.ensure_object(ScriptInfo).load_app() + __ctx.with_resource(app.app_context()) + + return __ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return click.Group.group(self, *args, **kwargs) + + +def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: + if value is None: + return None + + info = ctx.ensure_object(ScriptInfo) + info.app_import_path = value + return value + + +# This option is eager so the app will be available if --help is given. +# --help is also eager, so --app must be before it in the param list. +# no_args_is_help bypasses eager processing, so this option must be +# processed manually in that case to ensure FLASK_APP gets picked up. +_app_option = click.Option( + ["-A", "--app"], + metavar="IMPORT", + help=( + "The Flask application or factory function to load, in the form 'module:name'." + " Module can be a dotted import or file path. Name is not required if it is" + " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" + " pass arguments." + ), + is_eager=True, + expose_value=False, + callback=_set_app, +) + + +def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: + # If the flag isn't provided, it will default to False. Don't use + # that, let debug be set by env in that case. + source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] + + if source is not None and source in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ): + return None + + # Set with env var instead of ScriptInfo.load so that it can be + # accessed early during a factory function. + os.environ["FLASK_DEBUG"] = "1" if value else "0" + return value + + +_debug_option = click.Option( + ["--debug/--no-debug"], + help="Set debug mode.", + expose_value=False, + callback=_set_debug, +) + + +def _env_file_callback( + ctx: click.Context, param: click.Option, value: str | None +) -> str | None: + if value is None: + return None + + import importlib + + try: + importlib.import_module("dotenv") + except ImportError: + raise click.BadParameter( + "python-dotenv must be installed to load an env file.", + ctx=ctx, + param=param, + ) from None + + # Don't check FLASK_SKIP_DOTENV, that only disables automatically + # loading .env and .flaskenv files. + load_dotenv(value) + return value + + +# This option is eager so env vars are loaded as early as possible to be +# used by other options. +_env_file_option = click.Option( + ["-e", "--env-file"], + type=click.Path(exists=True, dir_okay=False), + help="Load environment variables from this file. python-dotenv must be installed.", + is_eager=True, + expose_value=False, + callback=_env_file_callback, +) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag. + + .. versionchanged:: 2.2 + Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. + + .. versionchanged:: 2.2 + An app context is pushed when running ``app.cli`` commands, so + ``@with_appcontext`` is no longer required for those commands. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands: bool = True, + create_app: t.Callable[..., Flask] | None = None, + add_version_option: bool = True, + load_dotenv: bool = True, + set_debug_flag: bool = True, + **extra: t.Any, + ) -> None: + params = list(extra.pop("params", None) or ()) + # Processing is done with option callbacks instead of a group + # callback. This allows users to make a custom group callback + # without losing the behavior. --env-file must come first so + # that it is eagerly evaluated before --app. + params.extend((_env_file_option, _app_option, _debug_option)) + + if add_version_option: + params.append(version_option) + + if "context_settings" not in extra: + extra["context_settings"] = {} + + extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") + + super().__init__(params=params, **extra) + + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + + if sys.version_info >= (3, 10): + from importlib import metadata + else: + # Use a backport on Python < 3.10. We technically have + # importlib.metadata on 3.8+, but the API changed in 3.10, + # so use the backport for consistency. + import importlib_metadata as metadata + + for ep in metadata.entry_points(group="flask.commands"): + self.add_command(ep.load(), ep.name) + + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + app = info.load_app() + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + return None + + # Push an app context for the loaded app unless it is already + # active somehow. This makes the context available to parameter + # and command callbacks without needing @with_appcontext. + if not current_app or current_app._get_current_object() is not app: + ctx.with_resource(app.app_context()) + + return app.cli.get_command(ctx, name) + + def list_commands(self, ctx): + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: click.Context | None = None, + **extra: t.Any, + ) -> click.Context: + # Set a flag to tell app.run to become a no-op. If app.run was + # not in a __name__ == __main__ guard, it would start the server + # when importing, blocking whatever command is being called. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + # Attempt to load .env and .flask env files. The --env-file + # option can cause another file to be loaded. + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + if "obj" not in extra and "obj" not in self.context_settings: + extra["obj"] = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + return super().make_context(info_name, args, parent=parent, **extra) + + def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help: + # Attempt to load --env-file and --app early in case they + # were given as env vars. Otherwise no_args_is_help will not + # see commands from app.cli. + _env_file_option.handle_parse_result(ctx, {}, []) + _app_option.handle_parse_result(ctx, {}, []) + + return super().parse_args(ctx, args) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv(path: str | os.PathLike | None = None) -> bool: + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionchanged:: 2.0 + The current directory is not changed to the location of the + loaded file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + try: + import dotenv + except ImportError: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # Always return after attempting to load a given path, don't load + # the default files. + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path, encoding="utf-8") + + return False + + loaded = False + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + dotenv.load_dotenv(path, encoding="utf-8") + loaded = True + + return loaded # True if at least one file was located and loaded. + + +def show_server_banner(debug, app_import_path): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if is_running_from_reloader(): + return + + if app_import_path is not None: + click.echo(f" * Serving Flask app '{app_import_path}'") + + if debug is not None: + click.echo(f" * Debug mode: {'on' if debug else 'off'}") + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self): + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + try: + import ssl + except ImportError: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) from None + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + + try: + import ssl + except ImportError: + is_context = False + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert(self, value, param, ctx): + items = self.split_envvar_value(value) + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", + type=CertParamType(), + help="Specify a certificate file to use HTTPS.", + is_eager=True, +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@click.option( + "--exclude-patterns", + default=None, + type=SeparatedPathType(), + help=( + "Files matching these fnmatch patterns will not trigger a reload" + " on change. Multiple patterns are separated by" + f" {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info, + host, + port, + reload, + debugger, + with_threads, + cert, + extra_files, + exclude_patterns, +): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default with the '--debug' + option. + """ + try: + app = info.load_app() + except Exception as e: + if is_running_from_reloader(): + # When reloading, print out the error immediately, but raise + # it later so the debugger or server can handle it. + traceback.print_exc() + err = e + + def app(environ, start_response): + raise err from None + + else: + # When not reloading, raise the error immediately so the + # command fails. + raise e from None + + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(debug, info.app_import_path) + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + ) + + +run_command.params.insert(0, _debug_option) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {current_app.import_name}\n" + f"Instance: {current_app.instance_path}" + ) + ctx: dict = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(current_app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), + default="endpoint", + help=( + "Method to sort routes by. 'match' is the order that Flask will match routes" + " when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort: str, all_methods: bool) -> None: + """Show all registered routes with endpoints and methods.""" + rules = list(current_app.url_map.iter_rules()) + + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} + host_matching = current_app.url_map.host_matching + has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) + rows = [] + + for rule in rules: + row = [ + rule.endpoint, + ", ".join(sorted((rule.methods or set()) - ignored_methods)), + ] + + if has_domain: + row.append((rule.host if host_matching else rule.subdomain) or "") + + row.append(rule.rule) + rows.append(row) + + headers = ["Endpoint", "Methods"] + sorts = ["endpoint", "methods"] + + if has_domain: + headers.append("Host" if host_matching else "Subdomain") + sorts.append("domain") + + headers.append("Rule") + sorts.append("rule") + + try: + rows.sort(key=itemgetter(sorts.index(sort))) + except ValueError: + pass + + rows.insert(0, headers) + widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] + rows.insert(1, ["-" * w for w in widths]) + template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) + + for row in rows: + click.echo(template.format(*row)) + + +cli = FlaskGroup( + name="flask", + help="""\ +A general utility script for Flask applications. + +An application to load must be given with the '--app' option, +'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file +in the current directory. +""", +) + + +def main() -> None: + cli.main() + + +if __name__ == "__main__": + main() diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/config.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/config.py new file mode 100644 index 0000000..a73dd78 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/config.py @@ -0,0 +1,345 @@ +from __future__ import annotations + +import errno +import json +import os +import types +import typing as t + +from werkzeug.utils import import_string + + +class ConfigAttribute: + """Makes an attribute forward to the config""" + + def __init__(self, name: str, get_converter: t.Callable | None = None) -> None: + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj: t.Any, owner: t.Any = None) -> t.Any: + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj: t.Any, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__(self, root_path: str, defaults: dict | None = None) -> None: + super().__init__(defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_prefixed_env( + self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads + ) -> bool: + """Load any environment variables that start with ``FLASK_``, + dropping the prefix from the env key for the config key. Values + are passed through a loading function to attempt to convert them + to more specific types than strings. + + Keys are loaded in :func:`sorted` order. + + The default loading function attempts to parse values as any + valid JSON type, including dicts and lists. + + Specific items in nested dicts can be set by separating the + keys with double underscores (``__``). If an intermediate key + doesn't exist, it will be initialized to an empty dict. + + :param prefix: Load env vars that start with this prefix, + separated with an underscore (``_``). + :param loads: Pass each string value to this function and use + the returned value as the config value. If any error is + raised it is ignored and the value remains a string. The + default is :func:`json.loads`. + + .. versionadded:: 2.1 + """ + prefix = f"{prefix}_" + len_prefix = len(prefix) + + for key in sorted(os.environ): + if not key.startswith(prefix): + continue + + value = os.environ[key] + + try: + value = loads(value) + except Exception: + # Keep the value as a string if loading failed. + pass + + # Change to key.removeprefix(prefix) on Python >= 3.9. + key = key[len_prefix:] + + if "__" not in key: + # A non-nested key, set directly. + self[key] = value + continue + + # Traverse nested dictionaries with keys separated by "__". + current = self + *parts, tail = key.split("__") + + for part in parts: + # If an intermediate dict does not exist, create it. + if part not in current: + current[part] = {} + + current = current[part] + + current[tail] = value + + return True + + def from_pyfile(self, filename: str, silent: bool = False) -> bool: + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: object | str) -> None: + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str, + load: t.Callable[[t.IO[t.Any]], t.Mapping], + silent: bool = False, + text: bool = True, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import json + app.config.from_file("config.json", load=json.load) + + import tomllib + app.config.from_file("config.toml", load=tomllib.load, text=False) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :param text: Open the file in text or binary mode. + :return: ``True`` if the file was loaded successfully. + + .. versionchanged:: 2.3 + The ``text`` parameter was added. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename, "r" if text else "rb") as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_mapping( + self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with + non-upper keys. + + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> dict[str, t.Any]: + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in self.items(): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/ctx.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/ctx.py new file mode 100644 index 0000000..b37e4e0 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/ctx.py @@ -0,0 +1,440 @@ +from __future__ import annotations + +import contextvars +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from . import typing as ft +from .globals import _cv_app +from .globals import _cv_request +from .signals import appcontext_popped +from .signals import appcontext_pushed + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Any | None = None) -> t.Any: + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raising a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name: str, default: t.Any = None) -> t.Any: + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + ctx = _cv_app.get(None) + if ctx is not None: + return f"" + return object.__repr__(self) + + +def after_this_request(f: ft.AfterRequestCallable) -> ft.AfterRequestCallable: + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'after_this_request' can only be used when a request" + " context is active, such as in a view function." + ) + + ctx._after_request_functions.append(f) + return f + + +def copy_current_request_context(f: t.Callable) -> t.Callable: + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'copy_current_request_context' can only be used when a" + " request context is active, such as in a view function." + ) + + ctx = ctx.copy() + + def wrapper(*args, **kwargs): + with ctx: + return ctx.app.ensure_sync(f)(*args, **kwargs) + + return update_wrapper(wrapper, f) + + +def has_request_context() -> bool: + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _cv_request.get(None) is not None + + +def has_app_context() -> bool: + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _cv_app.get(None) is not None + + +class AppContext: + """The app context contains application-specific information. An app + context is created and pushed at the beginning of each request if + one is not already active. An app context is also pushed when + running CLI commands. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g: _AppCtxGlobals = app.app_ctx_globals_class() + self._cv_tokens: list[contextvars.Token] = [] + + def push(self) -> None: + """Binds the app context to the current context.""" + self._cv_tokens.append(_cv_app.set(self)) + appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + if len(self._cv_tokens) == 1: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + ctx = _cv_app.get() + _cv_app.reset(self._cv_tokens.pop()) + + if ctx is not self: + raise AssertionError( + f"Popped wrong app context. ({ctx!r} instead of {self!r})" + ) + + appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) + + def __enter__(self) -> AppContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains per-request information. The Flask + app creates and pushes it at the beginning of the request, then pops + it at the end of the request. It will create the URL adapter and + request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the + request. When using the interactive debugger, the context will be + restored so ``request`` is still accessible. Similarly, the test + client can preserve the context after the request ends. However, + teardown functions may already have closed some resources such as + database connections. + """ + + def __init__( + self, + app: Flask, + environ: dict, + request: Request | None = None, + session: SessionMixin | None = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + request.json_module = app.json + self.request: Request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes: list[tuple[str, str]] | None = None + self.session: SessionMixin | None = session + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions: list[ft.AfterRequestCallable] = [] + + self._cv_tokens: list[tuple[contextvars.Token, AppContext | None]] = [] + + def copy(self) -> RequestContext: + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _cv_app.get(None) + + if app_ctx is None or app_ctx.app is not self.app: + app_ctx = self.app.app_context() + app_ctx.push() + else: + app_ctx = None + + self._cv_tokens.append((_cv_request.set(self), app_ctx)) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + clear_request = len(self._cv_tokens) == 1 + + try: + if clear_request: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + finally: + ctx = _cv_request.get() + token, app_ctx = self._cv_tokens.pop() + _cv_request.reset(token) + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + ctx.request.environ["werkzeug.request"] = None + + if app_ctx is not None: + app_ctx.pop(exc) + + if ctx is not self: + raise AssertionError( + f"Popped wrong request context. ({ctx!r} instead of {self!r})" + ) + + def __enter__(self) -> RequestContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/debughelpers.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..6061441 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/debughelpers.py @@ -0,0 +1,160 @@ +from __future__ import annotations + +import typing as t + +from .app import Flask +from .blueprints import Blueprint +from .globals import request_ctx + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} instead of" + " 'multipart/form-data' which means that no file contents" + " were transmitted. To fix this error you should provide" + ' enctype="multipart/form-data" in your form.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised in debug mode if a routing redirect + would cause the browser to drop the method or body. This happens + when method is not GET, HEAD or OPTIONS and the status code is not + 307 or 308. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = [ + f"A request was sent to '{request.url}', but routing issued" + f" a redirect to the canonical URL '{exc.new_url}'." + ] + + if f"{request.base_url}/" == exc.new_url.partition("?")[0]: + buf.append( + " The URL was defined with a trailing slash. Flask" + " will redirect to the URL with a trailing slash if it" + " was accessed without one." + ) + + buf.append( + " Send requests to the canonical URL, or use 307 or 308 for" + " routing redirects. Otherwise, browsers will drop form" + " data.\n\n" + "This exception is only raised in debug mode." + ) + super().__init__("".join(buf)) + + +def attach_enctype_error_multidict(request): + """Patch ``request.files.__getitem__`` to raise a descriptive error + about ``enctype=multipart/form-data``. + + :param request: The request to patch. + :meta private: + """ + oldcls = request.files.__class__ + + class newcls(oldcls): + def __getitem__(self, key): + try: + return super().__getitem__(key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key).with_traceback( + e.__traceback__ + ) from None + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader) -> t.Generator: + yield f"class: {type(loader).__module__}.{type(loader).__name__}" + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, str) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts(app: Flask, template, attempts) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + if request_ctx and request_ctx.request.blueprint is not None: + blueprint = request_ctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, Flask): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {detail}") + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that belongs" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/globals.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/globals.py new file mode 100644 index 0000000..e9cd4ac --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/globals.py @@ -0,0 +1,96 @@ +from __future__ import annotations + +import typing as t +from contextvars import ContextVar + +from werkzeug.local import LocalProxy + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .ctx import _AppCtxGlobals + from .ctx import AppContext + from .ctx import RequestContext + from .sessions import SessionMixin + from .wrappers import Request + + +class _FakeStack: + def __init__(self, name: str, cv: ContextVar[t.Any]) -> None: + self.name = name + self.cv = cv + + @property + def top(self) -> t.Any | None: + import warnings + + warnings.warn( + f"'_{self.name}_ctx_stack' is deprecated and will be removed in Flask 2.4." + f" Use 'g' to store data, or '{self.name}_ctx' to access the current" + " context.", + DeprecationWarning, + stacklevel=2, + ) + return self.cv.get(None) + + +_no_app_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +the current application. To solve this, set up an application context +with app.app_context(). See the documentation for more information.\ +""" +_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") +__app_ctx_stack = _FakeStack("app", _cv_app) +app_ctx: AppContext = LocalProxy( # type: ignore[assignment] + _cv_app, unbound_message=_no_app_msg +) +current_app: Flask = LocalProxy( # type: ignore[assignment] + _cv_app, "app", unbound_message=_no_app_msg +) +g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] + _cv_app, "g", unbound_message=_no_app_msg +) + +_no_req_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") +__request_ctx_stack = _FakeStack("request", _cv_request) +request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] + _cv_request, unbound_message=_no_req_msg +) +request: Request = LocalProxy( # type: ignore[assignment] + _cv_request, "request", unbound_message=_no_req_msg +) +session: SessionMixin = LocalProxy( # type: ignore[assignment] + _cv_request, "session", unbound_message=_no_req_msg +) + + +def __getattr__(name: str) -> t.Any: + if name == "_app_ctx_stack": + import warnings + + warnings.warn( + "'_app_ctx_stack' is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) + return __app_ctx_stack + + if name == "_request_ctx_stack": + import warnings + + warnings.warn( + "'_request_ctx_stack' is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) + return __request_ctx_stack + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/helpers.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/helpers.py new file mode 100644 index 0000000..61a0f81 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/helpers.py @@ -0,0 +1,693 @@ +from __future__ import annotations + +import os +import pkgutil +import socket +import sys +import typing as t +import warnings +from datetime import datetime +from functools import lru_cache +from functools import update_wrapper +from threading import RLock + +import werkzeug.utils +from werkzeug.exceptions import abort as _wz_abort +from werkzeug.utils import redirect as _wz_redirect + +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .globals import request_ctx +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.wrappers import Response as BaseResponse + from .wrappers import Response + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated by the + :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. + """ + val = os.environ.get("FLASK_DEBUG") + return bool(val and val.lower() not in {"0", "false", "no"}) + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading default dotenv files by + setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load + the files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +def stream_with_context( + generator_or_function: ( + t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]] + ) +) -> t.Iterator[t.AnyStr]: + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) # type: ignore + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore + + def generator() -> t.Generator: + ctx = _cv_request.get(None) + if ctx is None: + raise RuntimeError( + "'stream_with_context' can only be used when a request" + " context is active, such as in a view function." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + yield from gen + finally: + if hasattr(gen, "close"): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args: t.Any) -> Response: + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) # type: ignore + + +def url_for( + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, +) -> str: + """Generate a URL to the given endpoint with the given values. + + This requires an active request or application context, and calls + :meth:`current_app.url_for() `. See that method + for full documentation. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it is + external. + :param _external: If given, prefer the URL to be internal (False) or + require it to be external (True). External URLs include the + scheme and domain. When not in an active request, URLs are + external by default. + :param values: Values to use for the variable parts of the URL rule. + Unknown keys are appended as query string arguments, like + ``?a=b&c=d``. + + .. versionchanged:: 2.2 + Calls ``current_app.url_for``, allowing an app to override the + behavior. + + .. versionchanged:: 0.10 + The ``_scheme`` parameter was added. + + .. versionchanged:: 0.9 + The ``_anchor`` and ``_method`` parameters were added. + + .. versionchanged:: 0.9 + Calls ``app.handle_url_build_error`` on build errors. + """ + return current_app.url_for( + endpoint, + _anchor=_anchor, + _method=_method, + _scheme=_scheme, + _external=_external, + **values, + ) + + +def redirect( + location: str, code: int = 302, Response: type[BaseResponse] | None = None +) -> BaseResponse: + """Create a redirect response object. + + If :data:`~flask.current_app` is available, it will use its + :meth:`~flask.Flask.redirect` method, otherwise it will use + :func:`werkzeug.utils.redirect`. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + :param Response: The response class to use. Not used when + ``current_app`` is active, which uses ``app.response_class``. + + .. versionadded:: 2.2 + Calls ``current_app.redirect`` if available instead of always + using Werkzeug's default ``redirect``. + """ + if current_app: + return current_app.redirect(location, code=code) + + return _wz_redirect(location, code=code, Response=Response) + + +def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given + status code. + + If :data:`~flask.current_app` is available, it will call its + :attr:`~flask.Flask.aborter` object, otherwise it will use + :func:`werkzeug.exceptions.abort`. + + :param code: The status code for the exception, which must be + registered in ``app.aborter``. + :param args: Passed to the exception. + :param kwargs: Passed to the exception. + + .. versionadded:: 2.2 + Calls ``current_app.aborter`` if available instead of always + using Werkzeug's default ``abort``. + """ + if current_app: + current_app.aborter(code, *args, **kwargs) + + _wz_abort(code, *args, **kwargs) + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message: str, category: str = "message") -> None: + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + app = current_app._get_current_object() # type: ignore + message_flashed.send( + app, + _async_wrapper=app.ensure_sync, + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> list[str] | list[tuple[str, str]]: + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :doc:`/patterns/flashing` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = request_ctx.flashes + if flashes is None: + flashes = session.pop("_flashes") if "_flashes" in session else [] + request_ctx.flashes = flashes + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: + if kwargs.get("max_age") is None: + kwargs["max_age"] = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + use_x_sendfile=current_app.config["USE_X_SENDFILE"], + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: os.PathLike | str | t.BinaryIO, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + deprecated because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( # type: ignore[return-value] + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + conditional=conditional, + etag=etag, + last_modified=last_modified, + max_age=max_age, + ) + ) + + +def send_from_directory( + directory: os.PathLike | str, + path: os.PathLike | str, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under, + relative to the current application's root path. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + return werkzeug.utils.send_from_directory( # type: ignore[return-value] + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + + if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + loader = pkgutil.get_loader(import_name) + + # Loader does not exist or we're referring to an unloaded main + # module or a main module without path (interactive sessions), go + # with the current working directory. + if loader is None or import_name == "__main__": + return os.getcwd() + + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. This can happen because the module" + " came from an import hook that does not provide file" + " name information or because it's a namespace package." + " In this case the root path needs to be explicitly" + " provided." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +class locked_cached_property(werkzeug.utils.cached_property): + """A :func:`property` that is only evaluated once. Like + :class:`werkzeug.utils.cached_property` except access uses a lock + for thread safety. + + .. deprecated:: 2.3 + Will be removed in Flask 2.4. Use a lock inside the decorated function if + locking is needed. + + .. versionchanged:: 2.0 + Inherits from Werkzeug's ``cached_property`` (and ``property``). + """ + + def __init__( + self, + fget: t.Callable[[t.Any], t.Any], + name: str | None = None, + doc: str | None = None, + ) -> None: + import warnings + + warnings.warn( + "'locked_cached_property' is deprecated and will be removed in Flask 2.4." + " Use a lock inside the decorated function if locking is needed.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(fget, name=name, doc=doc) + self.lock = RLock() + + def __get__(self, obj: object, type: type = None) -> t.Any: # type: ignore + if obj is None: + return self + + with self.lock: + return super().__get__(obj, type=type) + + def __set__(self, obj: object, value: t.Any) -> None: + with self.lock: + super().__set__(obj, value) + + def __delete__(self, obj: object) -> None: + with self.lock: + super().__delete__(obj) + + +def is_ip(value: str) -> bool: + """Determine if the given string is an IP address. + + :param value: value to check + :type value: str + + :return: True if string is an IP address + :rtype: bool + + .. deprecated:: 2.3 + Will be removed in Flask 2.4. + """ + warnings.warn( + "The 'is_ip' function is deprecated and will be removed in Flask 2.4.", + DeprecationWarning, + stacklevel=2, + ) + + for family in (socket.AF_INET, socket.AF_INET6): + try: + socket.inet_pton(family, value) + except OSError: + pass + else: + return True + + return False + + +@lru_cache(maxsize=None) +def _split_blueprint_path(name: str) -> list[str]: + out: list[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__init__.py new file mode 100644 index 0000000..f15296f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__init__.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import json as _json +import typing as t + +from ..globals import current_app +from .provider import _default + +if t.TYPE_CHECKING: # pragma: no cover + from ..wrappers import Response + + +def dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dumps() ` + method, otherwise it will use :func:`json.dumps`. + + :param obj: The data to serialize. + :param kwargs: Arguments passed to the ``dumps`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dumps``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.dumps(obj, **kwargs) + + kwargs.setdefault("default", _default) + return _json.dumps(obj, **kwargs) + + +def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dump() ` + method, otherwise it will use :func:`json.dump`. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: Arguments passed to the ``dump`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dump``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, will be + removed in Flask 2.1. + """ + if current_app: + current_app.json.dump(obj, fp, **kwargs) + else: + kwargs.setdefault("default", _default) + _json.dump(obj, fp, **kwargs) + + +def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.loads() ` + method, otherwise it will use :func:`json.loads`. + + :param s: Text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``loads`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.loads``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The data must be a + string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.loads(s, **kwargs) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.load() ` + method, otherwise it will use :func:`json.load`. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``load`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.load``, allowing an app to override + the behavior. + + .. versionchanged:: 2.2 + The ``app`` parameter will be removed in Flask 2.3. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The file must be text + mode, or binary mode with UTF-8 bytes. + """ + if current_app: + return current_app.json.load(fp, **kwargs) + + return _json.load(fp, **kwargs) + + +def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. A dict or list returned from a view will be converted to a + JSON response automatically without needing to call this. + + This requires an active request or application context, and calls + :meth:`app.json.response() `. + + In debug mode, the output is formatted with indentation to make it + easier to read. This may also be controlled by the provider. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + + .. versionchanged:: 2.2 + Calls ``current_app.json.response``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 0.11 + Added support for serializing top-level arrays. This was a + security risk in ancient browsers. See :ref:`security-json`. + + .. versionadded:: 0.2 + """ + return current_app.json.response(*args, **kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..224a415133f7f1845442fdd668fa59f1528006c7 GIT binary patch literal 6719 zcmd5=&u<&Y72c&NX)Ri!?Zk~^*YPBlin5iKk{r7MV>mJVBXx_~L8PXwih>++htf*R zU1oMEm4;CSMS#LRG`>YgAB@07f&LLiZ@q{}00FEG7)^Wdt$@;tPyOBucS-$-D!WQx z0-T-QnR)Z(&6{t&_x?6KJY?YakL+I-{(96fzMz-*m(mq;<0Di)F&x7&J)>sMnI_d! zUTUsSJ=1gjPM?$Z25N(IgJ|n_20W{FVD5lvi2lVFV{zT596cM$!D9qXg? z+^{p^9KdtL$vQ)LW}QP$2G2vzVdo&8hnuO~k;fz?XSOrk_k)N>Zs3R4ACsc=vC@!I z_)(G9>yJ(S%_=&g${SvUcI!P6)-ga-s4@QaqmnTUbK_G~J~5*ByCGSW^jqxMB56cr zG2Q#7>$i-m=^D4pd*&a^89WyUxA$?($cn%IDYmf@K?nW&-*R&)ezngqW`uOP=iU^| z;Spy%WIvj@aorvoV)$LFvI2cBlzvn7c(`Qu7^lSCknv^idc5q3app#B#q~Va2nFh) z8egc1XrWMoDec8D@NK72tB2psvGZD*`c{|0vg-(G)4cD-FRJH-l9EC~0%x2B(SndG zu9DxKt59wDl|rd2ztmB_Q0J1@SWsRpu-S#q`l5h^@rrG&qwcn}!sUEeU>D_lqlWzt zS)GTWa2Q5lUREk8l}cE4t?mixqCBTFnQgOWAw#%QWr6$i!YLHkw0%a+K$av0N@NHK zP!ozsNVWoVOHm7!g|n-i=|s*Y?s*|3^=w3sX-lPXh7Q4s>(4XpGt5W&L%x)-aUz8l zR2B<-*$w2b6HnURsS6djKv*a_qT<%LXJ6J&qKvrj49aoA<OxBH9KoJ+O);GOLO?Ry~|W5%8|^9w;uv8SfrHtO8mM9zmGB)D9~%ETXIL*h$R1zMo@!-Jt!Kwt*|EEo zR`&J#@1t0=UVoGxT2CKsrH|fm?;ZO*{k;d7Lm$6+`^`IHD>JrQMX{D1+khye(u;oy zV*VK|n-KH0XF<$cW;F%OOc7?9Ml*FQwSTC&Rd%kAn_r2Xa2$uNNLX7tf7SIw$5p=$ zG~F|pJ`^qqo2-Rop>WTY%v0m z1#x1RaX&eoYl*P51MGW4?B^P=_aCnl8~!XdHz9D@^|@@SEx`o=2PKe?HR zF*gy^xu3RRFYSXQ)^|Op5l<5JXr~GAB%y}_Iyr(`u1{vEEmf_{L#Tu}I|dCujHe`K zr;0o^T|oiJu?cdl7uKy~E$i62b+TohT&>)lZdsG}zxA0l`N$esw_a{pFR$kA{rq#w zeqarMJal{L&Y9Iz%L3+nW{t@skW@*i7hV#;xrvuefb)M-v?w8Hd!St=AAtcbi-d-J z6U564xU)CnrFuR!Sg283&;n#?maa^keRaG+4I&XfCF#8ev4J$rCA>e{I_b)xHyN{pRUYF0ELT#*ltxRSg}fwi#;B(Bw#C#!EQCl8T?; zAN~LZFk^ZLn!;Pz>HFtUtXb3l?9h@ATA9*@wYV$54Iu=tjWL?5QK)>n40_{H{iJy6~n4P zu+&MmxJb7&>%s}-c?~l^Q`KV!jaiU$(=L*gQBp@+>m@4p*2Y@-2 zL~|vOPLH2-G9Jo(#u;**tc)C*W?%?LeS`){wu{S-pN%6hxE}a|U^46`%i;u82Wl~p zl4UFeE+fuEh}KX6Z^CNTIj$jR>LOdF+e0ilIqMPD9+4+=?Ow1(GImFfINKed{BrXE zC3hz>Gu@NH`pV>4ywm$1kM+zRpUwTxpH13RQ;A_OIu87%laN!9cWhU6g$DHrPb>=$ zTQ8AM>UbX|B6|pi77EucG+S`0{PjIQY_f z=0q!VVm&k3%8cH1)-q@BBjI#*EqzuoJA|ebc|Pfn?2CR=$(E<^p*^6%tlbA{oU>FX z)u1kqn+GEM+KpeL=~vw$lF_&{9Slf4hL@We^kBDiRI{a{5{7O zaY23`O?1hpJ|#8jn}>~Ui`apm_EHRaLWA7#%1#a W%JbhgM>j5U&&+d5@_zw*mrf1< literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/provider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ede1ffb07fc8532106a019aa2b2660dfacca4d82 GIT binary patch literal 9270 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/__pycache__/tag.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7835d85c69d2669bd604d11521124ff42652c1b GIT binary patch literal 13368 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�<<_S&W~pt~#9_F@n&pLCP}&3u4hg;b7n*2t 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 literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/provider.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/provider.py new file mode 100644 index 0000000..0edd3d5 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/provider.py @@ -0,0 +1,216 @@ +from __future__ import annotations + +import dataclasses +import decimal +import json +import typing as t +import uuid +import weakref +from datetime import date + +from werkzeug.http import http_date + +if t.TYPE_CHECKING: # pragma: no cover + from ..app import Flask + from ..wrappers import Response + + +class JSONProvider: + """A standard set of JSON operations for an application. Subclasses + of this can be used to customize JSON behavior or use different + JSON libraries. + + To implement a provider for a specific library, subclass this base + class and implement at least :meth:`dumps` and :meth:`loads`. All + other methods have default implementations. + + To use a different provider, either subclass ``Flask`` and set + :attr:`~flask.Flask.json_provider_class` to a provider class, or set + :attr:`app.json ` to an instance of the class. + + :param app: An application instance. This will be stored as a + :class:`weakref.proxy` on the :attr:`_app` attribute. + + .. versionadded:: 2.2 + """ + + def __init__(self, app: Flask) -> None: + self._app = weakref.proxy(app) + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + :param obj: The data to serialize. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: May be passed to the underlying JSON library. + """ + fp.write(self.dumps(obj, **kwargs)) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + :param s: Text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + return self.loads(fp.read(), **kwargs) + + def _prepare_response_obj( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> t.Any: + if args and kwargs: + raise TypeError("app.json.response() takes either args or kwargs, not both") + + if not args and not kwargs: + return None + + if len(args) == 1: + return args[0] + + return args or kwargs + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. + + The :func:`~flask.json.jsonify` function calls this method for + the current application. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + return self._app.response_class(self.dumps(obj), mimetype="application/json") + + +def _default(o: t.Any) -> t.Any: + if isinstance(o, date): + return http_date(o) + + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + + if hasattr(o, "__html__"): + return str(o.__html__()) + + raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") + + +class DefaultJSONProvider(JSONProvider): + """Provide JSON operations using Python's built-in :mod:`json` + library. Serializes the following additional data types: + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + """ + + default: t.Callable[[t.Any], t.Any] = staticmethod( + _default + ) # type: ignore[assignment] + """Apply this function to any object that :meth:`json.dumps` does + not know how to serialize. It should return a valid JSON type or + raise a ``TypeError``. + """ + + ensure_ascii = True + """Replace non-ASCII characters with escape sequences. This may be + more compatible with some clients, but can be disabled for better + performance and size. + """ + + sort_keys = True + """Sort the keys in any serialized dicts. This may be useful for + some caching situations, but can be disabled for better performance. + When enabled, keys must all be strings, they are not converted + before sorting. + """ + + compact: bool | None = None + """If ``True``, or ``None`` out of debug mode, the :meth:`response` + output will not add indentation, newlines, or spaces. If ``False``, + or ``None`` in debug mode, it will use a non-compact representation. + """ + + mimetype = "application/json" + """The mimetype set in :meth:`response`.""" + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON to a string. + + Keyword arguments are passed to :func:`json.dumps`. Sets some + parameter defaults from the :attr:`default`, + :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. + + :param obj: The data to serialize. + :param kwargs: Passed to :func:`json.dumps`. + """ + kwargs.setdefault("default", self.default) + kwargs.setdefault("ensure_ascii", self.ensure_ascii) + kwargs.setdefault("sort_keys", self.sort_keys) + return json.dumps(obj, **kwargs) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON from a string or bytes. + + :param s: Text or UTF-8 bytes. + :param kwargs: Passed to :func:`json.loads`. + """ + return json.loads(s, **kwargs) + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with it. The response mimetype + will be "application/json" and can be changed with + :attr:`mimetype`. + + If :attr:`compact` is ``False`` or debug mode is enabled, the + output will be formatted to be easier to read. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + dump_args: dict[str, t.Any] = {} + + if (self.compact is None and self._app.debug) or self.compact is False: + dump_args.setdefault("indent", 2) + else: + dump_args.setdefault("separators", (",", ":")) + + return self._app.response_class( + f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype + ) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/tag.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/tag.py new file mode 100644 index 0000000..91cc441 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/json/tag.py @@ -0,0 +1,314 @@ +""" +Tagged JSON +~~~~~~~~~~~ + +A compact representation for lossless serialization of non-standard JSON +types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this +to serialize the session data, but it may be useful in other places. It +can be extended to support other types. + +.. autoclass:: TaggedJSONSerializer + :members: + +.. autoclass:: JSONTag + :members: + +Let's see an example that adds support for +:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so +to handle this we will dump the items as a list of ``[key, value]`` +pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to +identify the type. The session serializer processes dicts first, so +insert the new tag at the front of the order since ``OrderedDict`` must +be processed before ``dict``. + +.. code-block:: python + + from flask.json.tag import JSONTag + + class TagOrderedDict(JSONTag): + __slots__ = ('serializer',) + key = ' od' + + def check(self, value): + return isinstance(value, OrderedDict) + + def to_json(self, value): + return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] + + def to_python(self, value): + return OrderedDict(value) + + app.session_interface.serializer.register(TagOrderedDict, index=0) +""" +from __future__ import annotations + +import typing as t +from base64 import b64decode +from base64 import b64encode +from datetime import datetime +from uuid import UUID + +from markupsafe import Markup +from werkzeug.http import http_date +from werkzeug.http import parse_date + +from ..json import dumps +from ..json import loads + + +class JSONTag: + """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" + + __slots__ = ("serializer",) + + #: The tag to mark the serialized object with. If ``None``, this tag is + #: only used as an intermediate step during tagging. + key: str | None = None + + def __init__(self, serializer: TaggedJSONSerializer) -> None: + """Create a tagger for the given serializer.""" + self.serializer = serializer + + def check(self, value: t.Any) -> bool: + """Check if the given value should be tagged by this tag.""" + raise NotImplementedError + + def to_json(self, value: t.Any) -> t.Any: + """Convert the Python object to an object that is a valid JSON type. + The tag will be added later.""" + raise NotImplementedError + + def to_python(self, value: t.Any) -> t.Any: + """Convert the JSON representation back to the correct type. The tag + will already be removed.""" + raise NotImplementedError + + def tag(self, value: t.Any) -> t.Any: + """Convert the value to a valid JSON type and add the tag structure + around it.""" + return {self.key: self.to_json(value)} + + +class TagDict(JSONTag): + """Tag for 1-item dicts whose only key matches a registered tag. + + Internally, the dict key is suffixed with `__`, and the suffix is removed + when deserializing. + """ + + __slots__ = () + key = " di" + + def check(self, value: t.Any) -> bool: + return ( + isinstance(value, dict) + and len(value) == 1 + and next(iter(value)) in self.serializer.tags + ) + + def to_json(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {f"{key}__": self.serializer.tag(value[key])} + + def to_python(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {key[:-2]: value[key]} + + +class PassDict(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, dict) + + def to_json(self, value: t.Any) -> t.Any: + # JSON objects may only have string keys, so don't bother tagging the + # key here. + return {k: self.serializer.tag(v) for k, v in value.items()} + + tag = to_json + + +class TagTuple(JSONTag): + __slots__ = () + key = " t" + + def check(self, value: t.Any) -> bool: + return isinstance(value, tuple) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + def to_python(self, value: t.Any) -> t.Any: + return tuple(value) + + +class PassList(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, list) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + tag = to_json + + +class TagBytes(JSONTag): + __slots__ = () + key = " b" + + def check(self, value: t.Any) -> bool: + return isinstance(value, bytes) + + def to_json(self, value: t.Any) -> t.Any: + return b64encode(value).decode("ascii") + + def to_python(self, value: t.Any) -> t.Any: + return b64decode(value) + + +class TagMarkup(JSONTag): + """Serialize anything matching the :class:`~markupsafe.Markup` API by + having a ``__html__`` method to the result of that method. Always + deserializes to an instance of :class:`~markupsafe.Markup`.""" + + __slots__ = () + key = " m" + + def check(self, value: t.Any) -> bool: + return callable(getattr(value, "__html__", None)) + + def to_json(self, value: t.Any) -> t.Any: + return str(value.__html__()) + + def to_python(self, value: t.Any) -> t.Any: + return Markup(value) + + +class TagUUID(JSONTag): + __slots__ = () + key = " u" + + def check(self, value: t.Any) -> bool: + return isinstance(value, UUID) + + def to_json(self, value: t.Any) -> t.Any: + return value.hex + + def to_python(self, value: t.Any) -> t.Any: + return UUID(value) + + +class TagDateTime(JSONTag): + __slots__ = () + key = " d" + + def check(self, value: t.Any) -> bool: + return isinstance(value, datetime) + + def to_json(self, value: t.Any) -> t.Any: + return http_date(value) + + def to_python(self, value: t.Any) -> t.Any: + return parse_date(value) + + +class TaggedJSONSerializer: + """Serializer that uses a tag system to compactly represent objects that + are not JSON types. Passed as the intermediate serializer to + :class:`itsdangerous.Serializer`. + + The following extra types are supported: + + * :class:`dict` + * :class:`tuple` + * :class:`bytes` + * :class:`~markupsafe.Markup` + * :class:`~uuid.UUID` + * :class:`~datetime.datetime` + """ + + __slots__ = ("tags", "order") + + #: Tag classes to bind when creating the serializer. Other tags can be + #: added later using :meth:`~register`. + default_tags = [ + TagDict, + PassDict, + TagTuple, + PassList, + TagBytes, + TagMarkup, + TagUUID, + TagDateTime, + ] + + def __init__(self) -> None: + self.tags: dict[str, JSONTag] = {} + self.order: list[JSONTag] = [] + + for cls in self.default_tags: + self.register(cls) + + def register( + self, + tag_class: type[JSONTag], + force: bool = False, + index: int | None = None, + ) -> None: + """Register a new tag with this serializer. + + :param tag_class: tag class to register. Will be instantiated with this + serializer instance. + :param force: overwrite an existing tag. If false (default), a + :exc:`KeyError` is raised. + :param index: index to insert the new tag in the tag order. Useful when + the new tag is a special case of an existing tag. If ``None`` + (default), the tag is appended to the end of the order. + + :raise KeyError: if the tag key is already registered and ``force`` is + not true. + """ + tag = tag_class(self) + key = tag.key + + if key is not None: + if not force and key in self.tags: + raise KeyError(f"Tag '{key}' is already registered.") + + self.tags[key] = tag + + if index is None: + self.order.append(tag) + else: + self.order.insert(index, tag) + + def tag(self, value: t.Any) -> dict[str, t.Any]: + """Convert a value to a tagged representation if necessary.""" + for tag in self.order: + if tag.check(value): + return tag.tag(value) + + return value + + def untag(self, value: dict[str, t.Any]) -> t.Any: + """Convert a tagged representation back to the original type.""" + if len(value) != 1: + return value + + key = next(iter(value)) + + if key not in self.tags: + return value + + return self.tags[key].to_python(value[key]) + + def dumps(self, value: t.Any) -> str: + """Tag the value and dump it to a compact JSON string.""" + return dumps(self.tag(value), separators=(",", ":")) + + def loads(self, value: str) -> t.Any: + """Load data from a JSON string and deserialized any tagged objects.""" + return loads(value, object_hook=self.untag) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/logging.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/logging.py new file mode 100644 index 0000000..99f6be8 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/logging.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import logging +import sys +import typing as t + +from werkzeug.local import LocalProxy + +from .globals import request + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + + +@LocalProxy +def wsgi_errors_stream() -> t.TextIO: + """Find the most appropriate error stream for the application. If a request + is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. + + If you configure your own :class:`logging.StreamHandler`, you may want to + use this for the stream. If you are using file or dict configuration and + can't import this directly, you can refer to it as + ``ext://flask.logging.wsgi_errors_stream``. + """ + return request.environ["wsgi.errors"] if request else sys.stderr + + +def has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle the + given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format +#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. +default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore +default_handler.setFormatter( + logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") +) + + +def create_logger(app: Flask) -> logging.Logger: + """Get the Flask app's logger and configure it if needed. + + The logger name will be the same as + :attr:`app.import_name `. + + When :attr:`~flask.Flask.debug` is enabled, set the logger level to + :data:`logging.DEBUG` if it is not set. + + If there is no handler for the logger's effective level, add a + :class:`~logging.StreamHandler` for + :func:`~flask.logging.wsgi_errors_stream` with a basic format. + """ + logger = logging.getLogger(app.name) + + if app.debug and not logger.level: + logger.setLevel(logging.DEBUG) + + if not has_level_handler(logger): + logger.addHandler(default_handler) + + return logger diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/py.typed b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/scaffold.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/scaffold.py new file mode 100644 index 0000000..6af6906 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/scaffold.py @@ -0,0 +1,923 @@ +from __future__ import annotations + +import importlib.util +import os +import pathlib +import pkgutil +import sys +import typing as t +from collections import defaultdict +from datetime import timedelta +from functools import update_wrapper + +from jinja2 import FileSystemLoader +from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import HTTPException +from werkzeug.utils import cached_property + +from . import typing as ft +from .cli import AppGroup +from .globals import current_app +from .helpers import get_root_path +from .helpers import send_from_directory +from .templating import _default_template_ctx_processor + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + +# a singleton sentinel value for parameter defaults +_sentinel = object() + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) +T_route = t.TypeVar("T_route", bound=ft.RouteCallable) + + +def setupmethod(f: F) -> F: + f_name = f.__name__ + + def wrapper_func(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + self._check_setup_finished(f_name) + return f(self, *args, **kwargs) + + return t.cast(F, update_wrapper(wrapper_func, f)) + + +class Scaffold: + """Common behavior shared between :class:`~flask.Flask` and + :class:`~flask.blueprints.Blueprint`. + + :param import_name: The import name of the module where this object + is defined. Usually :attr:`__name__` should be used. + :param static_folder: Path to a folder of static files to serve. + If this is set, a static route will be added. + :param static_url_path: URL prefix for the static route. + :param template_folder: Path to a folder containing template files. + for rendering. If this is set, a Jinja loader will be added. + :param root_path: The path that static, template, and resource files + are relative to. Typically not set, it is discovered based on + the ``import_name``. + + .. versionadded:: 2.0 + """ + + name: str + _static_folder: str | None = None + _static_url_path: str | None = None + + def __init__( + self, + import_name: str, + static_folder: str | os.PathLike | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike | None = None, + root_path: str | None = None, + ): + #: The name of the package or module that this object belongs + #: to. Do not change this once it is set by the constructor. + self.import_name = import_name + + self.static_folder = static_folder # type: ignore + self.static_url_path = static_url_path + + #: The path to the templates folder, relative to + #: :attr:`root_path`, to add to the template loader. ``None`` if + #: templates should not be added. + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + #: Absolute path to the package on the filesystem. Used to look + #: up resources contained in the package. + self.root_path = root_path + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = AppGroup() + + #: A dictionary mapping endpoint names to view functions. + #: + #: To register a view function, use the :meth:`route` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.view_functions: dict[str, t.Callable] = {} + + #: A data structure of registered error handlers, in the format + #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is + #: the name of a blueprint the handlers are active for, or + #: ``None`` for all requests. The ``code`` key is the HTTP + #: status code for ``HTTPException``, or ``None`` for + #: other exceptions. The innermost dictionary maps exception + #: classes to handler functions. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.error_handler_spec: dict[ + ft.AppOrBlueprintKey, + dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], + ] = defaultdict(lambda: defaultdict(dict)) + + #: A data structure of functions to call at the beginning of + #: each request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`before_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.before_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`after_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.after_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.AfterRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request even if an exception is raised, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`teardown_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.teardown_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.TeardownCallable] + ] = defaultdict(list) + + #: A data structure of functions to call to pass extra context + #: values when rendering templates, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`context_processor` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.template_context_processors: dict[ + ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] + ] = defaultdict(list, {None: [_default_template_ctx_processor]}) + + #: A data structure of functions to call to modify the keyword + #: arguments passed to the view function, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the + #: :meth:`url_value_preprocessor` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_value_preprocessors: dict[ + ft.AppOrBlueprintKey, + list[ft.URLValuePreprocessorCallable], + ] = defaultdict(list) + + #: A data structure of functions to call to modify the keyword + #: arguments when generating URLs, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`url_defaults` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_default_functions: dict[ + ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] + ] = defaultdict(list) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.name!r}>" + + def _check_setup_finished(self, f_name: str) -> None: + raise NotImplementedError + + @property + def static_folder(self) -> str | None: + """The absolute path to the configured static folder. ``None`` + if no static folder is set. + """ + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + else: + return None + + @static_folder.setter + def static_folder(self, value: str | os.PathLike | None) -> None: + if value is not None: + value = os.fspath(value).rstrip(r"\/") + + self._static_folder = value + + @property + def has_static_folder(self) -> bool: + """``True`` if :attr:`static_folder` is set. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @property + def static_url_path(self) -> str | None: + """The URL prefix that the static route will be accessible from. + + If it was not configured during init, it is derived from + :attr:`static_folder`. + """ + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + basename = os.path.basename(self.static_folder) + return f"/{basename}".rstrip("/") + + return None + + @static_url_path.setter + def static_url_path(self, value: str | None) -> None: + if value is not None: + value = value.rstrip("/") + + self._static_url_path = value + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + .. versionadded:: 0.5 + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + @cached_property + def jinja_loader(self) -> FileSystemLoader | None: + """The Jinja loader for this object's templates. By default this + is a class :class:`jinja2.loaders.FileSystemLoader` to + :attr:`template_folder` if it is set. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) + else: + return None + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) + + def _method_route( + self, + method: str, + rule: str, + options: dict, + ) -> t.Callable[[T_route], T_route]: + if "methods" in options: + raise TypeError("Use the 'route' decorator to use the 'methods' argument.") + + return self.route(rule, methods=[method], **options) + + @setupmethod + def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["GET"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("GET", rule, options) + + @setupmethod + def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["POST"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("POST", rule, options) + + @setupmethod + def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PUT"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PUT", rule, options) + + @setupmethod + def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["DELETE"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("DELETE", rule, options) + + @setupmethod + def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PATCH"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PATCH", rule, options) + + @setupmethod + def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Decorate a view function to register it with the given URL + rule and options. Calls :meth:`add_url_rule`, which has more + details about the implementation. + + .. code-block:: python + + @app.route("/") + def index(): + return "Hello, World!" + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and + ``OPTIONS`` are added automatically. + + :param rule: The URL rule string. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + + def decorator(f: T_route) -> T_route: + endpoint = options.pop("endpoint", None) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a rule for routing incoming requests and building + URLs. The :meth:`route` decorator is a shortcut to call this + with the ``view_func`` argument. These are equivalent: + + .. code-block:: python + + @app.route("/") + def index(): + ... + + .. code-block:: python + + def index(): + ... + + app.add_url_rule("/", view_func=index) + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. An error + will be raised if a function has already been registered for the + endpoint. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is + always added automatically, and ``OPTIONS`` is added + automatically by default. + + ``view_func`` does not necessarily need to be passed, but if the + rule should participate in routing an endpoint name must be + associated with a view function at some point with the + :meth:`endpoint` decorator. + + .. code-block:: python + + app.add_url_rule("/", endpoint="index") + + @app.endpoint("index") + def index(): + ... + + If ``view_func`` has a ``required_methods`` attribute, those + methods are added to the passed and automatic methods. If it + has a ``provide_automatic_methods`` attribute, it is used as the + default if the parameter is not passed. + + :param rule: The URL rule string. + :param endpoint: The endpoint name to associate with the rule + and view function. Used when routing and building URLs. + Defaults to ``view_func.__name__``. + :param view_func: The view function to associate with the + endpoint name. + :param provide_automatic_options: Add the ``OPTIONS`` method and + respond to ``OPTIONS`` requests automatically. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + raise NotImplementedError + + @setupmethod + def endpoint(self, endpoint: str) -> t.Callable[[F], F]: + """Decorate a view function to register it for the given + endpoint. Used if a rule is added without a ``view_func`` with + :meth:`add_url_rule`. + + .. code-block:: python + + app.add_url_rule("/ex", endpoint="example") + + @app.endpoint("example") + def example(): + ... + + :param endpoint: The endpoint name to associate with the view + function. + """ + + def decorator(f: F) -> F: + self.view_functions[endpoint] = f + return f + + return decorator + + @setupmethod + def before_request(self, f: T_before_request) -> T_before_request: + """Register a function to run before each request. + + For example, this can be used to open a database connection, or + to load the logged in user from the session. + + .. code-block:: python + + @app.before_request + def load_user(): + if "user_id" in session: + g.user = db.session.get(session["user_id"]) + + The function will be called without any arguments. If it returns + a non-``None`` value, the value is handled as if it was the + return value from the view, and further request handling is + stopped. + + This is available on both app and blueprint objects. When used on an app, this + executes before every request. When used on a blueprint, this executes before + every request that the blueprint handles. To register with a blueprint and + execute before every request, use :meth:`.Blueprint.before_app_request`. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def after_request(self, f: T_after_request) -> T_after_request: + """Register a function to run after each request to this object. + + The function is called with the response object, and must return + a response object. This allows the functions to modify or + replace the response before it is sent. + + If a function raises an exception, any remaining + ``after_request`` functions will not be called. Therefore, this + should not be used for actions that must execute, such as to + close resources. Use :meth:`teardown_request` for that. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.after_app_request`. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f: T_teardown) -> T_teardown: + """Register a function to be called when the request context is + popped. Typically this happens at the end of each request, but + contexts may be pushed manually as well during testing. + + .. code-block:: python + + with app.test_request_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the request context is + made inactive. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.teardown_app_request`. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def context_processor( + self, + f: T_template_context_processor, + ) -> T_template_context_processor: + """Registers a template context processor function. These functions run before + rendering a template. The keys of the returned dict are added as variables + available in the template. + + This is available on both app and blueprint objects. When used on an app, this + is called for every rendered template. When used on a blueprint, this is called + for templates rendered from the blueprint's views. To register with a blueprint + and affect every template, use :meth:`.Blueprint.app_context_processor`. + """ + self.template_context_processors[None].append(f) + return f + + @setupmethod + def url_value_preprocessor( + self, + f: T_url_value_preprocessor, + ) -> T_url_value_preprocessor: + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_value_preprocessor`. + """ + self.url_value_preprocessors[None].append(f) + return f + + @setupmethod + def url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_defaults`. + """ + self.url_default_functions[None].append(f) + return f + + @setupmethod + def errorhandler( + self, code_or_exception: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + This is available on both app and blueprint objects. When used on an app, this + can handle errors from every request. When used on a blueprint, this can handle + errors from requests that the blueprint handles. To register with a blueprint + and affect every request, use :meth:`.Blueprint.app_errorhandler`. + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.register_error_handler(code_or_exception, f) + return f + + return decorator + + @setupmethod + def register_error_handler( + self, + code_or_exception: type[Exception] | int, + f: ft.ErrorHandlerCallable, + ) -> None: + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + exc_class, code = self._get_exc_class_and_code(code_or_exception) + self.error_handler_spec[None][code][exc_class] = f + + @staticmethod + def _get_exc_class_and_code( + exc_class_or_code: type[Exception] | int, + ) -> tuple[type[Exception], int | None]: + """Get the exception class being handled. For HTTP status codes + or ``HTTPException`` subclasses, return both the exception and + status code. + + :param exc_class_or_code: Any exception class, or an HTTP status + code as an integer. + """ + exc_class: type[Exception] + + if isinstance(exc_class_or_code, int): + try: + exc_class = default_exceptions[exc_class_or_code] + except KeyError: + raise ValueError( + f"'{exc_class_or_code}' is not a recognized HTTP" + " error code. Use a subclass of HTTPException with" + " that code instead." + ) from None + else: + exc_class = exc_class_or_code + + if isinstance(exc_class, Exception): + raise TypeError( + f"{exc_class!r} is an instance, not a class. Handlers" + " can only be registered for Exception classes or HTTP" + " error codes." + ) + + if not issubclass(exc_class, Exception): + raise ValueError( + f"'{exc_class.__name__}' is not a subclass of Exception." + " Handlers can only be registered for Exception classes" + " or HTTP error codes." + ) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + +def _endpoint_from_view_func(view_func: t.Callable) -> str: + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, "expected view func if endpoint is not provided." + return view_func.__name__ + + +def _matching_loader_thinks_module_is_package(loader, mod_name): + """Attempt to figure out if the given name is a package or a module. + + :param: loader: The loader that handled the name. + :param mod_name: The name of the package or module. + """ + # Use loader.is_package if it's available. + if hasattr(loader, "is_package"): + return loader.is_package(mod_name) + + cls = type(loader) + + # NamespaceLoader doesn't implement is_package, but all names it + # loads must be packages. + if cls.__module__ == "_frozen_importlib" and cls.__name__ == "NamespaceLoader": + return True + + # Otherwise we need to fail with an error that explains what went + # wrong. + raise AttributeError( + f"'{cls.__name__}.is_package()' must be implemented for PEP 302" + f" import hooks." + ) + + +def _path_is_relative_to(path: pathlib.PurePath, base: str) -> bool: + # Path.is_relative_to doesn't exist until Python 3.9 + try: + path.relative_to(base) + return True + except ValueError: + return False + + +def _find_package_path(import_name): + """Find the path that contains the package or module.""" + root_mod_name, _, _ = import_name.partition(".") + + try: + root_spec = importlib.util.find_spec(root_mod_name) + + if root_spec is None: + raise ValueError("not found") + # ImportError: the machinery told us it does not exist + # ValueError: + # - the module name was invalid + # - the module name is __main__ + # - *we* raised `ValueError` due to `root_spec` being `None` + except (ImportError, ValueError): + pass # handled below + else: + # namespace package + if root_spec.origin in {"namespace", None}: + package_spec = importlib.util.find_spec(import_name) + if package_spec is not None and package_spec.submodule_search_locations: + # Pick the path in the namespace that contains the submodule. + package_path = pathlib.Path( + os.path.commonpath(package_spec.submodule_search_locations) + ) + search_locations = ( + location + for location in root_spec.submodule_search_locations + if _path_is_relative_to(package_path, location) + ) + else: + # Pick the first path. + search_locations = iter(root_spec.submodule_search_locations) + return os.path.dirname(next(search_locations)) + # a package (with __init__.py) + elif root_spec.submodule_search_locations: + return os.path.dirname(os.path.dirname(root_spec.origin)) + # just a normal module + else: + return os.path.dirname(root_spec.origin) + + # we were unable to find the `package_path` using PEP 451 loaders + loader = pkgutil.get_loader(root_mod_name) + + if loader is None or root_mod_name == "__main__": + # import name is not found, or interactive/main module + return os.getcwd() + + if hasattr(loader, "get_filename"): + filename = loader.get_filename(root_mod_name) + elif hasattr(loader, "archive"): + # zipimporter's loader.archive points to the .egg or .zip file. + filename = loader.archive + else: + # At least one loader is missing both get_filename and archive: + # Google App Engine's HardenedModulesHook, use __file__. + filename = importlib.import_module(root_mod_name).__file__ + + package_path = os.path.abspath(os.path.dirname(filename)) + + # If the imported name is a package, filename is currently pointing + # to the root of the package, need to get the current directory. + if _matching_loader_thinks_module_is_package(loader, root_mod_name): + package_path = os.path.dirname(package_path) + + return package_path + + +def find_package(import_name: str): + """Find the prefix that a package is installed under, and the path + that it would be imported from. + + The prefix is the directory containing the standard directory + hierarchy (lib, bin, etc.). If the package is not installed to the + system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), + ``None`` is returned. + + The path is the entry in :attr:`sys.path` that contains the package + for import. If the package is not installed, it's assumed that the + package was imported from the current working directory. + """ + package_path = _find_package_path(import_name) + py_prefix = os.path.abspath(sys.prefix) + + # installed to the system + if _path_is_relative_to(pathlib.PurePath(package_path), py_prefix): + return py_prefix, package_path + + site_parent, site_folder = os.path.split(package_path) + + # installed to a virtualenv + if site_folder.lower() == "site-packages": + parent, folder = os.path.split(site_parent) + + # Windows (prefix/lib/site-packages) + if folder.lower() == "lib": + return parent, package_path + + # Unix (prefix/lib/pythonX.Y/site-packages) + if os.path.basename(parent).lower() == "lib": + return os.path.dirname(parent), package_path + + # something else (prefix/site-packages) + return site_parent, package_path + + # not installed + return None, package_path diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/sessions.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/sessions.py new file mode 100644 index 0000000..e5650d6 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/sessions.py @@ -0,0 +1,367 @@ +from __future__ import annotations + +import hashlib +import typing as t +from collections.abc import MutableMapping +from datetime import datetime +from datetime import timezone + +from itsdangerous import BadSignature +from itsdangerous import URLSafeTimedSerializer +from werkzeug.datastructures import CallbackDict + +from .json.tag import TaggedJSONSerializer + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .wrappers import Request, Response + + +class SessionMixin(MutableMapping): + """Expands a basic dictionary with session attributes.""" + + @property + def permanent(self) -> bool: + """This reflects the ``'_permanent'`` key in the dict.""" + return self.get("_permanent", False) + + @permanent.setter + def permanent(self, value: bool) -> None: + self["_permanent"] = bool(value) + + #: Some implementations can detect whether a session is newly + #: created, but that is not guaranteed. Use with caution. The mixin + # default is hard-coded ``False``. + new = False + + #: Some implementations can detect changes to the session and set + #: this when that happens. The mixin default is hard coded to + #: ``True``. + modified = True + + #: Some implementations can detect when session data is read or + #: written and set this when that happens. The mixin default is hard + #: coded to ``True``. + accessed = True + + +class SecureCookieSession(CallbackDict, SessionMixin): + """Base class for sessions based on signed cookies. + + This session backend will set the :attr:`modified` and + :attr:`accessed` attributes. It cannot reliably track whether a + session is new (vs. empty), so :attr:`new` remains hard coded to + ``False``. + """ + + #: When data is changed, this is set to ``True``. Only the session + #: dictionary itself is tracked; if the session contains mutable + #: data (for example a nested dict) then this must be set to + #: ``True`` manually when modifying that data. The session cookie + #: will only be written to the response if this is ``True``. + modified = False + + #: When data is read or written, this is set to ``True``. Used by + # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` + #: header, which allows caching proxies to cache different pages for + #: different users. + accessed = False + + def __init__(self, initial: t.Any = None) -> None: + def on_update(self) -> None: + self.modified = True + self.accessed = True + + super().__init__(initial, on_update) + + def __getitem__(self, key: str) -> t.Any: + self.accessed = True + return super().__getitem__(key) + + def get(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().get(key, default) + + def setdefault(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().setdefault(key, default) + + +class NullSession(SecureCookieSession): + """Class used to generate nicer error messages if sessions are not + available. Will still allow read-only access to the empty session + but fail on setting. + """ + + def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + raise RuntimeError( + "The session is unavailable because no secret " + "key was set. Set the secret_key on the " + "application to something unique and secret." + ) + + __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 + del _fail + + +class SessionInterface: + """The basic interface you have to implement in order to replace the + default session interface which uses werkzeug's securecookie + implementation. The only methods you have to implement are + :meth:`open_session` and :meth:`save_session`, the others have + useful defaults which you don't need to change. + + The session object returned by the :meth:`open_session` method has to + provide a dictionary like interface plus the properties and methods + from the :class:`SessionMixin`. We recommend just subclassing a dict + and adding that mixin:: + + class Session(dict, SessionMixin): + pass + + If :meth:`open_session` returns ``None`` Flask will call into + :meth:`make_null_session` to create a session that acts as replacement + if the session support cannot work because some requirement is not + fulfilled. The default :class:`NullSession` class that is created + will complain that the secret key was not set. + + To replace the session interface on an application all you have to do + is to assign :attr:`flask.Flask.session_interface`:: + + app = Flask(__name__) + app.session_interface = MySessionInterface() + + Multiple requests with the same session may be sent and handled + concurrently. When implementing a new session interface, consider + whether reads or writes to the backing store must be synchronized. + There is no guarantee on the order in which the session for each + request is opened or saved, it will occur in the order that requests + begin and end processing. + + .. versionadded:: 0.8 + """ + + #: :meth:`make_null_session` will look here for the class that should + #: be created when a null session is requested. Likewise the + #: :meth:`is_null_session` method will perform a typecheck against + #: this type. + null_session_class = NullSession + + #: A flag that indicates if the session interface is pickle based. + #: This can be used by Flask extensions to make a decision in regards + #: to how to deal with the session object. + #: + #: .. versionadded:: 0.10 + pickle_based = False + + def make_null_session(self, app: Flask) -> NullSession: + """Creates a null session which acts as a replacement object if the + real session support could not be loaded due to a configuration + error. This mainly aids the user experience because the job of the + null session is to still support lookup without complaining but + modifications are answered with a helpful error message of what + failed. + + This creates an instance of :attr:`null_session_class` by default. + """ + return self.null_session_class() + + def is_null_session(self, obj: object) -> bool: + """Checks if a given object is a null session. Null sessions are + not asked to be saved. + + This checks if the object is an instance of :attr:`null_session_class` + by default. + """ + return isinstance(obj, self.null_session_class) + + def get_cookie_name(self, app: Flask) -> str: + """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" + return app.config["SESSION_COOKIE_NAME"] + + def get_cookie_domain(self, app: Flask) -> str | None: + """The value of the ``Domain`` parameter on the session cookie. If not set, + browsers will only send the cookie to the exact domain it was set from. + Otherwise, they will send it to any subdomain of the given value as well. + + Uses the :data:`SESSION_COOKIE_DOMAIN` config. + + .. versionchanged:: 2.3 + Not set by default, does not fall back to ``SERVER_NAME``. + """ + rv = app.config["SESSION_COOKIE_DOMAIN"] + return rv if rv else None + + def get_cookie_path(self, app: Flask) -> str: + """Returns the path for which the cookie should be valid. The + default implementation uses the value from the ``SESSION_COOKIE_PATH`` + config var if it's set, and falls back to ``APPLICATION_ROOT`` or + uses ``/`` if it's ``None``. + """ + return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] + + def get_cookie_httponly(self, app: Flask) -> bool: + """Returns True if the session cookie should be httponly. This + currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` + config var. + """ + return app.config["SESSION_COOKIE_HTTPONLY"] + + def get_cookie_secure(self, app: Flask) -> bool: + """Returns True if the cookie should be secure. This currently + just returns the value of the ``SESSION_COOKIE_SECURE`` setting. + """ + return app.config["SESSION_COOKIE_SECURE"] + + def get_cookie_samesite(self, app: Flask) -> str: + """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the + ``SameSite`` attribute. This currently just returns the value of + the :data:`SESSION_COOKIE_SAMESITE` setting. + """ + return app.config["SESSION_COOKIE_SAMESITE"] + + def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: + """A helper method that returns an expiration date for the session + or ``None`` if the session is linked to the browser session. The + default implementation returns now + the permanent session + lifetime configured on the application. + """ + if session.permanent: + return datetime.now(timezone.utc) + app.permanent_session_lifetime + return None + + def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: + """Used by session backends to determine if a ``Set-Cookie`` header + should be set for this session cookie for this response. If the session + has been modified, the cookie is set. If the session is permanent and + the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is + always set. + + This check is usually skipped if the session was deleted. + + .. versionadded:: 0.11 + """ + + return session.modified or ( + session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] + ) + + def open_session(self, app: Flask, request: Request) -> SessionMixin | None: + """This is called at the beginning of each request, after + pushing the request context, before matching the URL. + + This must return an object which implements a dictionary-like + interface as well as the :class:`SessionMixin` interface. + + This will return ``None`` to indicate that loading failed in + some way that is not immediately an error. The request + context will fall back to using :meth:`make_null_session` + in this case. + """ + raise NotImplementedError() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + """This is called at the end of each request, after generating + a response, before removing the request context. It is skipped + if :meth:`is_null_session` returns ``True``. + """ + raise NotImplementedError() + + +session_json_serializer = TaggedJSONSerializer() + + +class SecureCookieSessionInterface(SessionInterface): + """The default session interface that stores sessions in signed cookies + through the :mod:`itsdangerous` module. + """ + + #: the salt that should be applied on top of the secret key for the + #: signing of cookie based sessions. + salt = "cookie-session" + #: the hash function to use for the signature. The default is sha1 + digest_method = staticmethod(hashlib.sha1) + #: the name of the itsdangerous supported key derivation. The default + #: is hmac. + key_derivation = "hmac" + #: A python serializer for the payload. The default is a compact + #: JSON derived serializer with support for some extra Python types + #: such as datetime objects or tuples. + serializer = session_json_serializer + session_class = SecureCookieSession + + def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: + if not app.secret_key: + return None + signer_kwargs = dict( + key_derivation=self.key_derivation, digest_method=self.digest_method + ) + return URLSafeTimedSerializer( + app.secret_key, + salt=self.salt, + serializer=self.serializer, + signer_kwargs=signer_kwargs, + ) + + def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: + s = self.get_signing_serializer(app) + if s is None: + return None + val = request.cookies.get(self.get_cookie_name(app)) + if not val: + return self.session_class() + max_age = int(app.permanent_session_lifetime.total_seconds()) + try: + data = s.loads(val, max_age=max_age) + return self.session_class(data) + except BadSignature: + return self.session_class() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + name = self.get_cookie_name(app) + domain = self.get_cookie_domain(app) + path = self.get_cookie_path(app) + secure = self.get_cookie_secure(app) + samesite = self.get_cookie_samesite(app) + httponly = self.get_cookie_httponly(app) + + # Add a "Vary: Cookie" header if the session was accessed at all. + if session.accessed: + response.vary.add("Cookie") + + # If the session is modified to be empty, remove the cookie. + # If the session is empty, return without setting the cookie. + if not session: + if session.modified: + response.delete_cookie( + name, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + httponly=httponly, + ) + response.vary.add("Cookie") + + return + + if not self.should_set_cookie(app, session): + return + + expires = self.get_expiration_time(app, session) + val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore + response.set_cookie( + name, + val, # type: ignore + expires=expires, + httponly=httponly, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + ) + response.vary.add("Cookie") diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/signals.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/signals.py new file mode 100644 index 0000000..d79f21f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/signals.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import typing as t +import warnings + +from blinker import Namespace + +# This namespace is only for signals provided by Flask itself. +_signals = Namespace() + +template_rendered = _signals.signal("template-rendered") +before_render_template = _signals.signal("before-render-template") +request_started = _signals.signal("request-started") +request_finished = _signals.signal("request-finished") +request_tearing_down = _signals.signal("request-tearing-down") +got_request_exception = _signals.signal("got-request-exception") +appcontext_tearing_down = _signals.signal("appcontext-tearing-down") +appcontext_pushed = _signals.signal("appcontext-pushed") +appcontext_popped = _signals.signal("appcontext-popped") +message_flashed = _signals.signal("message-flashed") + + +def __getattr__(name: str) -> t.Any: + if name == "signals_available": + warnings.warn( + "The 'signals_available' attribute is deprecated and will be removed in" + " Flask 2.4. Signals are always available.", + DeprecationWarning, + stacklevel=2, + ) + return True + + raise AttributeError(name) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/templating.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/templating.py new file mode 100644 index 0000000..769108f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/templating.py @@ -0,0 +1,220 @@ +from __future__ import annotations + +import typing as t + +from jinja2 import BaseLoader +from jinja2 import Environment as BaseEnvironment +from jinja2 import Template +from jinja2 import TemplateNotFound + +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .helpers import stream_with_context +from .signals import before_render_template +from .signals import template_rendered + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .scaffold import Scaffold + + +def _default_template_ctx_processor() -> dict[str, t.Any]: + """Default template context processor. Injects `request`, + `session` and `g`. + """ + appctx = _cv_app.get(None) + reqctx = _cv_request.get(None) + rv: dict[str, t.Any] = {} + if appctx is not None: + rv["g"] = appctx.g + if reqctx is not None: + rv["request"] = reqctx.request + rv["session"] = reqctx.session + return rv + + +class Environment(BaseEnvironment): + """Works like a regular Jinja2 environment but has some additional + knowledge of how Flask's blueprint works so that it can prepend the + name of the blueprint to referenced templates if necessary. + """ + + def __init__(self, app: Flask, **options: t.Any) -> None: + if "loader" not in options: + options["loader"] = app.create_global_jinja_loader() + BaseEnvironment.__init__(self, **options) + self.app = app + + +class DispatchingJinjaLoader(BaseLoader): + """A loader that looks for templates in the application and all + the blueprint folders. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + + def get_source( # type: ignore + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: + return self._get_source_explained(environment, template) + return self._get_source_fast(environment, template) + + def _get_source_explained( + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + attempts = [] + rv: tuple[str, str | None, t.Callable[[], bool] | None] | None + trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None + + for srcobj, loader in self._iter_loaders(template): + try: + rv = loader.get_source(environment, template) + if trv is None: + trv = rv + except TemplateNotFound: + rv = None + attempts.append((loader, srcobj, rv)) + + from .debughelpers import explain_template_loading_attempts + + explain_template_loading_attempts(self.app, template, attempts) + + if trv is not None: + return trv + raise TemplateNotFound(template) + + def _get_source_fast( + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + for _srcobj, loader in self._iter_loaders(template): + try: + return loader.get_source(environment, template) + except TemplateNotFound: + continue + raise TemplateNotFound(template) + + def _iter_loaders( + self, template: str + ) -> t.Generator[tuple[Scaffold, BaseLoader], None, None]: + loader = self.app.jinja_loader + if loader is not None: + yield self.app, loader + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + yield blueprint, loader + + def list_templates(self) -> list[str]: + result = set() + loader = self.app.jinja_loader + if loader is not None: + result.update(loader.list_templates()) + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + for template in loader.list_templates(): + result.add(template) + + return list(result) + + +def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + rv = template.render(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + return rv + + +def render_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> str: + """Render a template by name with the given context. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _render(app, template, context) + + +def render_template_string(source: str, **context: t.Any) -> str: + """Render a template from the given source string with the given + context. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _render(app, template, context) + + +def _stream( + app: Flask, template: Template, context: dict[str, t.Any] +) -> t.Iterator[str]: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + def generate() -> t.Iterator[str]: + yield from template.generate(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + rv = generate() + + # If a request context is active, keep it while generating. + if request: + rv = stream_with_context(rv) + + return rv + + +def stream_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> t.Iterator[str]: + """Render a template by name with the given context as a stream. + This returns an iterator of strings, which can be used as a + streaming response from a view. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _stream(app, template, context) + + +def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: + """Render a template from the given source string with the given + context as a stream. This returns an iterator of strings, which can + be used as a streaming response from a view. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _stream(app, template, context) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/testing.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/testing.py new file mode 100644 index 0000000..773f152 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/testing.py @@ -0,0 +1,282 @@ +from __future__ import annotations + +import typing as t +from contextlib import contextmanager +from contextlib import ExitStack +from copy import copy +from types import TracebackType +from urllib.parse import urlsplit + +import werkzeug.test +from click.testing import CliRunner +from werkzeug.test import Client +from werkzeug.wrappers import Request as BaseRequest + +from .cli import ScriptInfo +from .sessions import SessionMixin + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.test import TestResponse + + from .app import Flask + + +class EnvironBuilder(werkzeug.test.EnvironBuilder): + """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the + application. + + :param app: The Flask application to configure the environment from. + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + + def __init__( + self, + app: Flask, + path: str = "/", + base_url: str | None = None, + subdomain: str | None = None, + url_scheme: str | None = None, + *args: t.Any, + **kwargs: t.Any, + ) -> None: + assert not (base_url or subdomain or url_scheme) or ( + base_url is not None + ) != bool( + subdomain or url_scheme + ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' + + if base_url is None: + http_host = app.config.get("SERVER_NAME") or "localhost" + app_root = app.config["APPLICATION_ROOT"] + + if subdomain: + http_host = f"{subdomain}.{http_host}" + + if url_scheme is None: + url_scheme = app.config["PREFERRED_URL_SCHEME"] + + url = urlsplit(path) + base_url = ( + f"{url.scheme or url_scheme}://{url.netloc or http_host}" + f"/{app_root.lstrip('/')}" + ) + path = url.path + + if url.query: + sep = b"?" if isinstance(url.query, bytes) else "?" + path += sep + url.query + + self.app = app + super().__init__(path, base_url, *args, **kwargs) + + def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore + """Serialize ``obj`` to a JSON-formatted string. + + The serialization will be configured according to the config associated + with this EnvironBuilder's ``app``. + """ + return self.app.json.dumps(obj, **kwargs) + + +class FlaskClient(Client): + """Works like a regular Werkzeug test client but has knowledge about + Flask's contexts to defer the cleanup of the request context until + the end of a ``with`` block. For general information about how to + use this class refer to :class:`werkzeug.test.Client`. + + .. versionchanged:: 0.12 + `app.test_client()` includes preset default environment, which can be + set after instantiation of the `app.test_client()` object in + `client.environ_base`. + + Basic usage is outlined in the :doc:`/testing` chapter. + """ + + application: Flask + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + super().__init__(*args, **kwargs) + self.preserve_context = False + self._new_contexts: list[t.ContextManager[t.Any]] = [] + self._context_stack = ExitStack() + self.environ_base = { + "REMOTE_ADDR": "127.0.0.1", + "HTTP_USER_AGENT": f"werkzeug/{werkzeug.__version__}", + } + + @contextmanager + def session_transaction( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Generator[SessionMixin, None, None]: + """When used in combination with a ``with`` statement this opens a + session transaction. This can be used to modify the session that + the test client uses. Once the ``with`` block is left the session is + stored back. + + :: + + with client.session_transaction() as session: + session['value'] = 42 + + Internally this is implemented by going through a temporary test + request context and since session handling could depend on + request variables this function accepts the same arguments as + :meth:`~flask.Flask.test_request_context` which are directly + passed through. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + app = self.application + ctx = app.test_request_context(*args, **kwargs) + self._add_cookies_to_wsgi(ctx.request.environ) + + with ctx: + sess = app.session_interface.open_session(app, ctx.request) + + if sess is None: + raise RuntimeError("Session backend did not open a session.") + + yield sess + resp = app.response_class() + + if app.session_interface.is_null_session(sess): + return + + with ctx: + app.session_interface.save_session(app, sess, resp) + + self._update_cookies_from_response( + ctx.request.host.partition(":")[0], + ctx.request.path, + resp.headers.getlist("Set-Cookie"), + ) + + def _copy_environ(self, other): + out = {**self.environ_base, **other} + + if self.preserve_context: + out["werkzeug.debug.preserve_context"] = self._new_contexts.append + + return out + + def _request_from_builder_args(self, args, kwargs): + kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) + builder = EnvironBuilder(self.application, *args, **kwargs) + + try: + return builder.get_request() + finally: + builder.close() + + def open( + self, + *args: t.Any, + buffered: bool = False, + follow_redirects: bool = False, + **kwargs: t.Any, + ) -> TestResponse: + if args and isinstance( + args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) + ): + if isinstance(args[0], werkzeug.test.EnvironBuilder): + builder = copy(args[0]) + builder.environ_base = self._copy_environ(builder.environ_base or {}) + request = builder.get_request() + elif isinstance(args[0], dict): + request = EnvironBuilder.from_environ( + args[0], app=self.application, environ_base=self._copy_environ({}) + ).get_request() + else: + # isinstance(args[0], BaseRequest) + request = copy(args[0]) + request.environ = self._copy_environ(request.environ) + else: + # request is None + request = self._request_from_builder_args(args, kwargs) + + # Pop any previously preserved contexts. This prevents contexts + # from being preserved across redirects or multiple requests + # within a single block. + self._context_stack.close() + + response = super().open( + request, + buffered=buffered, + follow_redirects=follow_redirects, + ) + response.json_module = self.application.json # type: ignore[assignment] + + # Re-push contexts that were preserved during the request. + while self._new_contexts: + cm = self._new_contexts.pop() + self._context_stack.enter_context(cm) + + return response + + def __enter__(self) -> FlaskClient: + if self.preserve_context: + raise RuntimeError("Cannot nest client invocations") + self.preserve_context = True + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.preserve_context = False + self._context_stack.close() + + +class FlaskCliRunner(CliRunner): + """A :class:`~click.testing.CliRunner` for testing a Flask app's + CLI commands. Typically created using + :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. + """ + + def __init__(self, app: Flask, **kwargs: t.Any) -> None: + self.app = app + super().__init__(**kwargs) + + def invoke( # type: ignore + self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any + ) -> t.Any: + """Invokes a CLI command in an isolated environment. See + :meth:`CliRunner.invoke ` for + full method documentation. See :ref:`testing-cli` for examples. + + If the ``obj`` argument is not given, passes an instance of + :class:`~flask.cli.ScriptInfo` that knows how to load the Flask + app being tested. + + :param cli: Command object to invoke. Default is the app's + :attr:`~flask.app.Flask.cli` group. + :param args: List of strings to invoke the command with. + + :return: a :class:`~click.testing.Result` object. + """ + if cli is None: + cli = self.app.cli # type: ignore + + if "obj" not in kwargs: + kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) + + return super().invoke(cli, args, **kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/typing.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/typing.py new file mode 100644 index 0000000..50aef7f --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/typing.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIApplication # noqa: F401 + from werkzeug.datastructures import Headers # noqa: F401 + from werkzeug.wrappers import Response # noqa: F401 + +# The possible types that are directly convertible or are a Response object. +ResponseValue = t.Union[ + "Response", + str, + bytes, + t.List[t.Any], + # Only dict is actually accepted, but Mapping allows for TypedDict. + t.Mapping[str, t.Any], + t.Iterator[str], + t.Iterator[bytes], +] + +# the possible types for an individual HTTP header +# This should be a Union, but mypy doesn't pass unless it's a TypeVar. +HeaderValue = t.Union[str, t.List[str], t.Tuple[str, ...]] + +# the possible types for HTTP headers +HeadersValue = t.Union[ + "Headers", + t.Mapping[str, HeaderValue], + t.Sequence[t.Tuple[str, HeaderValue]], +] + +# The possible types returned by a route function. +ResponseReturnValue = t.Union[ + ResponseValue, + t.Tuple[ResponseValue, HeadersValue], + t.Tuple[ResponseValue, int], + t.Tuple[ResponseValue, int, HeadersValue], + "WSGIApplication", +] + +# Allow any subclass of werkzeug.Response, such as the one from Flask, +# as a callback argument. Using werkzeug.Response directly makes a +# callback annotated with flask.Response fail type checking. +ResponseClass = t.TypeVar("ResponseClass", bound="Response") + +AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named +AfterRequestCallable = t.Union[ + t.Callable[[ResponseClass], ResponseClass], + t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], +] +BeforeFirstRequestCallable = t.Union[ + t.Callable[[], None], t.Callable[[], t.Awaitable[None]] +] +BeforeRequestCallable = t.Union[ + t.Callable[[], t.Optional[ResponseReturnValue]], + t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], +] +ShellContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] +TeardownCallable = t.Union[ + t.Callable[[t.Optional[BaseException]], None], + t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], +] +TemplateContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] +TemplateFilterCallable = t.Callable[..., t.Any] +TemplateGlobalCallable = t.Callable[..., t.Any] +TemplateTestCallable = t.Callable[..., bool] +URLDefaultCallable = t.Callable[[str, dict], None] +URLValuePreprocessorCallable = t.Callable[[t.Optional[str], t.Optional[dict]], None] + +# This should take Exception, but that either breaks typing the argument +# with a specific exception, or decorating multiple times with different +# exceptions (and using a union type on the argument). +# https://github.com/pallets/flask/issues/4095 +# https://github.com/pallets/flask/issues/4295 +# https://github.com/pallets/flask/issues/4297 +ErrorHandlerCallable = t.Callable[[t.Any], ResponseReturnValue] + +RouteCallable = t.Union[ + t.Callable[..., ResponseReturnValue], + t.Callable[..., t.Awaitable[ResponseReturnValue]], +] diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/views.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/views.py new file mode 100644 index 0000000..c7a2b62 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/views.py @@ -0,0 +1,190 @@ +from __future__ import annotations + +import typing as t + +from . import typing as ft +from .globals import current_app +from .globals import request + + +http_method_funcs = frozenset( + ["get", "post", "head", "options", "delete", "put", "trace", "patch"] +) + + +class View: + """Subclass this class and override :meth:`dispatch_request` to + create a generic class-based view. Call :meth:`as_view` to create a + view function that creates an instance of the class with the given + arguments and calls its ``dispatch_request`` method with any URL + variables. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class Hello(View): + init_every_request = False + + def dispatch_request(self, name): + return f"Hello, {name}!" + + app.add_url_rule( + "/hello/", view_func=Hello.as_view("hello") + ) + + Set :attr:`methods` on the class to change what methods the view + accepts. + + Set :attr:`decorators` on the class to apply a list of decorators to + the generated view function. Decorators applied to the class itself + will not be applied to the generated view function! + + Set :attr:`init_every_request` to ``False`` for efficiency, unless + you need to store request-global data on ``self``. + """ + + #: The methods this view is registered for. Uses the same default + #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and + #: ``add_url_rule`` by default. + methods: t.ClassVar[t.Collection[str] | None] = None + + #: Control whether the ``OPTIONS`` method is handled automatically. + #: Uses the same default (``True``) as ``route`` and + #: ``add_url_rule`` by default. + provide_automatic_options: t.ClassVar[bool | None] = None + + #: A list of decorators to apply, in order, to the generated view + #: function. Remember that ``@decorator`` syntax is applied bottom + #: to top, so the first decorator in the list would be the bottom + #: decorator. + #: + #: .. versionadded:: 0.8 + decorators: t.ClassVar[list[t.Callable]] = [] + + #: Create a new instance of this view class for every request by + #: default. If a view subclass sets this to ``False``, the same + #: instance is used for every request. + #: + #: A single instance is more efficient, especially if complex setup + #: is done during init. However, storing data on ``self`` is no + #: longer safe across requests, and :data:`~flask.g` should be used + #: instead. + #: + #: .. versionadded:: 2.2 + init_every_request: t.ClassVar[bool] = True + + def dispatch_request(self) -> ft.ResponseReturnValue: + """The actual view function behavior. Subclasses must override + this and return a valid response. Any variables from the URL + rule are passed as keyword arguments. + """ + raise NotImplementedError() + + @classmethod + def as_view( + cls, name: str, *class_args: t.Any, **class_kwargs: t.Any + ) -> ft.RouteCallable: + """Convert the class into a view function that can be registered + for a route. + + By default, the generated view will create a new instance of the + view class for every request and call its + :meth:`dispatch_request` method. If the view class sets + :attr:`init_every_request` to ``False``, the same instance will + be used for every request. + + Except for ``name``, all other arguments passed to this method + are forwarded to the view class ``__init__`` method. + + .. versionchanged:: 2.2 + Added the ``init_every_request`` class attribute. + """ + if cls.init_every_request: + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + self = view.view_class( # type: ignore[attr-defined] + *class_args, **class_kwargs + ) + return current_app.ensure_sync(self.dispatch_request)(**kwargs) + + else: + self = cls(*class_args, **class_kwargs) + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + return current_app.ensure_sync(self.dispatch_request)(**kwargs) + + if cls.decorators: + view.__name__ = name + view.__module__ = cls.__module__ + for decorator in cls.decorators: + view = decorator(view) + + # We attach the view class to the view function for two reasons: + # first of all it allows us to easily figure out what class-based + # view this thing came from, secondly it's also used for instantiating + # the view class so you can actually replace it with something else + # for testing purposes and debugging. + view.view_class = cls # type: ignore + view.__name__ = name + view.__doc__ = cls.__doc__ + view.__module__ = cls.__module__ + view.methods = cls.methods # type: ignore + view.provide_automatic_options = cls.provide_automatic_options # type: ignore + return view + + +class MethodView(View): + """Dispatches request methods to the corresponding instance methods. + For example, if you implement a ``get`` method, it will be used to + handle ``GET`` requests. + + This can be useful for defining a REST API. + + :attr:`methods` is automatically set based on the methods defined on + the class. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class CounterAPI(MethodView): + def get(self): + return str(session.get("counter", 0)) + + def post(self): + session["counter"] = session.get("counter", 0) + 1 + return redirect(url_for("counter")) + + app.add_url_rule( + "/counter", view_func=CounterAPI.as_view("counter") + ) + """ + + def __init_subclass__(cls, **kwargs: t.Any) -> None: + super().__init_subclass__(**kwargs) + + if "methods" not in cls.__dict__: + methods = set() + + for base in cls.__bases__: + if getattr(base, "methods", None): + methods.update(base.methods) # type: ignore[attr-defined] + + for key in http_method_funcs: + if hasattr(cls, key): + methods.add(key.upper()) + + if methods: + cls.methods = methods + + def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: + meth = getattr(self, request.method.lower(), None) + + # If the request method is HEAD and we don't have a handler for it + # retry with GET. + if meth is None and request.method == "HEAD": + meth = getattr(self, "get", None) + + assert meth is not None, f"Unimplemented method {request.method!r}" + return current_app.ensure_sync(meth)(**kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/wrappers.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/wrappers.py new file mode 100644 index 0000000..ef7aa38 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask/wrappers.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import typing as t + +from werkzeug.exceptions import BadRequest +from werkzeug.wrappers import Request as RequestBase +from werkzeug.wrappers import Response as ResponseBase + +from . import json +from .globals import current_app +from .helpers import _split_blueprint_path + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.routing import Rule + + +class Request(RequestBase): + """The request object used by default in Flask. Remembers the + matched endpoint and view arguments. + + It is what ends up as :class:`~flask.request`. If you want to replace + the request object used you can subclass this and set + :attr:`~flask.Flask.request_class` to your subclass. + + The request object is a :class:`~werkzeug.wrappers.Request` subclass and + provides all of the attributes Werkzeug defines plus a few Flask + specific ones. + """ + + json_module: t.Any = json + + #: The internal URL rule that matched the request. This can be + #: useful to inspect which methods are allowed for the URL from + #: a before/after handler (``request.url_rule.methods``) etc. + #: Though if the request's method was invalid for the URL rule, + #: the valid list is available in ``routing_exception.valid_methods`` + #: instead (an attribute of the Werkzeug exception + #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) + #: because the request was never internally bound. + #: + #: .. versionadded:: 0.6 + url_rule: Rule | None = None + + #: A dict of view arguments that matched the request. If an exception + #: happened when matching, this will be ``None``. + view_args: dict[str, t.Any] | None = None + + #: If matching the URL failed, this is the exception that will be + #: raised / was raised as part of the request handling. This is + #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or + #: something similar. + routing_exception: Exception | None = None + + @property + def max_content_length(self) -> int | None: # type: ignore + """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" + if current_app: + return current_app.config["MAX_CONTENT_LENGTH"] + else: + return None + + @property + def endpoint(self) -> str | None: + """The endpoint that matched the request URL. + + This will be ``None`` if matching failed or has not been + performed yet. + + This in combination with :attr:`view_args` can be used to + reconstruct the same URL or a modified URL. + """ + if self.url_rule is not None: + return self.url_rule.endpoint + + return None + + @property + def blueprint(self) -> str | None: + """The registered name of the current blueprint. + + This will be ``None`` if the endpoint is not part of a + blueprint, or if URL matching failed or has not been performed + yet. + + This does not necessarily match the name the blueprint was + created with. It may have been nested, or registered with a + different name. + """ + endpoint = self.endpoint + + if endpoint is not None and "." in endpoint: + return endpoint.rpartition(".")[0] + + return None + + @property + def blueprints(self) -> list[str]: + """The registered names of the current blueprint upwards through + parent blueprints. + + This will be an empty list if there is no current blueprint, or + if URL matching failed. + + .. versionadded:: 2.0.1 + """ + name = self.blueprint + + if name is None: + return [] + + return _split_blueprint_path(name) + + def _load_form_data(self) -> None: + super()._load_form_data() + + # In debug mode we're replacing the files multidict with an ad-hoc + # subclass that raises a different error for key errors. + if ( + current_app + and current_app.debug + and self.mimetype != "multipart/form-data" + and not self.files + ): + from .debughelpers import attach_enctype_error_multidict + + attach_enctype_error_multidict(self) + + def on_json_loading_failed(self, e: ValueError | None) -> t.Any: + try: + return super().on_json_loading_failed(e) + except BadRequest as e: + if current_app and current_app.debug: + raise + + raise BadRequest() from e + + +class Response(ResponseBase): + """The response object that is used by default in Flask. Works like the + response object from Werkzeug but is set to have an HTML mimetype by + default. Quite often you don't have to create this object yourself because + :meth:`~flask.Flask.make_response` will take care of that for you. + + If you want to replace the response object used you can subclass this and + set :attr:`~flask.Flask.response_class` to your subclass. + + .. versionchanged:: 1.0 + JSON support is added to the response, like the request. This is useful + when testing to get the test client response data as JSON. + + .. versionchanged:: 1.0 + + Added :attr:`max_cookie_size`. + """ + + default_mimetype: str | None = "text/html" + + json_module = json + + autocorrect_location_header = False + + @property + def max_cookie_size(self) -> int: # type: ignore + """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. + + See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in + Werkzeug's docs. + """ + if current_app: + return current_app.config["MAX_COOKIE_SIZE"] + + # return Werkzeug's default when not in an app context + return super().max_cookie_size diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__init__.py b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__init__.py new file mode 100644 index 0000000..4cefb12 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__init__.py @@ -0,0 +1,288 @@ +import warnings + +from flask import current_app, Markup, Blueprint, url_for +from wtforms import BooleanField, HiddenField + +CDN_BASE = 'https://cdn.jsdelivr.net/npm' + + +def is_hidden_field_filter(field): + return isinstance(field, HiddenField) + + +def raise_helper(message): # pragma: no cover + raise RuntimeError(message) + + +def get_table_titles(data, primary_key, primary_key_title): + """Detect and build the table titles tuple from ORM object, currently only support SQLAlchemy. + + .. versionadded:: 1.4.0 + """ + if not data: + return [] + titles = [] + for k in data[0].__table__.columns.keys(): + if not k.startswith('_'): + titles.append((k, k.replace('_', ' ').title())) + titles[0] = (primary_key, primary_key_title) + return titles + + +class _Bootstrap: + """ + Base extension class for different Bootstrap versions. + + .. versionadded:: 2.0.0 + """ + + bootstrap_version = None + jquery_version = None + popper_version = None + bootstrap_css_integrity = None + bootstrap_js_integrity = None + jquery_integrity = None + popper_integrity = None + static_folder = None + bootstrap_css_filename = 'bootstrap.min.css' + bootstrap_js_filename = 'bootstrap.min.js' + jquery_filename = 'jquery.min.js' + popper_filename = 'popper.min.js' + + def __init__(self, app=None): + if app is not None: + self.init_app(app) + + def init_app(self, app): + + if not hasattr(app, 'extensions'): + app.extensions = {} + app.extensions['bootstrap'] = self + + blueprint = Blueprint('bootstrap', __name__, static_folder=f'static/{self.static_folder}', + static_url_path=f'/bootstrap{app.static_url_path}', + template_folder='templates') + app.register_blueprint(blueprint) + + app.jinja_env.globals['bootstrap'] = self + app.jinja_env.globals['bootstrap_is_hidden_field'] = is_hidden_field_filter + app.jinja_env.globals['get_table_titles'] = get_table_titles + app.jinja_env.globals['warn'] = warnings.warn + app.jinja_env.globals['raise'] = raise_helper + app.jinja_env.add_extension('jinja2.ext.do') + # default settings + app.config.setdefault('BOOTSTRAP_SERVE_LOCAL', False) + app.config.setdefault('BOOTSTRAP_BTN_STYLE', 'primary') + app.config.setdefault('BOOTSTRAP_BTN_SIZE', 'md') + app.config.setdefault('BOOTSTRAP_BOOTSWATCH_THEME', None) + app.config.setdefault('BOOTSTRAP_ICON_SIZE', '1em') + app.config.setdefault('BOOTSTRAP_ICON_COLOR', None) + app.config.setdefault('BOOTSTRAP_MSG_CATEGORY', 'primary') + app.config.setdefault('BOOTSTRAP_TABLE_VIEW_TITLE', 'View') + app.config.setdefault('BOOTSTRAP_TABLE_EDIT_TITLE', 'Edit') + app.config.setdefault('BOOTSTRAP_TABLE_DELETE_TITLE', 'Delete') + app.config.setdefault('BOOTSTRAP_TABLE_NEW_TITLE', 'New') + app.config.setdefault('BOOTSTRAP_FORM_GROUP_CLASSES', 'mb-3') # Bootstrap 5 only + app.config.setdefault( + 'BOOTSTRAP_FORM_INLINE_CLASSES', + 'row row-cols-lg-auto g-3 align-items-center' + ) # Bootstrap 5 only + + def load_css(self, version=None, bootstrap_sri=None): + """Load Bootstrap's css resources with given version. + + .. versionadded:: 0.1.0 + + :param version: The version of Bootstrap. + """ + serve_local = current_app.config['BOOTSTRAP_SERVE_LOCAL'] + bootswatch_theme = current_app.config['BOOTSTRAP_BOOTSWATCH_THEME'] + if version is None: + version = self.bootstrap_version + bootstrap_sri = self._get_sri('bootstrap_css', version, bootstrap_sri) + + if serve_local: + if not bootswatch_theme: + base_path = 'css' + else: + base_path = f'css/bootswatch/{bootswatch_theme.lower()}' + boostrap_url = url_for('bootstrap.static', filename=f'{base_path}/{self.bootstrap_css_filename}') + else: + if not bootswatch_theme: + base_path = f'{CDN_BASE}/bootstrap@{version}/dist/css' + else: + base_path = f'{CDN_BASE}/bootswatch@{version}/dist/{bootswatch_theme.lower()}' + boostrap_url = f'{base_path}/{self.bootstrap_css_filename}' + + if bootstrap_sri and not bootswatch_theme: + css = f'' + else: + css = f'' + return Markup(css) + + def _get_js_script(self, version, name, sri, nonce): + """Get ' + + def _get_sri(self, name, version, sri): + serve_local = current_app.config['BOOTSTRAP_SERVE_LOCAL'] + sris = { + 'bootstrap_css': self.bootstrap_css_integrity, + 'bootstrap_js': self.bootstrap_js_integrity, + 'jquery': self.jquery_integrity, + 'popper': self.popper_integrity, + } + versions = { + 'bootstrap_css': self.bootstrap_version, + 'bootstrap_js': self.bootstrap_version, + 'jquery': self.jquery_version, + 'popper': self.popper_version + } + if sri is not None: + return sri + if version == versions[name] and serve_local is False: + return sris[name] + return None + + def load_js(self, version=None, jquery_version=None, # noqa: C901 + popper_version=None, with_jquery=True, with_popper=True, + bootstrap_sri=None, jquery_sri=None, popper_sri=None, + nonce=None): + """Load Bootstrap and related library's js resources with given version. + + .. versionadded:: 0.1.0 + + :param version: The version of Bootstrap. + :param jquery_version: The version of jQuery (only needed with Bootstrap 4). + :param popper_version: The version of Popper.js. + :param with_jquery: Include jQuery or not (only needed with Bootstrap 4). + :param with_popper: Include Popper.js or not. + :param bootstrap_sri: The integrity attribute value of Bootstrap for SRI + :param jquery_sri: The integrity attribute value of jQuery for SRI + :param popper_sri: The integrity attribute value of Popper.js for SRI + :param nonce: The nonce attribute value for use with strict CSP + """ + if version is None: + version = self.bootstrap_version + if popper_version is None: + popper_version = self.popper_version + + bootstrap_sri = self._get_sri('bootstrap_js', version, bootstrap_sri) + popper_sri = self._get_sri('popper', popper_version, popper_sri) + bootstrap = self._get_js_script(version, 'bootstrap', bootstrap_sri, nonce) + popper = self._get_js_script(popper_version, self.popper_name, popper_sri, nonce) if with_popper else '' + if version.startswith('4'): + if jquery_version is None: + jquery_version = self.jquery_version + jquery_sri = self._get_sri('jquery', jquery_version, jquery_sri) + jquery = self._get_js_script(jquery_version, 'jquery', jquery_sri, nonce) if with_jquery else '' + return Markup(f'''{jquery} + {popper} + {bootstrap}''') + return Markup(f'''{popper} + {bootstrap}''') + + +class Bootstrap4(_Bootstrap): + """ + Extension class for Bootstrap 4. + + Initialize the extension:: + + from flask import Flask + from flask_bootstrap import Bootstrap4 + + app = Flask(__name__) + bootstrap = Bootstrap4(app) + + Or with the application factory:: + + from flask import Flask + from flask_bootstrap import Bootstrap4 + + bootstrap = Bootstrap4() + + def create_app(): + app = Flask(__name__) + bootstrap.init_app(app) + + .. versionchanged:: 2.0.0 + Move common logic to base class ``_Bootstrap``. + """ + bootstrap_version = '4.6.1' + jquery_version = '3.5.1' + popper_version = '1.16.1' + bootstrap_css_integrity = 'sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn' + bootstrap_js_integrity = 'sha384-VHvPCCyXqtD5DqJeNxl2dtTyhF78xXNXdkwX1CZeRusQfRKp+tA7hAShOK/B/fQ2' + jquery_integrity = 'sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=' + popper_integrity = 'sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN' + popper_name = 'popper.js' + static_folder = 'bootstrap4' + + +class Bootstrap5(_Bootstrap): + """ + Base class for Bootstrap 5. + + Initialize the extension:: + + from flask import Flask + from flask_bootstrap import Bootstrap5 + + app = Flask(__name__) + bootstrap = Bootstrap5(app) + + Or with the application factory:: + + from flask import Flask + from flask_bootstrap import Bootstrap5 + + bootstrap = Bootstrap5() + + def create_app(): + app = Flask(__name__) + bootstrap.init_app(app) + + .. versionadded:: 2.0.0 + """ + bootstrap_version = '5.2.2' + popper_version = '2.11.6' + bootstrap_css_integrity = 'sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi' + bootstrap_js_integrity = 'sha384-IDwe1+LCz02ROU9k972gdyvl+AESN10+x7tBKgc9I5HFtuNz0wWnPclzo6p9vxnk' + popper_integrity = 'sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3' + popper_name = '@popperjs/core' + static_folder = 'bootstrap5' + + +class Bootstrap(Bootstrap4): + def __init__(self, app=None): + super().__init__(app=app) + warnings.warn( + 'For Bootstrap 4, please import and use "Bootstrap4" class, the "Bootstrap" class ' + 'is deprecated and will be removed in 3.0.', + stacklevel=2 + ) + + +class SwitchField(BooleanField): + """ + A wrapper field for ``BooleanField`` that renders as a Bootstrap switch. + + .. versionadded:: 2.0.0 + """ + + def __init__(self, label=None, **kwargs): + super().__init__(label, **kwargs) diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__pycache__/__init__.cpython-312.pyc b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5e8663dbf4564d6339a459accfec8b6c538d9f2 GIT binary patch literal 13154 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 MDT8T@0{^PO7lt~jd;kCd literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/.DS_Store b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a0c61889498c79b3f654fc617b20b0e873558956 GIT binary patch literal 8196 zcmeI1&u-H|5XNVdlsc+fqzpcQm$LtDT6LtWJY^{nPb(E}4E6ly|+O)-Sc9fS$TxM%%yqb8h$J~H-W zk1TA4B5dj*T^QIecXH~FgYhKm2BVj1>zR~Ec-{`e=W&19tKB@3={Shf{zwPJ zQ6Da^Uc_l6r(HQoqfE#8X27XB)n2VWn;je;G~C11yy4DT&Gv(a+v&9D^Qv>}&fSMk zd+(D$DnFTN3VW-dU9){re@4sB=A%DK6Pdn6kMiE47%U{ED>S}hbdkn_=T#GF-@gYU zo!=$0FrxyMT{@)?G@(9?=#2Jh07@zJv`9(ZE>POr5ILZLhRfHRP`}C|;nJG@|5)d9 z)%^d^6{+W2AYTUc0Y%HCNUh8-ODj`*{UaRgoC_ob<(M^Asa@3k{MR_RVgi>YP&Scu zmH$89{QdvZ`{zI=zyz*80Z}>jkGnX}^B3mgDXU!DMR|jwO!?(TbqFe*jze`i4!!up a5N#K(D#o*#8$}O{KLltDTrq*aO5hici$`Yw literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/.DS_Store b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..94196321b0f6a819a68154fbecb90af15cc202bd GIT binary patch literal 6148 zcmeHKPfrs;6n_I1wji>F7Qtw;u@@7FVj!R~hFUP%7z3dMi-2XfUCPRKrrF(6fspj5 zM?Zj{ftwd^p8N#fj2}U-p7hP14U}RuAu)#RYi53L-n{o_=eM1i9RMKNdigeh4geY! zj{BI2KwVMD782$n{zJ9CV0L67& zLaU#1S;=ylh2DItcz_H3(oZ2`La9Gzz)V%XGn~kDcp_8Ju}ls04{-dg));c_Z(^*5 zUsF%~-m1BdAB>NGCLNuz3tin>x7Mqz=eJlRADBVi&zjyUZ!IzATA^-Q%Z}YB>d9F~ z1Jj|lCjy+ZjV^1?99m|LEUVM9FJkkuLyK$iqCT|0KYeG+n4CNqGxn$NPK+5-QxgXV zaV?d;b#Jk_?N%v!Etms>JExF7g(18_idv;MDIN`cz zmtP#2mUe6ClRPqrbdNmSrXt_`=B954g`(c?mptaW3(R){htZW|y(?=zGM)?UYL0F) z9B~KPp09B?f7$kY#J2dtis^YKt=QS!b=S0Pcb;Zh5U^^&DKRRaykDfn=7MMQlhrh@GW0$9f!Qc_Ni}qC+|_0(F*p5v8|zJZ>hXm z@7YsD86pNE2F@7+e19;oaLg!dN)%fMR^keP7(=rV)cFSjk1-Tx6gDMd4+@c?h%%I@ zD+ZC_Xg8E!MqyK;3tM#6T+powBL(^Z()R@Bghq zQ7d8~V&GgcKw@+Gxhzgeovm$?<7cgbWdjQr?$?wkLasvAs}dos)&Jq%D^vJ$oy>p literal 0 HcmV?d00001 diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css new file mode 100644 index 0000000..6ee5956 --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.6.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css.map b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css.map new file mode 100644 index 0000000..4e6566a --- /dev/null +++ b/Visual Studio Code Projects/venv/lib/python3.12/site-packages/flask_bootstrap/static/bootstrap4/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_interactions.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v4.6.1 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `