This is page 10 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py:
--------------------------------------------------------------------------------
```python
1 | import configparser
2 | from typing import Dict, List, IO, Mapping, Optional
3 |
4 | from .default_styles import DEFAULT_STYLES
5 | from .style import Style, StyleType
6 |
7 |
8 | class Theme:
9 | """A container for style information, used by :class:`~rich.console.Console`.
10 |
11 | Args:
12 | styles (Dict[str, Style], optional): A mapping of style names on to styles. Defaults to None for a theme with no styles.
13 | inherit (bool, optional): Inherit default styles. Defaults to True.
14 | """
15 |
16 | styles: Dict[str, Style]
17 |
18 | def __init__(
19 | self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True
20 | ):
21 | self.styles = DEFAULT_STYLES.copy() if inherit else {}
22 | if styles is not None:
23 | self.styles.update(
24 | {
25 | name: style if isinstance(style, Style) else Style.parse(style)
26 | for name, style in styles.items()
27 | }
28 | )
29 |
30 | @property
31 | def config(self) -> str:
32 | """Get contents of a config file for this theme."""
33 | config = "[styles]\n" + "\n".join(
34 | f"{name} = {style}" for name, style in sorted(self.styles.items())
35 | )
36 | return config
37 |
38 | @classmethod
39 | def from_file(
40 | cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True
41 | ) -> "Theme":
42 | """Load a theme from a text mode file.
43 |
44 | Args:
45 | config_file (IO[str]): An open conf file.
46 | source (str, optional): The filename of the open file. Defaults to None.
47 | inherit (bool, optional): Inherit default styles. Defaults to True.
48 |
49 | Returns:
50 | Theme: A New theme instance.
51 | """
52 | config = configparser.ConfigParser()
53 | config.read_file(config_file, source=source)
54 | styles = {name: Style.parse(value) for name, value in config.items("styles")}
55 | theme = Theme(styles, inherit=inherit)
56 | return theme
57 |
58 | @classmethod
59 | def read(
60 | cls, path: str, inherit: bool = True, encoding: Optional[str] = None
61 | ) -> "Theme":
62 | """Read a theme from a path.
63 |
64 | Args:
65 | path (str): Path to a config file readable by Python configparser module.
66 | inherit (bool, optional): Inherit default styles. Defaults to True.
67 | encoding (str, optional): Encoding of the config file. Defaults to None.
68 |
69 | Returns:
70 | Theme: A new theme instance.
71 | """
72 | with open(path, "rt", encoding=encoding) as config_file:
73 | return cls.from_file(config_file, source=path, inherit=inherit)
74 |
75 |
76 | class ThemeStackError(Exception):
77 | """Base exception for errors related to the theme stack."""
78 |
79 |
80 | class ThemeStack:
81 | """A stack of themes.
82 |
83 | Args:
84 | theme (Theme): A theme instance
85 | """
86 |
87 | def __init__(self, theme: Theme) -> None:
88 | self._entries: List[Dict[str, Style]] = [theme.styles]
89 | self.get = self._entries[-1].get
90 |
91 | def push_theme(self, theme: Theme, inherit: bool = True) -> None:
92 | """Push a theme on the top of the stack.
93 |
94 | Args:
95 | theme (Theme): A Theme instance.
96 | inherit (boolean, optional): Inherit styles from current top of stack.
97 | """
98 | styles: Dict[str, Style]
99 | styles = (
100 | {**self._entries[-1], **theme.styles} if inherit else theme.styles.copy()
101 | )
102 | self._entries.append(styles)
103 | self.get = self._entries[-1].get
104 |
105 | def pop_theme(self) -> None:
106 | """Pop (and discard) the top-most theme."""
107 | if len(self._entries) == 1:
108 | raise ThemeStackError("Unable to pop base theme")
109 | self._entries.pop()
110 | self.get = self._entries[-1].get
111 |
112 |
113 | if __name__ == "__main__": # pragma: no cover
114 | theme = Theme()
115 | print(theme.config)
116 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/xmlautomata.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: API to build regexp automata
3 | * Description: the API to build regexp automata
4 | *
5 | * Copy: See Copyright for the status of this software.
6 | *
7 | * Author: Daniel Veillard
8 | */
9 |
10 | #ifndef __XML_AUTOMATA_H__
11 | #define __XML_AUTOMATA_H__
12 |
13 | #include <libxml/xmlversion.h>
14 |
15 | #ifdef LIBXML_REGEXP_ENABLED
16 | #ifdef LIBXML_AUTOMATA_ENABLED
17 |
18 | #include <libxml/xmlstring.h>
19 |
20 | #ifdef __cplusplus
21 | extern "C" {
22 | #endif
23 |
24 | /**
25 | * xmlAutomataPtr:
26 | *
27 | * A libxml automata description, It can be compiled into a regexp
28 | */
29 | typedef struct _xmlAutomata xmlAutomata;
30 | typedef xmlAutomata *xmlAutomataPtr;
31 |
32 | /**
33 | * xmlAutomataStatePtr:
34 | *
35 | * A state int the automata description,
36 | */
37 | typedef struct _xmlAutomataState xmlAutomataState;
38 | typedef xmlAutomataState *xmlAutomataStatePtr;
39 |
40 | /*
41 | * Building API
42 | */
43 | XMLPUBFUN xmlAutomataPtr
44 | xmlNewAutomata (void);
45 | XMLPUBFUN void
46 | xmlFreeAutomata (xmlAutomataPtr am);
47 |
48 | XMLPUBFUN xmlAutomataStatePtr
49 | xmlAutomataGetInitState (xmlAutomataPtr am);
50 | XMLPUBFUN int
51 | xmlAutomataSetFinalState (xmlAutomataPtr am,
52 | xmlAutomataStatePtr state);
53 | XMLPUBFUN xmlAutomataStatePtr
54 | xmlAutomataNewState (xmlAutomataPtr am);
55 | XMLPUBFUN xmlAutomataStatePtr
56 | xmlAutomataNewTransition (xmlAutomataPtr am,
57 | xmlAutomataStatePtr from,
58 | xmlAutomataStatePtr to,
59 | const xmlChar *token,
60 | void *data);
61 | XMLPUBFUN xmlAutomataStatePtr
62 | xmlAutomataNewTransition2 (xmlAutomataPtr am,
63 | xmlAutomataStatePtr from,
64 | xmlAutomataStatePtr to,
65 | const xmlChar *token,
66 | const xmlChar *token2,
67 | void *data);
68 | XMLPUBFUN xmlAutomataStatePtr
69 | xmlAutomataNewNegTrans (xmlAutomataPtr am,
70 | xmlAutomataStatePtr from,
71 | xmlAutomataStatePtr to,
72 | const xmlChar *token,
73 | const xmlChar *token2,
74 | void *data);
75 |
76 | XMLPUBFUN xmlAutomataStatePtr
77 | xmlAutomataNewCountTrans (xmlAutomataPtr am,
78 | xmlAutomataStatePtr from,
79 | xmlAutomataStatePtr to,
80 | const xmlChar *token,
81 | int min,
82 | int max,
83 | void *data);
84 | XMLPUBFUN xmlAutomataStatePtr
85 | xmlAutomataNewCountTrans2 (xmlAutomataPtr am,
86 | xmlAutomataStatePtr from,
87 | xmlAutomataStatePtr to,
88 | const xmlChar *token,
89 | const xmlChar *token2,
90 | int min,
91 | int max,
92 | void *data);
93 | XMLPUBFUN xmlAutomataStatePtr
94 | xmlAutomataNewOnceTrans (xmlAutomataPtr am,
95 | xmlAutomataStatePtr from,
96 | xmlAutomataStatePtr to,
97 | const xmlChar *token,
98 | int min,
99 | int max,
100 | void *data);
101 | XMLPUBFUN xmlAutomataStatePtr
102 | xmlAutomataNewOnceTrans2 (xmlAutomataPtr am,
103 | xmlAutomataStatePtr from,
104 | xmlAutomataStatePtr to,
105 | const xmlChar *token,
106 | const xmlChar *token2,
107 | int min,
108 | int max,
109 | void *data);
110 | XMLPUBFUN xmlAutomataStatePtr
111 | xmlAutomataNewAllTrans (xmlAutomataPtr am,
112 | xmlAutomataStatePtr from,
113 | xmlAutomataStatePtr to,
114 | int lax);
115 | XMLPUBFUN xmlAutomataStatePtr
116 | xmlAutomataNewEpsilon (xmlAutomataPtr am,
117 | xmlAutomataStatePtr from,
118 | xmlAutomataStatePtr to);
119 | XMLPUBFUN xmlAutomataStatePtr
120 | xmlAutomataNewCountedTrans (xmlAutomataPtr am,
121 | xmlAutomataStatePtr from,
122 | xmlAutomataStatePtr to,
123 | int counter);
124 | XMLPUBFUN xmlAutomataStatePtr
125 | xmlAutomataNewCounterTrans (xmlAutomataPtr am,
126 | xmlAutomataStatePtr from,
127 | xmlAutomataStatePtr to,
128 | int counter);
129 | XMLPUBFUN int
130 | xmlAutomataNewCounter (xmlAutomataPtr am,
131 | int min,
132 | int max);
133 |
134 | XMLPUBFUN struct _xmlRegexp *
135 | xmlAutomataCompile (xmlAutomataPtr am);
136 | XMLPUBFUN int
137 | xmlAutomataIsDeterminist (xmlAutomataPtr am);
138 |
139 | #ifdef __cplusplus
140 | }
141 | #endif
142 |
143 | #endif /* LIBXML_AUTOMATA_ENABLED */
144 | #endif /* LIBXML_REGEXP_ENABLED */
145 |
146 | #endif /* __XML_AUTOMATA_H__ */
147 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py:
--------------------------------------------------------------------------------
```python
1 | """Module containing bug report helper(s)."""
2 |
3 | import json
4 | import platform
5 | import ssl
6 | import sys
7 |
8 | from pip._vendor import idna
9 | from pip._vendor import urllib3
10 |
11 | from . import __version__ as requests_version
12 |
13 | charset_normalizer = None
14 | chardet = None
15 |
16 | try:
17 | from pip._vendor.urllib3.contrib import pyopenssl
18 | except ImportError:
19 | pyopenssl = None
20 | OpenSSL = None
21 | cryptography = None
22 | else:
23 | import cryptography
24 | import OpenSSL
25 |
26 |
27 | def _implementation():
28 | """Return a dict with the Python implementation and version.
29 |
30 | Provide both the name and the version of the Python implementation
31 | currently running. For example, on CPython 3.10.3 it will return
32 | {'name': 'CPython', 'version': '3.10.3'}.
33 |
34 | This function works best on CPython and PyPy: in particular, it probably
35 | doesn't work for Jython or IronPython. Future investigation should be done
36 | to work out the correct shape of the code for those platforms.
37 | """
38 | implementation = platform.python_implementation()
39 |
40 | if implementation == "CPython":
41 | implementation_version = platform.python_version()
42 | elif implementation == "PyPy":
43 | implementation_version = "{}.{}.{}".format(
44 | sys.pypy_version_info.major,
45 | sys.pypy_version_info.minor,
46 | sys.pypy_version_info.micro,
47 | )
48 | if sys.pypy_version_info.releaselevel != "final":
49 | implementation_version = "".join(
50 | [implementation_version, sys.pypy_version_info.releaselevel]
51 | )
52 | elif implementation == "Jython":
53 | implementation_version = platform.python_version() # Complete Guess
54 | elif implementation == "IronPython":
55 | implementation_version = platform.python_version() # Complete Guess
56 | else:
57 | implementation_version = "Unknown"
58 |
59 | return {"name": implementation, "version": implementation_version}
60 |
61 |
62 | def info():
63 | """Generate information for a bug report."""
64 | try:
65 | platform_info = {
66 | "system": platform.system(),
67 | "release": platform.release(),
68 | }
69 | except OSError:
70 | platform_info = {
71 | "system": "Unknown",
72 | "release": "Unknown",
73 | }
74 |
75 | implementation_info = _implementation()
76 | urllib3_info = {"version": urllib3.__version__}
77 | charset_normalizer_info = {"version": None}
78 | chardet_info = {"version": None}
79 | if charset_normalizer:
80 | charset_normalizer_info = {"version": charset_normalizer.__version__}
81 | if chardet:
82 | chardet_info = {"version": chardet.__version__}
83 |
84 | pyopenssl_info = {
85 | "version": None,
86 | "openssl_version": "",
87 | }
88 | if OpenSSL:
89 | pyopenssl_info = {
90 | "version": OpenSSL.__version__,
91 | "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}",
92 | }
93 | cryptography_info = {
94 | "version": getattr(cryptography, "__version__", ""),
95 | }
96 | idna_info = {
97 | "version": getattr(idna, "__version__", ""),
98 | }
99 |
100 | system_ssl = ssl.OPENSSL_VERSION_NUMBER
101 | system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""}
102 |
103 | return {
104 | "platform": platform_info,
105 | "implementation": implementation_info,
106 | "system_ssl": system_ssl_info,
107 | "using_pyopenssl": pyopenssl is not None,
108 | "using_charset_normalizer": chardet is None,
109 | "pyOpenSSL": pyopenssl_info,
110 | "urllib3": urllib3_info,
111 | "chardet": chardet_info,
112 | "charset_normalizer": charset_normalizer_info,
113 | "cryptography": cryptography_info,
114 | "idna": idna_info,
115 | "requests": {
116 | "version": requests_version,
117 | },
118 | }
119 |
120 |
121 | def main():
122 | """Pretty-print the bug information as JSON."""
123 | print(json.dumps(info(), sort_keys=True, indent=2))
124 |
125 |
126 | if __name__ == "__main__":
127 | main()
128 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/requests/help.py:
--------------------------------------------------------------------------------
```python
1 | """Module containing bug report helper(s)."""
2 |
3 | import json
4 | import platform
5 | import ssl
6 | import sys
7 |
8 | import idna
9 | import urllib3
10 |
11 | from . import __version__ as requests_version
12 |
13 | try:
14 | import charset_normalizer
15 | except ImportError:
16 | charset_normalizer = None
17 |
18 | try:
19 | import chardet
20 | except ImportError:
21 | chardet = None
22 |
23 | try:
24 | from urllib3.contrib import pyopenssl
25 | except ImportError:
26 | pyopenssl = None
27 | OpenSSL = None
28 | cryptography = None
29 | else:
30 | import cryptography
31 | import OpenSSL
32 |
33 |
34 | def _implementation():
35 | """Return a dict with the Python implementation and version.
36 |
37 | Provide both the name and the version of the Python implementation
38 | currently running. For example, on CPython 3.10.3 it will return
39 | {'name': 'CPython', 'version': '3.10.3'}.
40 |
41 | This function works best on CPython and PyPy: in particular, it probably
42 | doesn't work for Jython or IronPython. Future investigation should be done
43 | to work out the correct shape of the code for those platforms.
44 | """
45 | implementation = platform.python_implementation()
46 |
47 | if implementation == "CPython":
48 | implementation_version = platform.python_version()
49 | elif implementation == "PyPy":
50 | implementation_version = "{}.{}.{}".format(
51 | sys.pypy_version_info.major,
52 | sys.pypy_version_info.minor,
53 | sys.pypy_version_info.micro,
54 | )
55 | if sys.pypy_version_info.releaselevel != "final":
56 | implementation_version = "".join(
57 | [implementation_version, sys.pypy_version_info.releaselevel]
58 | )
59 | elif implementation == "Jython":
60 | implementation_version = platform.python_version() # Complete Guess
61 | elif implementation == "IronPython":
62 | implementation_version = platform.python_version() # Complete Guess
63 | else:
64 | implementation_version = "Unknown"
65 |
66 | return {"name": implementation, "version": implementation_version}
67 |
68 |
69 | def info():
70 | """Generate information for a bug report."""
71 | try:
72 | platform_info = {
73 | "system": platform.system(),
74 | "release": platform.release(),
75 | }
76 | except OSError:
77 | platform_info = {
78 | "system": "Unknown",
79 | "release": "Unknown",
80 | }
81 |
82 | implementation_info = _implementation()
83 | urllib3_info = {"version": urllib3.__version__}
84 | charset_normalizer_info = {"version": None}
85 | chardet_info = {"version": None}
86 | if charset_normalizer:
87 | charset_normalizer_info = {"version": charset_normalizer.__version__}
88 | if chardet:
89 | chardet_info = {"version": chardet.__version__}
90 |
91 | pyopenssl_info = {
92 | "version": None,
93 | "openssl_version": "",
94 | }
95 | if OpenSSL:
96 | pyopenssl_info = {
97 | "version": OpenSSL.__version__,
98 | "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}",
99 | }
100 | cryptography_info = {
101 | "version": getattr(cryptography, "__version__", ""),
102 | }
103 | idna_info = {
104 | "version": getattr(idna, "__version__", ""),
105 | }
106 |
107 | system_ssl = ssl.OPENSSL_VERSION_NUMBER
108 | system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""}
109 |
110 | return {
111 | "platform": platform_info,
112 | "implementation": implementation_info,
113 | "system_ssl": system_ssl_info,
114 | "using_pyopenssl": pyopenssl is not None,
115 | "using_charset_normalizer": chardet is None,
116 | "pyOpenSSL": pyopenssl_info,
117 | "urllib3": urllib3_info,
118 | "chardet": chardet_info,
119 | "charset_normalizer": charset_normalizer_info,
120 | "cryptography": cryptography_info,
121 | "idna": idna_info,
122 | "requests": {
123 | "version": requests_version,
124 | },
125 | }
126 |
127 |
128 | def main():
129 | """Pretty-print the bug information as JSON."""
130 | print(json.dumps(info(), sort_keys=True, indent=2))
131 |
132 |
133 | if __name__ == "__main__":
134 | main()
135 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Package containing all pip commands
3 | """
4 |
5 | import importlib
6 | from collections import namedtuple
7 | from typing import Any, Dict, Optional
8 |
9 | from pip._internal.cli.base_command import Command
10 |
11 | CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary")
12 |
13 | # This dictionary does a bunch of heavy lifting for help output:
14 | # - Enables avoiding additional (costly) imports for presenting `--help`.
15 | # - The ordering matters for help display.
16 | #
17 | # Even though the module path starts with the same "pip._internal.commands"
18 | # prefix, the full path makes testing easier (specifically when modifying
19 | # `commands_dict` in test setup / teardown).
20 | commands_dict: Dict[str, CommandInfo] = {
21 | "install": CommandInfo(
22 | "pip._internal.commands.install",
23 | "InstallCommand",
24 | "Install packages.",
25 | ),
26 | "download": CommandInfo(
27 | "pip._internal.commands.download",
28 | "DownloadCommand",
29 | "Download packages.",
30 | ),
31 | "uninstall": CommandInfo(
32 | "pip._internal.commands.uninstall",
33 | "UninstallCommand",
34 | "Uninstall packages.",
35 | ),
36 | "freeze": CommandInfo(
37 | "pip._internal.commands.freeze",
38 | "FreezeCommand",
39 | "Output installed packages in requirements format.",
40 | ),
41 | "inspect": CommandInfo(
42 | "pip._internal.commands.inspect",
43 | "InspectCommand",
44 | "Inspect the python environment.",
45 | ),
46 | "list": CommandInfo(
47 | "pip._internal.commands.list",
48 | "ListCommand",
49 | "List installed packages.",
50 | ),
51 | "show": CommandInfo(
52 | "pip._internal.commands.show",
53 | "ShowCommand",
54 | "Show information about installed packages.",
55 | ),
56 | "check": CommandInfo(
57 | "pip._internal.commands.check",
58 | "CheckCommand",
59 | "Verify installed packages have compatible dependencies.",
60 | ),
61 | "config": CommandInfo(
62 | "pip._internal.commands.configuration",
63 | "ConfigurationCommand",
64 | "Manage local and global configuration.",
65 | ),
66 | "search": CommandInfo(
67 | "pip._internal.commands.search",
68 | "SearchCommand",
69 | "Search PyPI for packages.",
70 | ),
71 | "cache": CommandInfo(
72 | "pip._internal.commands.cache",
73 | "CacheCommand",
74 | "Inspect and manage pip's wheel cache.",
75 | ),
76 | "index": CommandInfo(
77 | "pip._internal.commands.index",
78 | "IndexCommand",
79 | "Inspect information available from package indexes.",
80 | ),
81 | "wheel": CommandInfo(
82 | "pip._internal.commands.wheel",
83 | "WheelCommand",
84 | "Build wheels from your requirements.",
85 | ),
86 | "hash": CommandInfo(
87 | "pip._internal.commands.hash",
88 | "HashCommand",
89 | "Compute hashes of package archives.",
90 | ),
91 | "completion": CommandInfo(
92 | "pip._internal.commands.completion",
93 | "CompletionCommand",
94 | "A helper command used for command completion.",
95 | ),
96 | "debug": CommandInfo(
97 | "pip._internal.commands.debug",
98 | "DebugCommand",
99 | "Show information useful for debugging.",
100 | ),
101 | "help": CommandInfo(
102 | "pip._internal.commands.help",
103 | "HelpCommand",
104 | "Show help for commands.",
105 | ),
106 | }
107 |
108 |
109 | def create_command(name: str, **kwargs: Any) -> Command:
110 | """
111 | Create an instance of the Command class with the given name.
112 | """
113 | module_path, class_name, summary = commands_dict[name]
114 | module = importlib.import_module(module_path)
115 | command_class = getattr(module, class_name)
116 | command = command_class(name=name, summary=summary, **kwargs)
117 |
118 | return command
119 |
120 |
121 | def get_similar_commands(name: str) -> Optional[str]:
122 | """Command name auto-correct."""
123 | from difflib import get_close_matches
124 |
125 | name = name.lower()
126 |
127 | close_commands = get_close_matches(name, commands_dict.keys())
128 |
129 | if close_commands:
130 | return close_commands[0]
131 | else:
132 | return None
133 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | from optparse import Values
3 | from typing import List
4 |
5 | from pip._vendor.packaging.utils import canonicalize_name
6 |
7 | from pip._internal.cli import cmdoptions
8 | from pip._internal.cli.base_command import Command
9 | from pip._internal.cli.index_command import SessionCommandMixin
10 | from pip._internal.cli.status_codes import SUCCESS
11 | from pip._internal.exceptions import InstallationError
12 | from pip._internal.req import parse_requirements
13 | from pip._internal.req.constructors import (
14 | install_req_from_line,
15 | install_req_from_parsed_requirement,
16 | )
17 | from pip._internal.utils.misc import (
18 | check_externally_managed,
19 | protect_pip_from_modification_on_windows,
20 | warn_if_run_as_root,
21 | )
22 |
23 | logger = logging.getLogger(__name__)
24 |
25 |
26 | class UninstallCommand(Command, SessionCommandMixin):
27 | """
28 | Uninstall packages.
29 |
30 | pip is able to uninstall most installed packages. Known exceptions are:
31 |
32 | - Pure distutils packages installed with ``python setup.py install``, which
33 | leave behind no metadata to determine what files were installed.
34 | - Script wrappers installed by ``python setup.py develop``.
35 | """
36 |
37 | usage = """
38 | %prog [options] <package> ...
39 | %prog [options] -r <requirements file> ..."""
40 |
41 | def add_options(self) -> None:
42 | self.cmd_opts.add_option(
43 | "-r",
44 | "--requirement",
45 | dest="requirements",
46 | action="append",
47 | default=[],
48 | metavar="file",
49 | help=(
50 | "Uninstall all the packages listed in the given requirements "
51 | "file. This option can be used multiple times."
52 | ),
53 | )
54 | self.cmd_opts.add_option(
55 | "-y",
56 | "--yes",
57 | dest="yes",
58 | action="store_true",
59 | help="Don't ask for confirmation of uninstall deletions.",
60 | )
61 | self.cmd_opts.add_option(cmdoptions.root_user_action())
62 | self.cmd_opts.add_option(cmdoptions.override_externally_managed())
63 | self.parser.insert_option_group(0, self.cmd_opts)
64 |
65 | def run(self, options: Values, args: List[str]) -> int:
66 | session = self.get_default_session(options)
67 |
68 | reqs_to_uninstall = {}
69 | for name in args:
70 | req = install_req_from_line(
71 | name,
72 | isolated=options.isolated_mode,
73 | )
74 | if req.name:
75 | reqs_to_uninstall[canonicalize_name(req.name)] = req
76 | else:
77 | logger.warning(
78 | "Invalid requirement: %r ignored -"
79 | " the uninstall command expects named"
80 | " requirements.",
81 | name,
82 | )
83 | for filename in options.requirements:
84 | for parsed_req in parse_requirements(
85 | filename, options=options, session=session
86 | ):
87 | req = install_req_from_parsed_requirement(
88 | parsed_req, isolated=options.isolated_mode
89 | )
90 | if req.name:
91 | reqs_to_uninstall[canonicalize_name(req.name)] = req
92 | if not reqs_to_uninstall:
93 | raise InstallationError(
94 | f"You must give at least one requirement to {self.name} (see "
95 | f'"pip help {self.name}")'
96 | )
97 |
98 | if not options.override_externally_managed:
99 | check_externally_managed()
100 |
101 | protect_pip_from_modification_on_windows(
102 | modifying_pip="pip" in reqs_to_uninstall
103 | )
104 |
105 | for req in reqs_to_uninstall.values():
106 | uninstall_pathset = req.uninstall(
107 | auto_confirm=options.yes,
108 | verbose=self.verbosity > 0,
109 | )
110 | if uninstall_pathset:
111 | uninstall_pathset.commit()
112 | if options.root_user_action == "warn":
113 | warn_if_run_as_root()
114 | return SUCCESS
115 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/network/cache.py:
--------------------------------------------------------------------------------
```python
1 | """HTTP cache implementation.
2 | """
3 |
4 | import os
5 | from contextlib import contextmanager
6 | from datetime import datetime
7 | from typing import BinaryIO, Generator, Optional, Union
8 |
9 | from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache
10 | from pip._vendor.cachecontrol.caches import SeparateBodyFileCache
11 | from pip._vendor.requests.models import Response
12 |
13 | from pip._internal.utils.filesystem import adjacent_tmp_file, replace
14 | from pip._internal.utils.misc import ensure_dir
15 |
16 |
17 | def is_from_cache(response: Response) -> bool:
18 | return getattr(response, "from_cache", False)
19 |
20 |
21 | @contextmanager
22 | def suppressed_cache_errors() -> Generator[None, None, None]:
23 | """If we can't access the cache then we can just skip caching and process
24 | requests as if caching wasn't enabled.
25 | """
26 | try:
27 | yield
28 | except OSError:
29 | pass
30 |
31 |
32 | class SafeFileCache(SeparateBodyBaseCache):
33 | """
34 | A file based cache which is safe to use even when the target directory may
35 | not be accessible or writable.
36 |
37 | There is a race condition when two processes try to write and/or read the
38 | same entry at the same time, since each entry consists of two separate
39 | files (https://github.com/psf/cachecontrol/issues/324). We therefore have
40 | additional logic that makes sure that both files to be present before
41 | returning an entry; this fixes the read side of the race condition.
42 |
43 | For the write side, we assume that the server will only ever return the
44 | same data for the same URL, which ought to be the case for files pip is
45 | downloading. PyPI does not have a mechanism to swap out a wheel for
46 | another wheel, for example. If this assumption is not true, the
47 | CacheControl issue will need to be fixed.
48 | """
49 |
50 | def __init__(self, directory: str) -> None:
51 | assert directory is not None, "Cache directory must not be None."
52 | super().__init__()
53 | self.directory = directory
54 |
55 | def _get_cache_path(self, name: str) -> str:
56 | # From cachecontrol.caches.file_cache.FileCache._fn, brought into our
57 | # class for backwards-compatibility and to avoid using a non-public
58 | # method.
59 | hashed = SeparateBodyFileCache.encode(name)
60 | parts = list(hashed[:5]) + [hashed]
61 | return os.path.join(self.directory, *parts)
62 |
63 | def get(self, key: str) -> Optional[bytes]:
64 | # The cache entry is only valid if both metadata and body exist.
65 | metadata_path = self._get_cache_path(key)
66 | body_path = metadata_path + ".body"
67 | if not (os.path.exists(metadata_path) and os.path.exists(body_path)):
68 | return None
69 | with suppressed_cache_errors():
70 | with open(metadata_path, "rb") as f:
71 | return f.read()
72 |
73 | def _write(self, path: str, data: bytes) -> None:
74 | with suppressed_cache_errors():
75 | ensure_dir(os.path.dirname(path))
76 |
77 | with adjacent_tmp_file(path) as f:
78 | f.write(data)
79 |
80 | replace(f.name, path)
81 |
82 | def set(
83 | self, key: str, value: bytes, expires: Union[int, datetime, None] = None
84 | ) -> None:
85 | path = self._get_cache_path(key)
86 | self._write(path, value)
87 |
88 | def delete(self, key: str) -> None:
89 | path = self._get_cache_path(key)
90 | with suppressed_cache_errors():
91 | os.remove(path)
92 | with suppressed_cache_errors():
93 | os.remove(path + ".body")
94 |
95 | def get_body(self, key: str) -> Optional[BinaryIO]:
96 | # The cache entry is only valid if both metadata and body exist.
97 | metadata_path = self._get_cache_path(key)
98 | body_path = metadata_path + ".body"
99 | if not (os.path.exists(metadata_path) and os.path.exists(body_path)):
100 | return None
101 | with suppressed_cache_errors():
102 | return open(body_path, "rb")
103 |
104 | def set_body(self, key: str, body: bytes) -> None:
105 | path = self._get_cache_path(key) + ".body"
106 | self._write(path, body)
107 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | from base64 import b64encode
4 |
5 | from ..exceptions import UnrewindableBodyError
6 | from ..packages.six import b, integer_types
7 |
8 | # Pass as a value within ``headers`` to skip
9 | # emitting some HTTP headers that are added automatically.
10 | # The only headers that are supported are ``Accept-Encoding``,
11 | # ``Host``, and ``User-Agent``.
12 | SKIP_HEADER = "@@@SKIP_HEADER@@@"
13 | SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"])
14 |
15 | ACCEPT_ENCODING = "gzip,deflate"
16 |
17 | _FAILEDTELL = object()
18 |
19 |
20 | def make_headers(
21 | keep_alive=None,
22 | accept_encoding=None,
23 | user_agent=None,
24 | basic_auth=None,
25 | proxy_basic_auth=None,
26 | disable_cache=None,
27 | ):
28 | """
29 | Shortcuts for generating request headers.
30 |
31 | :param keep_alive:
32 | If ``True``, adds 'connection: keep-alive' header.
33 |
34 | :param accept_encoding:
35 | Can be a boolean, list, or string.
36 | ``True`` translates to 'gzip,deflate'.
37 | List will get joined by comma.
38 | String will be used as provided.
39 |
40 | :param user_agent:
41 | String representing the user-agent you want, such as
42 | "python-urllib3/0.6"
43 |
44 | :param basic_auth:
45 | Colon-separated username:password string for 'authorization: basic ...'
46 | auth header.
47 |
48 | :param proxy_basic_auth:
49 | Colon-separated username:password string for 'proxy-authorization: basic ...'
50 | auth header.
51 |
52 | :param disable_cache:
53 | If ``True``, adds 'cache-control: no-cache' header.
54 |
55 | Example::
56 |
57 | >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
58 | {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
59 | >>> make_headers(accept_encoding=True)
60 | {'accept-encoding': 'gzip,deflate'}
61 | """
62 | headers = {}
63 | if accept_encoding:
64 | if isinstance(accept_encoding, str):
65 | pass
66 | elif isinstance(accept_encoding, list):
67 | accept_encoding = ",".join(accept_encoding)
68 | else:
69 | accept_encoding = ACCEPT_ENCODING
70 | headers["accept-encoding"] = accept_encoding
71 |
72 | if user_agent:
73 | headers["user-agent"] = user_agent
74 |
75 | if keep_alive:
76 | headers["connection"] = "keep-alive"
77 |
78 | if basic_auth:
79 | headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8")
80 |
81 | if proxy_basic_auth:
82 | headers["proxy-authorization"] = "Basic " + b64encode(
83 | b(proxy_basic_auth)
84 | ).decode("utf-8")
85 |
86 | if disable_cache:
87 | headers["cache-control"] = "no-cache"
88 |
89 | return headers
90 |
91 |
92 | def set_file_position(body, pos):
93 | """
94 | If a position is provided, move file to that point.
95 | Otherwise, we'll attempt to record a position for future use.
96 | """
97 | if pos is not None:
98 | rewind_body(body, pos)
99 | elif getattr(body, "tell", None) is not None:
100 | try:
101 | pos = body.tell()
102 | except (IOError, OSError):
103 | # This differentiates from None, allowing us to catch
104 | # a failed `tell()` later when trying to rewind the body.
105 | pos = _FAILEDTELL
106 |
107 | return pos
108 |
109 |
110 | def rewind_body(body, body_pos):
111 | """
112 | Attempt to rewind body to a certain position.
113 | Primarily used for request redirects and retries.
114 |
115 | :param body:
116 | File-like object that supports seek.
117 |
118 | :param int pos:
119 | Position to seek to in file.
120 | """
121 | body_seek = getattr(body, "seek", None)
122 | if body_seek is not None and isinstance(body_pos, integer_types):
123 | try:
124 | body_seek(body_pos)
125 | except (IOError, OSError):
126 | raise UnrewindableBodyError(
127 | "An error occurred when rewinding request body for redirect/retry."
128 | )
129 | elif body_pos is _FAILEDTELL:
130 | raise UnrewindableBodyError(
131 | "Unable to record file position for rewinding "
132 | "request body during a redirect/retry."
133 | )
134 | else:
135 | raise ValueError(
136 | "body_pos must be of type integer, instead it was %s." % type(body_pos)
137 | )
138 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/nanoftp.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: minimal FTP implementation
3 | * Description: minimal FTP implementation allowing to fetch resources
4 | * like external subset. This module is DEPRECATED, do not
5 | * use any of its functions.
6 | *
7 | * Copy: See Copyright for the status of this software.
8 | *
9 | * Author: Daniel Veillard
10 | */
11 |
12 | #ifndef __NANO_FTP_H__
13 | #define __NANO_FTP_H__
14 |
15 | #include <libxml/xmlversion.h>
16 |
17 | #if defined(LIBXML_FTP_ENABLED)
18 |
19 | /* Needed for portability to Windows 64 bits */
20 | #if defined(_WIN32)
21 | #include <winsock2.h>
22 | #else
23 | /**
24 | * SOCKET:
25 | *
26 | * macro used to provide portability of code to windows sockets
27 | */
28 | #define SOCKET int
29 | /**
30 | * INVALID_SOCKET:
31 | *
32 | * macro used to provide portability of code to windows sockets
33 | * the value to be used when the socket is not valid
34 | */
35 | #undef INVALID_SOCKET
36 | #define INVALID_SOCKET (-1)
37 | #endif
38 |
39 | #ifdef __cplusplus
40 | extern "C" {
41 | #endif
42 |
43 | /**
44 | * ftpListCallback:
45 | * @userData: user provided data for the callback
46 | * @filename: the file name (including "->" when links are shown)
47 | * @attrib: the attribute string
48 | * @owner: the owner string
49 | * @group: the group string
50 | * @size: the file size
51 | * @links: the link count
52 | * @year: the year
53 | * @month: the month
54 | * @day: the day
55 | * @hour: the hour
56 | * @minute: the minute
57 | *
58 | * A callback for the xmlNanoFTPList command.
59 | * Note that only one of year and day:minute are specified.
60 | */
61 | typedef void (*ftpListCallback) (void *userData,
62 | const char *filename, const char *attrib,
63 | const char *owner, const char *group,
64 | unsigned long size, int links, int year,
65 | const char *month, int day, int hour,
66 | int minute);
67 | /**
68 | * ftpDataCallback:
69 | * @userData: the user provided context
70 | * @data: the data received
71 | * @len: its size in bytes
72 | *
73 | * A callback for the xmlNanoFTPGet command.
74 | */
75 | typedef void (*ftpDataCallback) (void *userData,
76 | const char *data,
77 | int len);
78 |
79 | /*
80 | * Init
81 | */
82 | XML_DEPRECATED
83 | XMLPUBFUN void
84 | xmlNanoFTPInit (void);
85 | XML_DEPRECATED
86 | XMLPUBFUN void
87 | xmlNanoFTPCleanup (void);
88 |
89 | /*
90 | * Creating/freeing contexts.
91 | */
92 | XML_DEPRECATED
93 | XMLPUBFUN void *
94 | xmlNanoFTPNewCtxt (const char *URL);
95 | XML_DEPRECATED
96 | XMLPUBFUN void
97 | xmlNanoFTPFreeCtxt (void * ctx);
98 | XML_DEPRECATED
99 | XMLPUBFUN void *
100 | xmlNanoFTPConnectTo (const char *server,
101 | int port);
102 | /*
103 | * Opening/closing session connections.
104 | */
105 | XML_DEPRECATED
106 | XMLPUBFUN void *
107 | xmlNanoFTPOpen (const char *URL);
108 | XML_DEPRECATED
109 | XMLPUBFUN int
110 | xmlNanoFTPConnect (void *ctx);
111 | XML_DEPRECATED
112 | XMLPUBFUN int
113 | xmlNanoFTPClose (void *ctx);
114 | XML_DEPRECATED
115 | XMLPUBFUN int
116 | xmlNanoFTPQuit (void *ctx);
117 | XML_DEPRECATED
118 | XMLPUBFUN void
119 | xmlNanoFTPScanProxy (const char *URL);
120 | XML_DEPRECATED
121 | XMLPUBFUN void
122 | xmlNanoFTPProxy (const char *host,
123 | int port,
124 | const char *user,
125 | const char *passwd,
126 | int type);
127 | XML_DEPRECATED
128 | XMLPUBFUN int
129 | xmlNanoFTPUpdateURL (void *ctx,
130 | const char *URL);
131 |
132 | /*
133 | * Rather internal commands.
134 | */
135 | XML_DEPRECATED
136 | XMLPUBFUN int
137 | xmlNanoFTPGetResponse (void *ctx);
138 | XML_DEPRECATED
139 | XMLPUBFUN int
140 | xmlNanoFTPCheckResponse (void *ctx);
141 |
142 | /*
143 | * CD/DIR/GET handlers.
144 | */
145 | XML_DEPRECATED
146 | XMLPUBFUN int
147 | xmlNanoFTPCwd (void *ctx,
148 | const char *directory);
149 | XML_DEPRECATED
150 | XMLPUBFUN int
151 | xmlNanoFTPDele (void *ctx,
152 | const char *file);
153 |
154 | XML_DEPRECATED
155 | XMLPUBFUN SOCKET
156 | xmlNanoFTPGetConnection (void *ctx);
157 | XML_DEPRECATED
158 | XMLPUBFUN int
159 | xmlNanoFTPCloseConnection(void *ctx);
160 | XML_DEPRECATED
161 | XMLPUBFUN int
162 | xmlNanoFTPList (void *ctx,
163 | ftpListCallback callback,
164 | void *userData,
165 | const char *filename);
166 | XML_DEPRECATED
167 | XMLPUBFUN SOCKET
168 | xmlNanoFTPGetSocket (void *ctx,
169 | const char *filename);
170 | XML_DEPRECATED
171 | XMLPUBFUN int
172 | xmlNanoFTPGet (void *ctx,
173 | ftpDataCallback callback,
174 | void *userData,
175 | const char *filename);
176 | XML_DEPRECATED
177 | XMLPUBFUN int
178 | xmlNanoFTPRead (void *ctx,
179 | void *dest,
180 | int len);
181 |
182 | #ifdef __cplusplus
183 | }
184 | #endif
185 | #endif /* defined(LIBXML_FTP_ENABLED) || defined(LIBXML_LEGACY_ENABLED) */
186 | #endif /* __NANO_FTP_H__ */
187 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/soupsieve/pretty.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Format a pretty string of a `SoupSieve` object for easy debugging.
3 |
4 | This won't necessarily support all types and such, and definitely
5 | not support custom outputs.
6 |
7 | It is mainly geared towards our types as the `SelectorList`
8 | object is a beast to look at without some indentation and newlines.
9 | The format and various output types is fairly known (though it
10 | hasn't been tested extensively to make sure we aren't missing corners).
11 |
12 | Example:
13 | -------
14 | ```
15 | >>> import soupsieve as sv
16 | >>> sv.compile('this > that.class[name=value]').selectors.pretty()
17 | SelectorList(
18 | selectors=(
19 | Selector(
20 | tag=SelectorTag(
21 | name='that',
22 | prefix=None),
23 | ids=(),
24 | classes=(
25 | 'class',
26 | ),
27 | attributes=(
28 | SelectorAttribute(
29 | attribute='name',
30 | prefix='',
31 | pattern=re.compile(
32 | '^value$'),
33 | xml_type_pattern=None),
34 | ),
35 | nth=(),
36 | selectors=(),
37 | relation=SelectorList(
38 | selectors=(
39 | Selector(
40 | tag=SelectorTag(
41 | name='this',
42 | prefix=None),
43 | ids=(),
44 | classes=(),
45 | attributes=(),
46 | nth=(),
47 | selectors=(),
48 | relation=SelectorList(
49 | selectors=(),
50 | is_not=False,
51 | is_html=False),
52 | rel_type='>',
53 | contains=(),
54 | lang=(),
55 | flags=0),
56 | ),
57 | is_not=False,
58 | is_html=False),
59 | rel_type=None,
60 | contains=(),
61 | lang=(),
62 | flags=0),
63 | ),
64 | is_not=False,
65 | is_html=False)
66 | ```
67 |
68 | """
69 | from __future__ import annotations
70 | import re
71 | from typing import Any
72 |
73 | RE_CLASS = re.compile(r'(?i)[a-z_][_a-z\d\.]+\(')
74 | RE_PARAM = re.compile(r'(?i)[_a-z][_a-z\d]+=')
75 | RE_EMPTY = re.compile(r'\(\)|\[\]|\{\}')
76 | RE_LSTRT = re.compile(r'\[')
77 | RE_DSTRT = re.compile(r'\{')
78 | RE_TSTRT = re.compile(r'\(')
79 | RE_LEND = re.compile(r'\]')
80 | RE_DEND = re.compile(r'\}')
81 | RE_TEND = re.compile(r'\)')
82 | RE_INT = re.compile(r'\d+')
83 | RE_KWORD = re.compile(r'(?i)[_a-z][_a-z\d]+')
84 | RE_DQSTR = re.compile(r'"(?:\\.|[^"\\])*"')
85 | RE_SQSTR = re.compile(r"'(?:\\.|[^'\\])*'")
86 | RE_SEP = re.compile(r'\s*(,)\s*')
87 | RE_DSEP = re.compile(r'\s*(:)\s*')
88 |
89 | TOKENS = {
90 | 'class': RE_CLASS,
91 | 'param': RE_PARAM,
92 | 'empty': RE_EMPTY,
93 | 'lstrt': RE_LSTRT,
94 | 'dstrt': RE_DSTRT,
95 | 'tstrt': RE_TSTRT,
96 | 'lend': RE_LEND,
97 | 'dend': RE_DEND,
98 | 'tend': RE_TEND,
99 | 'sqstr': RE_SQSTR,
100 | 'sep': RE_SEP,
101 | 'dsep': RE_DSEP,
102 | 'int': RE_INT,
103 | 'kword': RE_KWORD,
104 | 'dqstr': RE_DQSTR
105 | }
106 |
107 |
108 | def pretty(obj: Any) -> str: # pragma: no cover
109 | """Make the object output string pretty."""
110 |
111 | sel = str(obj)
112 | index = 0
113 | end = len(sel) - 1
114 | indent = 0
115 | output = []
116 |
117 | while index <= end:
118 | m = None
119 | for k, v in TOKENS.items():
120 | m = v.match(sel, index)
121 |
122 | if m:
123 | name = k
124 | index = m.end(0)
125 | if name in ('class', 'lstrt', 'dstrt', 'tstrt'):
126 | indent += 4
127 | output.append(f'{m.group(0)}\n{" " * indent}')
128 | elif name in ('param', 'int', 'kword', 'sqstr', 'dqstr', 'empty'):
129 | output.append(m.group(0))
130 | elif name in ('lend', 'dend', 'tend'):
131 | indent -= 4
132 | output.append(m.group(0))
133 | elif name in ('sep',):
134 | output.append(f'{m.group(1)}\n{" " * indent}')
135 | elif name in ('dsep',):
136 | output.append(f'{m.group(1)} ')
137 | break
138 |
139 | return ''.join(output)
140 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/network/utils.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Dict, Generator
2 |
3 | from pip._vendor.requests.models import Response
4 |
5 | from pip._internal.exceptions import NetworkConnectionError
6 |
7 | # The following comments and HTTP headers were originally added by
8 | # Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03.
9 | #
10 | # We use Accept-Encoding: identity here because requests defaults to
11 | # accepting compressed responses. This breaks in a variety of ways
12 | # depending on how the server is configured.
13 | # - Some servers will notice that the file isn't a compressible file
14 | # and will leave the file alone and with an empty Content-Encoding
15 | # - Some servers will notice that the file is already compressed and
16 | # will leave the file alone, adding a Content-Encoding: gzip header
17 | # - Some servers won't notice anything at all and will take a file
18 | # that's already been compressed and compress it again, and set
19 | # the Content-Encoding: gzip header
20 | # By setting this to request only the identity encoding we're hoping
21 | # to eliminate the third case. Hopefully there does not exist a server
22 | # which when given a file will notice it is already compressed and that
23 | # you're not asking for a compressed file and will then decompress it
24 | # before sending because if that's the case I don't think it'll ever be
25 | # possible to make this work.
26 | HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"}
27 |
28 | DOWNLOAD_CHUNK_SIZE = 256 * 1024
29 |
30 |
31 | def raise_for_status(resp: Response) -> None:
32 | http_error_msg = ""
33 | if isinstance(resp.reason, bytes):
34 | # We attempt to decode utf-8 first because some servers
35 | # choose to localize their reason strings. If the string
36 | # isn't utf-8, we fall back to iso-8859-1 for all other
37 | # encodings.
38 | try:
39 | reason = resp.reason.decode("utf-8")
40 | except UnicodeDecodeError:
41 | reason = resp.reason.decode("iso-8859-1")
42 | else:
43 | reason = resp.reason
44 |
45 | if 400 <= resp.status_code < 500:
46 | http_error_msg = (
47 | f"{resp.status_code} Client Error: {reason} for url: {resp.url}"
48 | )
49 |
50 | elif 500 <= resp.status_code < 600:
51 | http_error_msg = (
52 | f"{resp.status_code} Server Error: {reason} for url: {resp.url}"
53 | )
54 |
55 | if http_error_msg:
56 | raise NetworkConnectionError(http_error_msg, response=resp)
57 |
58 |
59 | def response_chunks(
60 | response: Response, chunk_size: int = DOWNLOAD_CHUNK_SIZE
61 | ) -> Generator[bytes, None, None]:
62 | """Given a requests Response, provide the data chunks."""
63 | try:
64 | # Special case for urllib3.
65 | for chunk in response.raw.stream(
66 | chunk_size,
67 | # We use decode_content=False here because we don't
68 | # want urllib3 to mess with the raw bytes we get
69 | # from the server. If we decompress inside of
70 | # urllib3 then we cannot verify the checksum
71 | # because the checksum will be of the compressed
72 | # file. This breakage will only occur if the
73 | # server adds a Content-Encoding header, which
74 | # depends on how the server was configured:
75 | # - Some servers will notice that the file isn't a
76 | # compressible file and will leave the file alone
77 | # and with an empty Content-Encoding
78 | # - Some servers will notice that the file is
79 | # already compressed and will leave the file
80 | # alone and will add a Content-Encoding: gzip
81 | # header
82 | # - Some servers won't notice anything at all and
83 | # will take a file that's already been compressed
84 | # and compress it again and set the
85 | # Content-Encoding: gzip header
86 | #
87 | # By setting this not to decode automatically we
88 | # hope to eliminate problems with the second case.
89 | decode_content=False,
90 | ):
91 | yield chunk
92 | except AttributeError:
93 | # Standard file-like object.
94 | while True:
95 | chunk = response.raw.read(chunk_size)
96 | if not chunk:
97 | break
98 | yield chunk
99 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/bs4/tests/test_formatter.py:
--------------------------------------------------------------------------------
```python
1 | import pytest
2 |
3 | from bs4.element import Tag
4 | from bs4.formatter import (
5 | Formatter,
6 | HTMLFormatter,
7 | XMLFormatter,
8 | )
9 | from . import SoupTest
10 |
11 | class TestFormatter(SoupTest):
12 |
13 | def test_default_attributes(self):
14 | # Test the default behavior of Formatter.attributes().
15 | formatter = Formatter()
16 | tag = Tag(name="tag")
17 | tag['b'] = 1
18 | tag['a'] = 2
19 |
20 | # Attributes come out sorted by name. In Python 3, attributes
21 | # normally come out of a dictionary in the order they were
22 | # added.
23 | assert [('a', 2), ('b', 1)] == formatter.attributes(tag)
24 |
25 | # This works even if Tag.attrs is None, though this shouldn't
26 | # normally happen.
27 | tag.attrs = None
28 | assert [] == formatter.attributes(tag)
29 |
30 | assert ' ' == formatter.indent
31 |
32 | def test_sort_attributes(self):
33 | # Test the ability to override Formatter.attributes() to,
34 | # e.g., disable the normal sorting of attributes.
35 | class UnsortedFormatter(Formatter):
36 | def attributes(self, tag):
37 | self.called_with = tag
38 | for k, v in sorted(tag.attrs.items()):
39 | if k == 'ignore':
40 | continue
41 | yield k,v
42 |
43 | soup = self.soup('<p cval="1" aval="2" ignore="ignored"></p>')
44 | formatter = UnsortedFormatter()
45 | decoded = soup.decode(formatter=formatter)
46 |
47 | # attributes() was called on the <p> tag. It filtered out one
48 | # attribute and sorted the other two.
49 | assert formatter.called_with == soup.p
50 | assert '<p aval="2" cval="1"></p>' == decoded
51 |
52 | def test_empty_attributes_are_booleans(self):
53 | # Test the behavior of empty_attributes_are_booleans as well
54 | # as which Formatters have it enabled.
55 |
56 | for name in ('html', 'minimal', None):
57 | formatter = HTMLFormatter.REGISTRY[name]
58 | assert False == formatter.empty_attributes_are_booleans
59 |
60 | formatter = XMLFormatter.REGISTRY[None]
61 | assert False == formatter.empty_attributes_are_booleans
62 |
63 | formatter = HTMLFormatter.REGISTRY['html5']
64 | assert True == formatter.empty_attributes_are_booleans
65 |
66 | # Verify that the constructor sets the value.
67 | formatter = Formatter(empty_attributes_are_booleans=True)
68 | assert True == formatter.empty_attributes_are_booleans
69 |
70 | # Now demonstrate what it does to markup.
71 | for markup in (
72 | "<option selected></option>",
73 | '<option selected=""></option>'
74 | ):
75 | soup = self.soup(markup)
76 | for formatter in ('html', 'minimal', 'xml', None):
77 | assert b'<option selected=""></option>' == soup.option.encode(formatter='html')
78 | assert b'<option selected></option>' == soup.option.encode(formatter='html5')
79 |
80 | @pytest.mark.parametrize(
81 | "indent,expect",
82 | [
83 | (None, '<a>\n<b>\ntext\n</b>\n</a>\n'),
84 | (-1, '<a>\n<b>\ntext\n</b>\n</a>\n'),
85 | (0, '<a>\n<b>\ntext\n</b>\n</a>\n'),
86 | ("", '<a>\n<b>\ntext\n</b>\n</a>\n'),
87 |
88 | (1, '<a>\n <b>\n text\n </b>\n</a>\n'),
89 | (2, '<a>\n <b>\n text\n </b>\n</a>\n'),
90 |
91 | ("\t", '<a>\n\t<b>\n\t\ttext\n\t</b>\n</a>\n'),
92 | ('abc', '<a>\nabc<b>\nabcabctext\nabc</b>\n</a>\n'),
93 |
94 | # Some invalid inputs -- the default behavior is used.
95 | (object(), '<a>\n <b>\n text\n </b>\n</a>\n'),
96 | (b'bytes', '<a>\n <b>\n text\n </b>\n</a>\n'),
97 | ]
98 | )
99 | def test_indent(self, indent, expect):
100 | # Pretty-print a tree with a Formatter set to
101 | # indent in a certain way and verify the results.
102 | soup = self.soup("<a><b>text</b></a>")
103 | formatter = Formatter(indent=indent)
104 | assert soup.prettify(formatter=formatter) == expect
105 |
106 | # Pretty-printing only happens with prettify(), not
107 | # encode().
108 | assert soup.encode(formatter=formatter) != expect
109 |
110 | def test_default_indent_value(self):
111 | formatter = Formatter()
112 | assert formatter.indent == ' '
113 |
114 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/markupsafe/_speedups.c:
--------------------------------------------------------------------------------
```cpp
1 | #include <Python.h>
2 |
3 | #define GET_DELTA(inp, inp_end, delta) \
4 | while (inp < inp_end) { \
5 | switch (*inp++) { \
6 | case '"': \
7 | case '\'': \
8 | case '&': \
9 | delta += 4; \
10 | break; \
11 | case '<': \
12 | case '>': \
13 | delta += 3; \
14 | break; \
15 | } \
16 | }
17 |
18 | #define DO_ESCAPE(inp, inp_end, outp) \
19 | { \
20 | Py_ssize_t ncopy = 0; \
21 | while (inp < inp_end) { \
22 | switch (*inp) { \
23 | case '"': \
24 | memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \
25 | outp += ncopy; ncopy = 0; \
26 | *outp++ = '&'; \
27 | *outp++ = '#'; \
28 | *outp++ = '3'; \
29 | *outp++ = '4'; \
30 | *outp++ = ';'; \
31 | break; \
32 | case '\'': \
33 | memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \
34 | outp += ncopy; ncopy = 0; \
35 | *outp++ = '&'; \
36 | *outp++ = '#'; \
37 | *outp++ = '3'; \
38 | *outp++ = '9'; \
39 | *outp++ = ';'; \
40 | break; \
41 | case '&': \
42 | memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \
43 | outp += ncopy; ncopy = 0; \
44 | *outp++ = '&'; \
45 | *outp++ = 'a'; \
46 | *outp++ = 'm'; \
47 | *outp++ = 'p'; \
48 | *outp++ = ';'; \
49 | break; \
50 | case '<': \
51 | memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \
52 | outp += ncopy; ncopy = 0; \
53 | *outp++ = '&'; \
54 | *outp++ = 'l'; \
55 | *outp++ = 't'; \
56 | *outp++ = ';'; \
57 | break; \
58 | case '>': \
59 | memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \
60 | outp += ncopy; ncopy = 0; \
61 | *outp++ = '&'; \
62 | *outp++ = 'g'; \
63 | *outp++ = 't'; \
64 | *outp++ = ';'; \
65 | break; \
66 | default: \
67 | ncopy++; \
68 | } \
69 | inp++; \
70 | } \
71 | memcpy(outp, inp-ncopy, sizeof(*outp)*ncopy); \
72 | }
73 |
74 | static PyObject*
75 | escape_unicode_kind1(PyUnicodeObject *in)
76 | {
77 | Py_UCS1 *inp = PyUnicode_1BYTE_DATA(in);
78 | Py_UCS1 *inp_end = inp + PyUnicode_GET_LENGTH(in);
79 | Py_UCS1 *outp;
80 | PyObject *out;
81 | Py_ssize_t delta = 0;
82 |
83 | GET_DELTA(inp, inp_end, delta);
84 | if (!delta) {
85 | Py_INCREF(in);
86 | return (PyObject*)in;
87 | }
88 |
89 | out = PyUnicode_New(PyUnicode_GET_LENGTH(in) + delta,
90 | PyUnicode_IS_ASCII(in) ? 127 : 255);
91 | if (!out)
92 | return NULL;
93 |
94 | inp = PyUnicode_1BYTE_DATA(in);
95 | outp = PyUnicode_1BYTE_DATA(out);
96 | DO_ESCAPE(inp, inp_end, outp);
97 | return out;
98 | }
99 |
100 | static PyObject*
101 | escape_unicode_kind2(PyUnicodeObject *in)
102 | {
103 | Py_UCS2 *inp = PyUnicode_2BYTE_DATA(in);
104 | Py_UCS2 *inp_end = inp + PyUnicode_GET_LENGTH(in);
105 | Py_UCS2 *outp;
106 | PyObject *out;
107 | Py_ssize_t delta = 0;
108 |
109 | GET_DELTA(inp, inp_end, delta);
110 | if (!delta) {
111 | Py_INCREF(in);
112 | return (PyObject*)in;
113 | }
114 |
115 | out = PyUnicode_New(PyUnicode_GET_LENGTH(in) + delta, 65535);
116 | if (!out)
117 | return NULL;
118 |
119 | inp = PyUnicode_2BYTE_DATA(in);
120 | outp = PyUnicode_2BYTE_DATA(out);
121 | DO_ESCAPE(inp, inp_end, outp);
122 | return out;
123 | }
124 |
125 |
126 | static PyObject*
127 | escape_unicode_kind4(PyUnicodeObject *in)
128 | {
129 | Py_UCS4 *inp = PyUnicode_4BYTE_DATA(in);
130 | Py_UCS4 *inp_end = inp + PyUnicode_GET_LENGTH(in);
131 | Py_UCS4 *outp;
132 | PyObject *out;
133 | Py_ssize_t delta = 0;
134 |
135 | GET_DELTA(inp, inp_end, delta);
136 | if (!delta) {
137 | Py_INCREF(in);
138 | return (PyObject*)in;
139 | }
140 |
141 | out = PyUnicode_New(PyUnicode_GET_LENGTH(in) + delta, 1114111);
142 | if (!out)
143 | return NULL;
144 |
145 | inp = PyUnicode_4BYTE_DATA(in);
146 | outp = PyUnicode_4BYTE_DATA(out);
147 | DO_ESCAPE(inp, inp_end, outp);
148 | return out;
149 | }
150 |
151 | static PyObject*
152 | escape_unicode(PyObject *self, PyObject *s)
153 | {
154 | if (!PyUnicode_CheckExact(s))
155 | return NULL;
156 |
157 | // This check is no longer needed in Python 3.12.
158 | if (PyUnicode_READY(s))
159 | return NULL;
160 |
161 | switch (PyUnicode_KIND(s)) {
162 | case PyUnicode_1BYTE_KIND:
163 | return escape_unicode_kind1((PyUnicodeObject*) s);
164 | case PyUnicode_2BYTE_KIND:
165 | return escape_unicode_kind2((PyUnicodeObject*) s);
166 | case PyUnicode_4BYTE_KIND:
167 | return escape_unicode_kind4((PyUnicodeObject*) s);
168 | }
169 | assert(0); /* shouldn't happen */
170 | return NULL;
171 | }
172 |
173 | static PyMethodDef module_methods[] = {
174 | {"_escape_inner", (PyCFunction)escape_unicode, METH_O, NULL},
175 | {NULL, NULL, 0, NULL} /* Sentinel */
176 | };
177 |
178 | static struct PyModuleDef module_definition = {
179 | PyModuleDef_HEAD_INIT,
180 | "markupsafe._speedups",
181 | NULL,
182 | -1,
183 | module_methods,
184 | NULL,
185 | NULL,
186 | NULL,
187 | NULL
188 | };
189 |
190 | PyMODINIT_FUNC
191 | PyInit__speedups(void)
192 | {
193 | PyObject *m = PyModule_Create(&module_definition);
194 |
195 | if (m == NULL) {
196 | return NULL;
197 | }
198 |
199 | #ifdef Py_GIL_DISABLED
200 | PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
201 | #endif
202 |
203 | return m;
204 | }
205 |
```