This is page 78 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/pygments/formatters/img.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.formatters.img
3 | ~~~~~~~~~~~~~~~~~~~~~~~
4 |
5 | Formatter for Pixmap output.
6 |
7 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8 | :license: BSD, see LICENSE for details.
9 | """
10 | import os
11 | import sys
12 |
13 | from pip._vendor.pygments.formatter import Formatter
14 | from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
15 | get_choice_opt
16 |
17 | import subprocess
18 |
19 | # Import this carefully
20 | try:
21 | from PIL import Image, ImageDraw, ImageFont
22 | pil_available = True
23 | except ImportError:
24 | pil_available = False
25 |
26 | try:
27 | import _winreg
28 | except ImportError:
29 | try:
30 | import winreg as _winreg
31 | except ImportError:
32 | _winreg = None
33 |
34 | __all__ = ['ImageFormatter', 'GifImageFormatter', 'JpgImageFormatter',
35 | 'BmpImageFormatter']
36 |
37 |
38 | # For some unknown reason every font calls it something different
39 | STYLES = {
40 | 'NORMAL': ['', 'Roman', 'Book', 'Normal', 'Regular', 'Medium'],
41 | 'ITALIC': ['Oblique', 'Italic'],
42 | 'BOLD': ['Bold'],
43 | 'BOLDITALIC': ['Bold Oblique', 'Bold Italic'],
44 | }
45 |
46 | # A sane default for modern systems
47 | DEFAULT_FONT_NAME_NIX = 'DejaVu Sans Mono'
48 | DEFAULT_FONT_NAME_WIN = 'Courier New'
49 | DEFAULT_FONT_NAME_MAC = 'Menlo'
50 |
51 |
52 | class PilNotAvailable(ImportError):
53 | """When Python imaging library is not available"""
54 |
55 |
56 | class FontNotFound(Exception):
57 | """When there are no usable fonts specified"""
58 |
59 |
60 | class FontManager:
61 | """
62 | Manages a set of fonts: normal, italic, bold, etc...
63 | """
64 |
65 | def __init__(self, font_name, font_size=14):
66 | self.font_name = font_name
67 | self.font_size = font_size
68 | self.fonts = {}
69 | self.encoding = None
70 | self.variable = False
71 | if hasattr(font_name, 'read') or os.path.isfile(font_name):
72 | font = ImageFont.truetype(font_name, self.font_size)
73 | self.variable = True
74 | for style in STYLES:
75 | self.fonts[style] = font
76 |
77 | return
78 |
79 | if sys.platform.startswith('win'):
80 | if not font_name:
81 | self.font_name = DEFAULT_FONT_NAME_WIN
82 | self._create_win()
83 | elif sys.platform.startswith('darwin'):
84 | if not font_name:
85 | self.font_name = DEFAULT_FONT_NAME_MAC
86 | self._create_mac()
87 | else:
88 | if not font_name:
89 | self.font_name = DEFAULT_FONT_NAME_NIX
90 | self._create_nix()
91 |
92 | def _get_nix_font_path(self, name, style):
93 | proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'],
94 | stdout=subprocess.PIPE, stderr=None)
95 | stdout, _ = proc.communicate()
96 | if proc.returncode == 0:
97 | lines = stdout.splitlines()
98 | for line in lines:
99 | if line.startswith(b'Fontconfig warning:'):
100 | continue
101 | path = line.decode().strip().strip(':')
102 | if path:
103 | return path
104 | return None
105 |
106 | def _create_nix(self):
107 | for name in STYLES['NORMAL']:
108 | path = self._get_nix_font_path(self.font_name, name)
109 | if path is not None:
110 | self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
111 | break
112 | else:
113 | raise FontNotFound(f'No usable fonts named: "{self.font_name}"')
114 | for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
115 | for stylename in STYLES[style]:
116 | path = self._get_nix_font_path(self.font_name, stylename)
117 | if path is not None:
118 | self.fonts[style] = ImageFont.truetype(path, self.font_size)
119 | break
120 | else:
121 | if style == 'BOLDITALIC':
122 | self.fonts[style] = self.fonts['BOLD']
123 | else:
124 | self.fonts[style] = self.fonts['NORMAL']
125 |
126 | def _get_mac_font_path(self, font_map, name, style):
127 | return font_map.get((name + ' ' + style).strip().lower())
128 |
129 | def _create_mac(self):
130 | font_map = {}
131 | for font_dir in (os.path.join(os.getenv("HOME"), 'Library/Fonts/'),
132 | '/Library/Fonts/', '/System/Library/Fonts/'):
133 | font_map.update(
134 | (os.path.splitext(f)[0].lower(), os.path.join(font_dir, f))
135 | for f in os.listdir(font_dir)
136 | if f.lower().endswith(('ttf', 'ttc')))
137 |
138 | for name in STYLES['NORMAL']:
139 | path = self._get_mac_font_path(font_map, self.font_name, name)
140 | if path is not None:
141 | self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
142 | break
143 | else:
144 | raise FontNotFound(f'No usable fonts named: "{self.font_name}"')
145 | for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
146 | for stylename in STYLES[style]:
147 | path = self._get_mac_font_path(font_map, self.font_name, stylename)
148 | if path is not None:
149 | self.fonts[style] = ImageFont.truetype(path, self.font_size)
150 | break
151 | else:
152 | if style == 'BOLDITALIC':
153 | self.fonts[style] = self.fonts['BOLD']
154 | else:
155 | self.fonts[style] = self.fonts['NORMAL']
156 |
157 | def _lookup_win(self, key, basename, styles, fail=False):
158 | for suffix in ('', ' (TrueType)'):
159 | for style in styles:
160 | try:
161 | valname = '{}{}{}'.format(basename, style and ' '+style, suffix)
162 | val, _ = _winreg.QueryValueEx(key, valname)
163 | return val
164 | except OSError:
165 | continue
166 | else:
167 | if fail:
168 | raise FontNotFound(f'Font {basename} ({styles[0]}) not found in registry')
169 | return None
170 |
171 | def _create_win(self):
172 | lookuperror = None
173 | keynames = [ (_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'),
174 | (_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Fonts'),
175 | (_winreg.HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'),
176 | (_winreg.HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows\CurrentVersion\Fonts') ]
177 | for keyname in keynames:
178 | try:
179 | key = _winreg.OpenKey(*keyname)
180 | try:
181 | path = self._lookup_win(key, self.font_name, STYLES['NORMAL'], True)
182 | self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
183 | for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
184 | path = self._lookup_win(key, self.font_name, STYLES[style])
185 | if path:
186 | self.fonts[style] = ImageFont.truetype(path, self.font_size)
187 | else:
188 | if style == 'BOLDITALIC':
189 | self.fonts[style] = self.fonts['BOLD']
190 | else:
191 | self.fonts[style] = self.fonts['NORMAL']
192 | return
193 | except FontNotFound as err:
194 | lookuperror = err
195 | finally:
196 | _winreg.CloseKey(key)
197 | except OSError:
198 | pass
199 | else:
200 | # If we get here, we checked all registry keys and had no luck
201 | # We can be in one of two situations now:
202 | # * All key lookups failed. In this case lookuperror is None and we
203 | # will raise a generic error
204 | # * At least one lookup failed with a FontNotFound error. In this
205 | # case, we will raise that as a more specific error
206 | if lookuperror:
207 | raise lookuperror
208 | raise FontNotFound('Can\'t open Windows font registry key')
209 |
210 | def get_char_size(self):
211 | """
212 | Get the character size.
213 | """
214 | return self.get_text_size('M')
215 |
216 | def get_text_size(self, text):
217 | """
218 | Get the text size (width, height).
219 | """
220 | font = self.fonts['NORMAL']
221 | if hasattr(font, 'getbbox'): # Pillow >= 9.2.0
222 | return font.getbbox(text)[2:4]
223 | else:
224 | return font.getsize(text)
225 |
226 | def get_font(self, bold, oblique):
227 | """
228 | Get the font based on bold and italic flags.
229 | """
230 | if bold and oblique:
231 | if self.variable:
232 | return self.get_style('BOLDITALIC')
233 |
234 | return self.fonts['BOLDITALIC']
235 | elif bold:
236 | if self.variable:
237 | return self.get_style('BOLD')
238 |
239 | return self.fonts['BOLD']
240 | elif oblique:
241 | if self.variable:
242 | return self.get_style('ITALIC')
243 |
244 | return self.fonts['ITALIC']
245 | else:
246 | if self.variable:
247 | return self.get_style('NORMAL')
248 |
249 | return self.fonts['NORMAL']
250 |
251 | def get_style(self, style):
252 | """
253 | Get the specified style of the font if it is a variable font.
254 | If not found, return the normal font.
255 | """
256 | font = self.fonts[style]
257 | for style_name in STYLES[style]:
258 | try:
259 | font.set_variation_by_name(style_name)
260 | return font
261 | except ValueError:
262 | pass
263 | except OSError:
264 | return font
265 |
266 | return font
267 |
268 |
269 | class ImageFormatter(Formatter):
270 | """
271 | Create a PNG image from source code. This uses the Python Imaging Library to
272 | generate a pixmap from the source code.
273 |
274 | .. versionadded:: 0.10
275 |
276 | Additional options accepted:
277 |
278 | `image_format`
279 | An image format to output to that is recognised by PIL, these include:
280 |
281 | * "PNG" (default)
282 | * "JPEG"
283 | * "BMP"
284 | * "GIF"
285 |
286 | `line_pad`
287 | The extra spacing (in pixels) between each line of text.
288 |
289 | Default: 2
290 |
291 | `font_name`
292 | The font name to be used as the base font from which others, such as
293 | bold and italic fonts will be generated. This really should be a
294 | monospace font to look sane.
295 | If a filename or a file-like object is specified, the user must
296 | provide different styles of the font.
297 |
298 | Default: "Courier New" on Windows, "Menlo" on Mac OS, and
299 | "DejaVu Sans Mono" on \\*nix
300 |
301 | `font_size`
302 | The font size in points to be used.
303 |
304 | Default: 14
305 |
306 | `image_pad`
307 | The padding, in pixels to be used at each edge of the resulting image.
308 |
309 | Default: 10
310 |
311 | `line_numbers`
312 | Whether line numbers should be shown: True/False
313 |
314 | Default: True
315 |
316 | `line_number_start`
317 | The line number of the first line.
318 |
319 | Default: 1
320 |
321 | `line_number_step`
322 | The step used when printing line numbers.
323 |
324 | Default: 1
325 |
326 | `line_number_bg`
327 | The background colour (in "#123456" format) of the line number bar, or
328 | None to use the style background color.
329 |
330 | Default: "#eed"
331 |
332 | `line_number_fg`
333 | The text color of the line numbers (in "#123456"-like format).
334 |
335 | Default: "#886"
336 |
337 | `line_number_chars`
338 | The number of columns of line numbers allowable in the line number
339 | margin.
340 |
341 | Default: 2
342 |
343 | `line_number_bold`
344 | Whether line numbers will be bold: True/False
345 |
346 | Default: False
347 |
348 | `line_number_italic`
349 | Whether line numbers will be italicized: True/False
350 |
351 | Default: False
352 |
353 | `line_number_separator`
354 | Whether a line will be drawn between the line number area and the
355 | source code area: True/False
356 |
357 | Default: True
358 |
359 | `line_number_pad`
360 | The horizontal padding (in pixels) between the line number margin, and
361 | the source code area.
362 |
363 | Default: 6
364 |
365 | `hl_lines`
366 | Specify a list of lines to be highlighted.
367 |
368 | .. versionadded:: 1.2
369 |
370 | Default: empty list
371 |
372 | `hl_color`
373 | Specify the color for highlighting lines.
374 |
375 | .. versionadded:: 1.2
376 |
377 | Default: highlight color of the selected style
378 | """
379 |
380 | # Required by the pygments mapper
381 | name = 'img'
382 | aliases = ['img', 'IMG', 'png']
383 | filenames = ['*.png']
384 |
385 | unicodeoutput = False
386 |
387 | default_image_format = 'png'
388 |
389 | def __init__(self, **options):
390 | """
391 | See the class docstring for explanation of options.
392 | """
393 | if not pil_available:
394 | raise PilNotAvailable(
395 | 'Python Imaging Library is required for this formatter')
396 | Formatter.__init__(self, **options)
397 | self.encoding = 'latin1' # let pygments.format() do the right thing
398 | # Read the style
399 | self.styles = dict(self.style)
400 | if self.style.background_color is None:
401 | self.background_color = '#fff'
402 | else:
403 | self.background_color = self.style.background_color
404 | # Image options
405 | self.image_format = get_choice_opt(
406 | options, 'image_format', ['png', 'jpeg', 'gif', 'bmp'],
407 | self.default_image_format, normcase=True)
408 | self.image_pad = get_int_opt(options, 'image_pad', 10)
409 | self.line_pad = get_int_opt(options, 'line_pad', 2)
410 | # The fonts
411 | fontsize = get_int_opt(options, 'font_size', 14)
412 | self.fonts = FontManager(options.get('font_name', ''), fontsize)
413 | self.fontw, self.fonth = self.fonts.get_char_size()
414 | # Line number options
415 | self.line_number_fg = options.get('line_number_fg', '#886')
416 | self.line_number_bg = options.get('line_number_bg', '#eed')
417 | self.line_number_chars = get_int_opt(options,
418 | 'line_number_chars', 2)
419 | self.line_number_bold = get_bool_opt(options,
420 | 'line_number_bold', False)
421 | self.line_number_italic = get_bool_opt(options,
422 | 'line_number_italic', False)
423 | self.line_number_pad = get_int_opt(options, 'line_number_pad', 6)
424 | self.line_numbers = get_bool_opt(options, 'line_numbers', True)
425 | self.line_number_separator = get_bool_opt(options,
426 | 'line_number_separator', True)
427 | self.line_number_step = get_int_opt(options, 'line_number_step', 1)
428 | self.line_number_start = get_int_opt(options, 'line_number_start', 1)
429 | if self.line_numbers:
430 | self.line_number_width = (self.fontw * self.line_number_chars +
431 | self.line_number_pad * 2)
432 | else:
433 | self.line_number_width = 0
434 | self.hl_lines = []
435 | hl_lines_str = get_list_opt(options, 'hl_lines', [])
436 | for line in hl_lines_str:
437 | try:
438 | self.hl_lines.append(int(line))
439 | except ValueError:
440 | pass
441 | self.hl_color = options.get('hl_color',
442 | self.style.highlight_color) or '#f90'
443 | self.drawables = []
444 |
445 | def get_style_defs(self, arg=''):
446 | raise NotImplementedError('The -S option is meaningless for the image '
447 | 'formatter. Use -O style=<stylename> instead.')
448 |
449 | def _get_line_height(self):
450 | """
451 | Get the height of a line.
452 | """
453 | return self.fonth + self.line_pad
454 |
455 | def _get_line_y(self, lineno):
456 | """
457 | Get the Y coordinate of a line number.
458 | """
459 | return lineno * self._get_line_height() + self.image_pad
460 |
461 | def _get_char_width(self):
462 | """
463 | Get the width of a character.
464 | """
465 | return self.fontw
466 |
467 | def _get_char_x(self, linelength):
468 | """
469 | Get the X coordinate of a character position.
470 | """
471 | return linelength + self.image_pad + self.line_number_width
472 |
473 | def _get_text_pos(self, linelength, lineno):
474 | """
475 | Get the actual position for a character and line position.
476 | """
477 | return self._get_char_x(linelength), self._get_line_y(lineno)
478 |
479 | def _get_linenumber_pos(self, lineno):
480 | """
481 | Get the actual position for the start of a line number.
482 | """
483 | return (self.image_pad, self._get_line_y(lineno))
484 |
485 | def _get_text_color(self, style):
486 | """
487 | Get the correct color for the token from the style.
488 | """
489 | if style['color'] is not None:
490 | fill = '#' + style['color']
491 | else:
492 | fill = '#000'
493 | return fill
494 |
495 | def _get_text_bg_color(self, style):
496 | """
497 | Get the correct background color for the token from the style.
498 | """
499 | if style['bgcolor'] is not None:
500 | bg_color = '#' + style['bgcolor']
501 | else:
502 | bg_color = None
503 | return bg_color
504 |
505 | def _get_style_font(self, style):
506 | """
507 | Get the correct font for the style.
508 | """
509 | return self.fonts.get_font(style['bold'], style['italic'])
510 |
511 | def _get_image_size(self, maxlinelength, maxlineno):
512 | """
513 | Get the required image size.
514 | """
515 | return (self._get_char_x(maxlinelength) + self.image_pad,
516 | self._get_line_y(maxlineno + 0) + self.image_pad)
517 |
518 | def _draw_linenumber(self, posno, lineno):
519 | """
520 | Remember a line number drawable to paint later.
521 | """
522 | self._draw_text(
523 | self._get_linenumber_pos(posno),
524 | str(lineno).rjust(self.line_number_chars),
525 | font=self.fonts.get_font(self.line_number_bold,
526 | self.line_number_italic),
527 | text_fg=self.line_number_fg,
528 | text_bg=None,
529 | )
530 |
531 | def _draw_text(self, pos, text, font, text_fg, text_bg):
532 | """
533 | Remember a single drawable tuple to paint later.
534 | """
535 | self.drawables.append((pos, text, font, text_fg, text_bg))
536 |
537 | def _create_drawables(self, tokensource):
538 | """
539 | Create drawables for the token content.
540 | """
541 | lineno = charno = maxcharno = 0
542 | maxlinelength = linelength = 0
543 | for ttype, value in tokensource:
544 | while ttype not in self.styles:
545 | ttype = ttype.parent
546 | style = self.styles[ttype]
547 | # TODO: make sure tab expansion happens earlier in the chain. It
548 | # really ought to be done on the input, as to do it right here is
549 | # quite complex.
550 | value = value.expandtabs(4)
551 | lines = value.splitlines(True)
552 | # print lines
553 | for i, line in enumerate(lines):
554 | temp = line.rstrip('\n')
555 | if temp:
556 | self._draw_text(
557 | self._get_text_pos(linelength, lineno),
558 | temp,
559 | font = self._get_style_font(style),
560 | text_fg = self._get_text_color(style),
561 | text_bg = self._get_text_bg_color(style),
562 | )
563 | temp_width, _ = self.fonts.get_text_size(temp)
564 | linelength += temp_width
565 | maxlinelength = max(maxlinelength, linelength)
566 | charno += len(temp)
567 | maxcharno = max(maxcharno, charno)
568 | if line.endswith('\n'):
569 | # add a line for each extra line in the value
570 | linelength = 0
571 | charno = 0
572 | lineno += 1
573 | self.maxlinelength = maxlinelength
574 | self.maxcharno = maxcharno
575 | self.maxlineno = lineno
576 |
577 | def _draw_line_numbers(self):
578 | """
579 | Create drawables for the line numbers.
580 | """
581 | if not self.line_numbers:
582 | return
583 | for p in range(self.maxlineno):
584 | n = p + self.line_number_start
585 | if (n % self.line_number_step) == 0:
586 | self._draw_linenumber(p, n)
587 |
588 | def _paint_line_number_bg(self, im):
589 | """
590 | Paint the line number background on the image.
591 | """
592 | if not self.line_numbers:
593 | return
594 | if self.line_number_fg is None:
595 | return
596 | draw = ImageDraw.Draw(im)
597 | recth = im.size[-1]
598 | rectw = self.image_pad + self.line_number_width - self.line_number_pad
599 | draw.rectangle([(0, 0), (rectw, recth)],
600 | fill=self.line_number_bg)
601 | if self.line_number_separator:
602 | draw.line([(rectw, 0), (rectw, recth)], fill=self.line_number_fg)
603 | del draw
604 |
605 | def format(self, tokensource, outfile):
606 | """
607 | Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
608 | tuples and write it into ``outfile``.
609 |
610 | This implementation calculates where it should draw each token on the
611 | pixmap, then calculates the required pixmap size and draws the items.
612 | """
613 | self._create_drawables(tokensource)
614 | self._draw_line_numbers()
615 | im = Image.new(
616 | 'RGB',
617 | self._get_image_size(self.maxlinelength, self.maxlineno),
618 | self.background_color
619 | )
620 | self._paint_line_number_bg(im)
621 | draw = ImageDraw.Draw(im)
622 | # Highlight
623 | if self.hl_lines:
624 | x = self.image_pad + self.line_number_width - self.line_number_pad + 1
625 | recth = self._get_line_height()
626 | rectw = im.size[0] - x
627 | for linenumber in self.hl_lines:
628 | y = self._get_line_y(linenumber - 1)
629 | draw.rectangle([(x, y), (x + rectw, y + recth)],
630 | fill=self.hl_color)
631 | for pos, value, font, text_fg, text_bg in self.drawables:
632 | if text_bg:
633 | # see deprecations https://pillow.readthedocs.io/en/stable/releasenotes/9.2.0.html#font-size-and-offset-methods
634 | if hasattr(draw, 'textsize'):
635 | text_size = draw.textsize(text=value, font=font)
636 | else:
637 | text_size = font.getbbox(value)[2:]
638 | draw.rectangle([pos[0], pos[1], pos[0] + text_size[0], pos[1] + text_size[1]], fill=text_bg)
639 | draw.text(pos, value, font=font, fill=text_fg)
640 | im.save(outfile, self.image_format.upper())
641 |
642 |
643 | # Add one formatter per format, so that the "-f gif" option gives the correct result
644 | # when used in pygmentize.
645 |
646 | class GifImageFormatter(ImageFormatter):
647 | """
648 | Create a GIF image from source code. This uses the Python Imaging Library to
649 | generate a pixmap from the source code.
650 |
651 | .. versionadded:: 1.0
652 | """
653 |
654 | name = 'img_gif'
655 | aliases = ['gif']
656 | filenames = ['*.gif']
657 | default_image_format = 'gif'
658 |
659 |
660 | class JpgImageFormatter(ImageFormatter):
661 | """
662 | Create a JPEG image from source code. This uses the Python Imaging Library to
663 | generate a pixmap from the source code.
664 |
665 | .. versionadded:: 1.0
666 | """
667 |
668 | name = 'img_jpg'
669 | aliases = ['jpg', 'jpeg']
670 | filenames = ['*.jpg']
671 | default_image_format = 'jpeg'
672 |
673 |
674 | class BmpImageFormatter(ImageFormatter):
675 | """
676 | Create a bitmap image from source code. This uses the Python Imaging Library to
677 | generate a pixmap from the source code.
678 |
679 | .. versionadded:: 1.0
680 | """
681 |
682 | name = 'img_bmp'
683 | aliases = ['bmp', 'bitmap']
684 | filenames = ['*.bmp']
685 | default_image_format = 'bmp'
686 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.cmdline
3 | ~~~~~~~~~~~~~~~~
4 |
5 | Command line interface.
6 |
7 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8 | :license: BSD, see LICENSE for details.
9 | """
10 |
11 | import os
12 | import sys
13 | import shutil
14 | import argparse
15 | from textwrap import dedent
16 |
17 | from pip._vendor.pygments import __version__, highlight
18 | from pip._vendor.pygments.util import ClassNotFound, OptionError, docstring_headline, \
19 | guess_decode, guess_decode_from_terminal, terminal_encoding, \
20 | UnclosingTextIOWrapper
21 | from pip._vendor.pygments.lexers import get_all_lexers, get_lexer_by_name, guess_lexer, \
22 | load_lexer_from_file, get_lexer_for_filename, find_lexer_class_for_filename
23 | from pip._vendor.pygments.lexers.special import TextLexer
24 | from pip._vendor.pygments.formatters.latex import LatexEmbeddedLexer, LatexFormatter
25 | from pip._vendor.pygments.formatters import get_all_formatters, get_formatter_by_name, \
26 | load_formatter_from_file, get_formatter_for_filename, find_formatter_class
27 | from pip._vendor.pygments.formatters.terminal import TerminalFormatter
28 | from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter, TerminalTrueColorFormatter
29 | from pip._vendor.pygments.filters import get_all_filters, find_filter_class
30 | from pip._vendor.pygments.styles import get_all_styles, get_style_by_name
31 |
32 |
33 | def _parse_options(o_strs):
34 | opts = {}
35 | if not o_strs:
36 | return opts
37 | for o_str in o_strs:
38 | if not o_str.strip():
39 | continue
40 | o_args = o_str.split(',')
41 | for o_arg in o_args:
42 | o_arg = o_arg.strip()
43 | try:
44 | o_key, o_val = o_arg.split('=', 1)
45 | o_key = o_key.strip()
46 | o_val = o_val.strip()
47 | except ValueError:
48 | opts[o_arg] = True
49 | else:
50 | opts[o_key] = o_val
51 | return opts
52 |
53 |
54 | def _parse_filters(f_strs):
55 | filters = []
56 | if not f_strs:
57 | return filters
58 | for f_str in f_strs:
59 | if ':' in f_str:
60 | fname, fopts = f_str.split(':', 1)
61 | filters.append((fname, _parse_options([fopts])))
62 | else:
63 | filters.append((f_str, {}))
64 | return filters
65 |
66 |
67 | def _print_help(what, name):
68 | try:
69 | if what == 'lexer':
70 | cls = get_lexer_by_name(name)
71 | print(f"Help on the {cls.name} lexer:")
72 | print(dedent(cls.__doc__))
73 | elif what == 'formatter':
74 | cls = find_formatter_class(name)
75 | print(f"Help on the {cls.name} formatter:")
76 | print(dedent(cls.__doc__))
77 | elif what == 'filter':
78 | cls = find_filter_class(name)
79 | print(f"Help on the {name} filter:")
80 | print(dedent(cls.__doc__))
81 | return 0
82 | except (AttributeError, ValueError):
83 | print(f"{what} not found!", file=sys.stderr)
84 | return 1
85 |
86 |
87 | def _print_list(what):
88 | if what == 'lexer':
89 | print()
90 | print("Lexers:")
91 | print("~~~~~~~")
92 |
93 | info = []
94 | for fullname, names, exts, _ in get_all_lexers():
95 | tup = (', '.join(names)+':', fullname,
96 | exts and '(filenames ' + ', '.join(exts) + ')' or '')
97 | info.append(tup)
98 | info.sort()
99 | for i in info:
100 | print(('* {}\n {} {}').format(*i))
101 |
102 | elif what == 'formatter':
103 | print()
104 | print("Formatters:")
105 | print("~~~~~~~~~~~")
106 |
107 | info = []
108 | for cls in get_all_formatters():
109 | doc = docstring_headline(cls)
110 | tup = (', '.join(cls.aliases) + ':', doc, cls.filenames and
111 | '(filenames ' + ', '.join(cls.filenames) + ')' or '')
112 | info.append(tup)
113 | info.sort()
114 | for i in info:
115 | print(('* {}\n {} {}').format(*i))
116 |
117 | elif what == 'filter':
118 | print()
119 | print("Filters:")
120 | print("~~~~~~~~")
121 |
122 | for name in get_all_filters():
123 | cls = find_filter_class(name)
124 | print("* " + name + ':')
125 | print(f" {docstring_headline(cls)}")
126 |
127 | elif what == 'style':
128 | print()
129 | print("Styles:")
130 | print("~~~~~~~")
131 |
132 | for name in get_all_styles():
133 | cls = get_style_by_name(name)
134 | print("* " + name + ':')
135 | print(f" {docstring_headline(cls)}")
136 |
137 |
138 | def _print_list_as_json(requested_items):
139 | import json
140 | result = {}
141 | if 'lexer' in requested_items:
142 | info = {}
143 | for fullname, names, filenames, mimetypes in get_all_lexers():
144 | info[fullname] = {
145 | 'aliases': names,
146 | 'filenames': filenames,
147 | 'mimetypes': mimetypes
148 | }
149 | result['lexers'] = info
150 |
151 | if 'formatter' in requested_items:
152 | info = {}
153 | for cls in get_all_formatters():
154 | doc = docstring_headline(cls)
155 | info[cls.name] = {
156 | 'aliases': cls.aliases,
157 | 'filenames': cls.filenames,
158 | 'doc': doc
159 | }
160 | result['formatters'] = info
161 |
162 | if 'filter' in requested_items:
163 | info = {}
164 | for name in get_all_filters():
165 | cls = find_filter_class(name)
166 | info[name] = {
167 | 'doc': docstring_headline(cls)
168 | }
169 | result['filters'] = info
170 |
171 | if 'style' in requested_items:
172 | info = {}
173 | for name in get_all_styles():
174 | cls = get_style_by_name(name)
175 | info[name] = {
176 | 'doc': docstring_headline(cls)
177 | }
178 | result['styles'] = info
179 |
180 | json.dump(result, sys.stdout)
181 |
182 | def main_inner(parser, argns):
183 | if argns.help:
184 | parser.print_help()
185 | return 0
186 |
187 | if argns.V:
188 | print(f'Pygments version {__version__}, (c) 2006-2024 by Georg Brandl, Matthäus '
189 | 'Chajdas and contributors.')
190 | return 0
191 |
192 | def is_only_option(opt):
193 | return not any(v for (k, v) in vars(argns).items() if k != opt)
194 |
195 | # handle ``pygmentize -L``
196 | if argns.L is not None:
197 | arg_set = set()
198 | for k, v in vars(argns).items():
199 | if v:
200 | arg_set.add(k)
201 |
202 | arg_set.discard('L')
203 | arg_set.discard('json')
204 |
205 | if arg_set:
206 | parser.print_help(sys.stderr)
207 | return 2
208 |
209 | # print version
210 | if not argns.json:
211 | main(['', '-V'])
212 | allowed_types = {'lexer', 'formatter', 'filter', 'style'}
213 | largs = [arg.rstrip('s') for arg in argns.L]
214 | if any(arg not in allowed_types for arg in largs):
215 | parser.print_help(sys.stderr)
216 | return 0
217 | if not largs:
218 | largs = allowed_types
219 | if not argns.json:
220 | for arg in largs:
221 | _print_list(arg)
222 | else:
223 | _print_list_as_json(largs)
224 | return 0
225 |
226 | # handle ``pygmentize -H``
227 | if argns.H:
228 | if not is_only_option('H'):
229 | parser.print_help(sys.stderr)
230 | return 2
231 | what, name = argns.H
232 | if what not in ('lexer', 'formatter', 'filter'):
233 | parser.print_help(sys.stderr)
234 | return 2
235 | return _print_help(what, name)
236 |
237 | # parse -O options
238 | parsed_opts = _parse_options(argns.O or [])
239 |
240 | # parse -P options
241 | for p_opt in argns.P or []:
242 | try:
243 | name, value = p_opt.split('=', 1)
244 | except ValueError:
245 | parsed_opts[p_opt] = True
246 | else:
247 | parsed_opts[name] = value
248 |
249 | # encodings
250 | inencoding = parsed_opts.get('inencoding', parsed_opts.get('encoding'))
251 | outencoding = parsed_opts.get('outencoding', parsed_opts.get('encoding'))
252 |
253 | # handle ``pygmentize -N``
254 | if argns.N:
255 | lexer = find_lexer_class_for_filename(argns.N)
256 | if lexer is None:
257 | lexer = TextLexer
258 |
259 | print(lexer.aliases[0])
260 | return 0
261 |
262 | # handle ``pygmentize -C``
263 | if argns.C:
264 | inp = sys.stdin.buffer.read()
265 | try:
266 | lexer = guess_lexer(inp, inencoding=inencoding)
267 | except ClassNotFound:
268 | lexer = TextLexer
269 |
270 | print(lexer.aliases[0])
271 | return 0
272 |
273 | # handle ``pygmentize -S``
274 | S_opt = argns.S
275 | a_opt = argns.a
276 | if S_opt is not None:
277 | f_opt = argns.f
278 | if not f_opt:
279 | parser.print_help(sys.stderr)
280 | return 2
281 | if argns.l or argns.INPUTFILE:
282 | parser.print_help(sys.stderr)
283 | return 2
284 |
285 | try:
286 | parsed_opts['style'] = S_opt
287 | fmter = get_formatter_by_name(f_opt, **parsed_opts)
288 | except ClassNotFound as err:
289 | print(err, file=sys.stderr)
290 | return 1
291 |
292 | print(fmter.get_style_defs(a_opt or ''))
293 | return 0
294 |
295 | # if no -S is given, -a is not allowed
296 | if argns.a is not None:
297 | parser.print_help(sys.stderr)
298 | return 2
299 |
300 | # parse -F options
301 | F_opts = _parse_filters(argns.F or [])
302 |
303 | # -x: allow custom (eXternal) lexers and formatters
304 | allow_custom_lexer_formatter = bool(argns.x)
305 |
306 | # select lexer
307 | lexer = None
308 |
309 | # given by name?
310 | lexername = argns.l
311 | if lexername:
312 | # custom lexer, located relative to user's cwd
313 | if allow_custom_lexer_formatter and '.py' in lexername:
314 | try:
315 | filename = None
316 | name = None
317 | if ':' in lexername:
318 | filename, name = lexername.rsplit(':', 1)
319 |
320 | if '.py' in name:
321 | # This can happen on Windows: If the lexername is
322 | # C:\lexer.py -- return to normal load path in that case
323 | name = None
324 |
325 | if filename and name:
326 | lexer = load_lexer_from_file(filename, name,
327 | **parsed_opts)
328 | else:
329 | lexer = load_lexer_from_file(lexername, **parsed_opts)
330 | except ClassNotFound as err:
331 | print('Error:', err, file=sys.stderr)
332 | return 1
333 | else:
334 | try:
335 | lexer = get_lexer_by_name(lexername, **parsed_opts)
336 | except (OptionError, ClassNotFound) as err:
337 | print('Error:', err, file=sys.stderr)
338 | return 1
339 |
340 | # read input code
341 | code = None
342 |
343 | if argns.INPUTFILE:
344 | if argns.s:
345 | print('Error: -s option not usable when input file specified',
346 | file=sys.stderr)
347 | return 2
348 |
349 | infn = argns.INPUTFILE
350 | try:
351 | with open(infn, 'rb') as infp:
352 | code = infp.read()
353 | except Exception as err:
354 | print('Error: cannot read infile:', err, file=sys.stderr)
355 | return 1
356 | if not inencoding:
357 | code, inencoding = guess_decode(code)
358 |
359 | # do we have to guess the lexer?
360 | if not lexer:
361 | try:
362 | lexer = get_lexer_for_filename(infn, code, **parsed_opts)
363 | except ClassNotFound as err:
364 | if argns.g:
365 | try:
366 | lexer = guess_lexer(code, **parsed_opts)
367 | except ClassNotFound:
368 | lexer = TextLexer(**parsed_opts)
369 | else:
370 | print('Error:', err, file=sys.stderr)
371 | return 1
372 | except OptionError as err:
373 | print('Error:', err, file=sys.stderr)
374 | return 1
375 |
376 | elif not argns.s: # treat stdin as full file (-s support is later)
377 | # read code from terminal, always in binary mode since we want to
378 | # decode ourselves and be tolerant with it
379 | code = sys.stdin.buffer.read() # use .buffer to get a binary stream
380 | if not inencoding:
381 | code, inencoding = guess_decode_from_terminal(code, sys.stdin)
382 | # else the lexer will do the decoding
383 | if not lexer:
384 | try:
385 | lexer = guess_lexer(code, **parsed_opts)
386 | except ClassNotFound:
387 | lexer = TextLexer(**parsed_opts)
388 |
389 | else: # -s option needs a lexer with -l
390 | if not lexer:
391 | print('Error: when using -s a lexer has to be selected with -l',
392 | file=sys.stderr)
393 | return 2
394 |
395 | # process filters
396 | for fname, fopts in F_opts:
397 | try:
398 | lexer.add_filter(fname, **fopts)
399 | except ClassNotFound as err:
400 | print('Error:', err, file=sys.stderr)
401 | return 1
402 |
403 | # select formatter
404 | outfn = argns.o
405 | fmter = argns.f
406 | if fmter:
407 | # custom formatter, located relative to user's cwd
408 | if allow_custom_lexer_formatter and '.py' in fmter:
409 | try:
410 | filename = None
411 | name = None
412 | if ':' in fmter:
413 | # Same logic as above for custom lexer
414 | filename, name = fmter.rsplit(':', 1)
415 |
416 | if '.py' in name:
417 | name = None
418 |
419 | if filename and name:
420 | fmter = load_formatter_from_file(filename, name,
421 | **parsed_opts)
422 | else:
423 | fmter = load_formatter_from_file(fmter, **parsed_opts)
424 | except ClassNotFound as err:
425 | print('Error:', err, file=sys.stderr)
426 | return 1
427 | else:
428 | try:
429 | fmter = get_formatter_by_name(fmter, **parsed_opts)
430 | except (OptionError, ClassNotFound) as err:
431 | print('Error:', err, file=sys.stderr)
432 | return 1
433 |
434 | if outfn:
435 | if not fmter:
436 | try:
437 | fmter = get_formatter_for_filename(outfn, **parsed_opts)
438 | except (OptionError, ClassNotFound) as err:
439 | print('Error:', err, file=sys.stderr)
440 | return 1
441 | try:
442 | outfile = open(outfn, 'wb')
443 | except Exception as err:
444 | print('Error: cannot open outfile:', err, file=sys.stderr)
445 | return 1
446 | else:
447 | if not fmter:
448 | if os.environ.get('COLORTERM','') in ('truecolor', '24bit'):
449 | fmter = TerminalTrueColorFormatter(**parsed_opts)
450 | elif '256' in os.environ.get('TERM', ''):
451 | fmter = Terminal256Formatter(**parsed_opts)
452 | else:
453 | fmter = TerminalFormatter(**parsed_opts)
454 | outfile = sys.stdout.buffer
455 |
456 | # determine output encoding if not explicitly selected
457 | if not outencoding:
458 | if outfn:
459 | # output file? use lexer encoding for now (can still be None)
460 | fmter.encoding = inencoding
461 | else:
462 | # else use terminal encoding
463 | fmter.encoding = terminal_encoding(sys.stdout)
464 |
465 | # provide coloring under Windows, if possible
466 | if not outfn and sys.platform in ('win32', 'cygwin') and \
467 | fmter.name in ('Terminal', 'Terminal256'): # pragma: no cover
468 | # unfortunately colorama doesn't support binary streams on Py3
469 | outfile = UnclosingTextIOWrapper(outfile, encoding=fmter.encoding)
470 | fmter.encoding = None
471 | try:
472 | import colorama.initialise
473 | except ImportError:
474 | pass
475 | else:
476 | outfile = colorama.initialise.wrap_stream(
477 | outfile, convert=None, strip=None, autoreset=False, wrap=True)
478 |
479 | # When using the LaTeX formatter and the option `escapeinside` is
480 | # specified, we need a special lexer which collects escaped text
481 | # before running the chosen language lexer.
482 | escapeinside = parsed_opts.get('escapeinside', '')
483 | if len(escapeinside) == 2 and isinstance(fmter, LatexFormatter):
484 | left = escapeinside[0]
485 | right = escapeinside[1]
486 | lexer = LatexEmbeddedLexer(left, right, lexer)
487 |
488 | # ... and do it!
489 | if not argns.s:
490 | # process whole input as per normal...
491 | try:
492 | highlight(code, lexer, fmter, outfile)
493 | finally:
494 | if outfn:
495 | outfile.close()
496 | return 0
497 | else:
498 | # line by line processing of stdin (eg: for 'tail -f')...
499 | try:
500 | while 1:
501 | line = sys.stdin.buffer.readline()
502 | if not line:
503 | break
504 | if not inencoding:
505 | line = guess_decode_from_terminal(line, sys.stdin)[0]
506 | highlight(line, lexer, fmter, outfile)
507 | if hasattr(outfile, 'flush'):
508 | outfile.flush()
509 | return 0
510 | except KeyboardInterrupt: # pragma: no cover
511 | return 0
512 | finally:
513 | if outfn:
514 | outfile.close()
515 |
516 |
517 | class HelpFormatter(argparse.HelpFormatter):
518 | def __init__(self, prog, indent_increment=2, max_help_position=16, width=None):
519 | if width is None:
520 | try:
521 | width = shutil.get_terminal_size().columns - 2
522 | except Exception:
523 | pass
524 | argparse.HelpFormatter.__init__(self, prog, indent_increment,
525 | max_help_position, width)
526 |
527 |
528 | def main(args=sys.argv):
529 | """
530 | Main command line entry point.
531 | """
532 | desc = "Highlight an input file and write the result to an output file."
533 | parser = argparse.ArgumentParser(description=desc, add_help=False,
534 | formatter_class=HelpFormatter)
535 |
536 | operation = parser.add_argument_group('Main operation')
537 | lexersel = operation.add_mutually_exclusive_group()
538 | lexersel.add_argument(
539 | '-l', metavar='LEXER',
540 | help='Specify the lexer to use. (Query names with -L.) If not '
541 | 'given and -g is not present, the lexer is guessed from the filename.')
542 | lexersel.add_argument(
543 | '-g', action='store_true',
544 | help='Guess the lexer from the file contents, or pass through '
545 | 'as plain text if nothing can be guessed.')
546 | operation.add_argument(
547 | '-F', metavar='FILTER[:options]', action='append',
548 | help='Add a filter to the token stream. (Query names with -L.) '
549 | 'Filter options are given after a colon if necessary.')
550 | operation.add_argument(
551 | '-f', metavar='FORMATTER',
552 | help='Specify the formatter to use. (Query names with -L.) '
553 | 'If not given, the formatter is guessed from the output filename, '
554 | 'and defaults to the terminal formatter if the output is to the '
555 | 'terminal or an unknown file extension.')
556 | operation.add_argument(
557 | '-O', metavar='OPTION=value[,OPTION=value,...]', action='append',
558 | help='Give options to the lexer and formatter as a comma-separated '
559 | 'list of key-value pairs. '
560 | 'Example: `-O bg=light,python=cool`.')
561 | operation.add_argument(
562 | '-P', metavar='OPTION=value', action='append',
563 | help='Give a single option to the lexer and formatter - with this '
564 | 'you can pass options whose value contains commas and equal signs. '
565 | 'Example: `-P "heading=Pygments, the Python highlighter"`.')
566 | operation.add_argument(
567 | '-o', metavar='OUTPUTFILE',
568 | help='Where to write the output. Defaults to standard output.')
569 |
570 | operation.add_argument(
571 | 'INPUTFILE', nargs='?',
572 | help='Where to read the input. Defaults to standard input.')
573 |
574 | flags = parser.add_argument_group('Operation flags')
575 | flags.add_argument(
576 | '-v', action='store_true',
577 | help='Print a detailed traceback on unhandled exceptions, which '
578 | 'is useful for debugging and bug reports.')
579 | flags.add_argument(
580 | '-s', action='store_true',
581 | help='Process lines one at a time until EOF, rather than waiting to '
582 | 'process the entire file. This only works for stdin, only for lexers '
583 | 'with no line-spanning constructs, and is intended for streaming '
584 | 'input such as you get from `tail -f`. '
585 | 'Example usage: `tail -f sql.log | pygmentize -s -l sql`.')
586 | flags.add_argument(
587 | '-x', action='store_true',
588 | help='Allow custom lexers and formatters to be loaded from a .py file '
589 | 'relative to the current working directory. For example, '
590 | '`-l ./customlexer.py -x`. By default, this option expects a file '
591 | 'with a class named CustomLexer or CustomFormatter; you can also '
592 | 'specify your own class name with a colon (`-l ./lexer.py:MyLexer`). '
593 | 'Users should be very careful not to use this option with untrusted '
594 | 'files, because it will import and run them.')
595 | flags.add_argument('--json', help='Output as JSON. This can '
596 | 'be only used in conjunction with -L.',
597 | default=False,
598 | action='store_true')
599 |
600 | special_modes_group = parser.add_argument_group(
601 | 'Special modes - do not do any highlighting')
602 | special_modes = special_modes_group.add_mutually_exclusive_group()
603 | special_modes.add_argument(
604 | '-S', metavar='STYLE -f formatter',
605 | help='Print style definitions for STYLE for a formatter '
606 | 'given with -f. The argument given by -a is formatter '
607 | 'dependent.')
608 | special_modes.add_argument(
609 | '-L', nargs='*', metavar='WHAT',
610 | help='List lexers, formatters, styles or filters -- '
611 | 'give additional arguments for the thing(s) you want to list '
612 | '(e.g. "styles"), or omit them to list everything.')
613 | special_modes.add_argument(
614 | '-N', metavar='FILENAME',
615 | help='Guess and print out a lexer name based solely on the given '
616 | 'filename. Does not take input or highlight anything. If no specific '
617 | 'lexer can be determined, "text" is printed.')
618 | special_modes.add_argument(
619 | '-C', action='store_true',
620 | help='Like -N, but print out a lexer name based solely on '
621 | 'a given content from standard input.')
622 | special_modes.add_argument(
623 | '-H', action='store', nargs=2, metavar=('NAME', 'TYPE'),
624 | help='Print detailed help for the object <name> of type <type>, '
625 | 'where <type> is one of "lexer", "formatter" or "filter".')
626 | special_modes.add_argument(
627 | '-V', action='store_true',
628 | help='Print the package version.')
629 | special_modes.add_argument(
630 | '-h', '--help', action='store_true',
631 | help='Print this help.')
632 | special_modes_group.add_argument(
633 | '-a', metavar='ARG',
634 | help='Formatter-specific additional argument for the -S (print '
635 | 'style sheet) mode.')
636 |
637 | argns = parser.parse_args(args[1:])
638 |
639 | try:
640 | return main_inner(parser, argns)
641 | except BrokenPipeError:
642 | # someone closed our stdout, e.g. by quitting a pager.
643 | return 0
644 | except Exception:
645 | if argns.v:
646 | print(file=sys.stderr)
647 | print('*' * 65, file=sys.stderr)
648 | print('An unhandled exception occurred while highlighting.',
649 | file=sys.stderr)
650 | print('Please report the whole traceback to the issue tracker at',
651 | file=sys.stderr)
652 | print('<https://github.com/pygments/pygments/issues>.',
653 | file=sys.stderr)
654 | print('*' * 65, file=sys.stderr)
655 | print(file=sys.stderr)
656 | raise
657 | import traceback
658 | info = traceback.format_exception(*sys.exc_info())
659 | msg = info[-1].strip()
660 | if len(info) >= 3:
661 | # extract relevant file and position info
662 | msg += '\n (f{})'.format(info[-2].split('\n')[0].strip()[1:])
663 | print(file=sys.stderr)
664 | print('*** Error while highlighting:', file=sys.stderr)
665 | print(msg, file=sys.stderr)
666 | print('*** If this is a bug you want to report, please rerun with -v.',
667 | file=sys.stderr)
668 | return 1
669 |
```