vijayakumaran92 commited on
Commit
8788e3f
·
verified ·
1 Parent(s): 0253b62

Add files using upload-large-folder tool

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +2 -0
  2. ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/__init__.py +222 -0
  3. ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc +0 -0
  4. ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc +0 -0
  5. ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/override.py +1 -0
  6. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/INSTALLER +1 -0
  7. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/METADATA +90 -0
  8. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/RECORD +856 -0
  9. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/REQUESTED +0 -0
  10. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/WHEEL +5 -0
  11. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/entry_points.txt +3 -0
  12. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt +821 -0
  13. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt +20 -0
  14. ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/top_level.txt +1 -0
  15. ACE_plus/flashenv/lib/python3.10/site-packages/pip/__init__.py +13 -0
  16. ACE_plus/flashenv/lib/python3.10/site-packages/pip/__main__.py +24 -0
  17. ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pip-runner__.py +50 -0
  18. ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pycache__/__init__.cpython-310.pyc +0 -0
  19. ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pycache__/__main__.cpython-310.pyc +0 -0
  20. ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc +0 -0
  21. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/__init__.py +18 -0
  22. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/build_env.py +325 -0
  23. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/cache.py +289 -0
  24. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/configuration.py +383 -0
  25. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/exceptions.py +862 -0
  26. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/main.py +12 -0
  27. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py +162 -0
  28. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc +0 -0
  29. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc +0 -0
  30. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc +0 -0
  31. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc +0 -0
  32. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/_json.py +86 -0
  33. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/base.py +690 -0
  34. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__init__.py +6 -0
  35. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc +0 -0
  36. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc +0 -0
  37. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc +0 -0
  38. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc +0 -0
  39. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_compat.py +85 -0
  40. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_dists.py +228 -0
  41. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_envs.py +140 -0
  42. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py +301 -0
  43. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/pyproject.py +185 -0
  44. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py +252 -0
  45. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/vcs/git.py +536 -0
  46. ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py +332 -0
  47. ACE_plus/flashenv/lib/python3.10/site-packages/pip/py.typed +4 -0
  48. ACE_plus/flashenv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/INSTALLER +1 -0
  49. ACE_plus/flashenv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/LICENSE +19 -0
  50. ACE_plus/flashenv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/METADATA +144 -0
.gitattributes CHANGED
@@ -102,3 +102,5 @@ Training_Data/Venusperson_11-Garment.jpg filter=lfs diff=lfs merge=lfs -text
102
  Training_Data/TigcPerson_2.jpg filter=lfs diff=lfs merge=lfs -text
103
  ACE_plus/flashenv/lib/python3.10/site-packages/setuptools/cli-arm64.exe filter=lfs diff=lfs merge=lfs -text
104
  ACE_plus/flashenv/lib/python3.10/site-packages/setuptools/gui-arm64.exe filter=lfs diff=lfs merge=lfs -text
 
 
 
102
  Training_Data/TigcPerson_2.jpg filter=lfs diff=lfs merge=lfs -text
103
  ACE_plus/flashenv/lib/python3.10/site-packages/setuptools/cli-arm64.exe filter=lfs diff=lfs merge=lfs -text
104
  ACE_plus/flashenv/lib/python3.10/site-packages/setuptools/gui-arm64.exe filter=lfs diff=lfs merge=lfs -text
105
+ ACE_plus/flashenv/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc filter=lfs diff=lfs merge=lfs -text
106
+ ACE_plus/flashenv/lib/python3.10/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-310.pyc filter=lfs diff=lfs merge=lfs -text
ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/__init__.py ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # don't import any costly modules
2
+ import sys
3
+ import os
4
+
5
+
6
+ is_pypy = '__pypy__' in sys.builtin_module_names
7
+
8
+
9
+ def warn_distutils_present():
10
+ if 'distutils' not in sys.modules:
11
+ return
12
+ if is_pypy and sys.version_info < (3, 7):
13
+ # PyPy for 3.6 unconditionally imports distutils, so bypass the warning
14
+ # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
15
+ return
16
+ import warnings
17
+
18
+ warnings.warn(
19
+ "Distutils was imported before Setuptools, but importing Setuptools "
20
+ "also replaces the `distutils` module in `sys.modules`. This may lead "
21
+ "to undesirable behaviors or errors. To avoid these issues, avoid "
22
+ "using distutils directly, ensure that setuptools is installed in the "
23
+ "traditional way (e.g. not an editable install), and/or make sure "
24
+ "that setuptools is always imported before distutils."
25
+ )
26
+
27
+
28
+ def clear_distutils():
29
+ if 'distutils' not in sys.modules:
30
+ return
31
+ import warnings
32
+
33
+ warnings.warn("Setuptools is replacing distutils.")
34
+ mods = [
35
+ name
36
+ for name in sys.modules
37
+ if name == "distutils" or name.startswith("distutils.")
38
+ ]
39
+ for name in mods:
40
+ del sys.modules[name]
41
+
42
+
43
+ def enabled():
44
+ """
45
+ Allow selection of distutils by environment variable.
46
+ """
47
+ which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
48
+ return which == 'local'
49
+
50
+
51
+ def ensure_local_distutils():
52
+ import importlib
53
+
54
+ clear_distutils()
55
+
56
+ # With the DistutilsMetaFinder in place,
57
+ # perform an import to cause distutils to be
58
+ # loaded from setuptools._distutils. Ref #2906.
59
+ with shim():
60
+ importlib.import_module('distutils')
61
+
62
+ # check that submodules load as expected
63
+ core = importlib.import_module('distutils.core')
64
+ assert '_distutils' in core.__file__, core.__file__
65
+ assert 'setuptools._distutils.log' not in sys.modules
66
+
67
+
68
+ def do_override():
69
+ """
70
+ Ensure that the local copy of distutils is preferred over stdlib.
71
+
72
+ See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
73
+ for more motivation.
74
+ """
75
+ if enabled():
76
+ warn_distutils_present()
77
+ ensure_local_distutils()
78
+
79
+
80
+ class _TrivialRe:
81
+ def __init__(self, *patterns):
82
+ self._patterns = patterns
83
+
84
+ def match(self, string):
85
+ return all(pat in string for pat in self._patterns)
86
+
87
+
88
+ class DistutilsMetaFinder:
89
+ def find_spec(self, fullname, path, target=None):
90
+ # optimization: only consider top level modules and those
91
+ # found in the CPython test suite.
92
+ if path is not None and not fullname.startswith('test.'):
93
+ return
94
+
95
+ method_name = 'spec_for_{fullname}'.format(**locals())
96
+ method = getattr(self, method_name, lambda: None)
97
+ return method()
98
+
99
+ def spec_for_distutils(self):
100
+ if self.is_cpython():
101
+ return
102
+
103
+ import importlib
104
+ import importlib.abc
105
+ import importlib.util
106
+
107
+ try:
108
+ mod = importlib.import_module('setuptools._distutils')
109
+ except Exception:
110
+ # There are a couple of cases where setuptools._distutils
111
+ # may not be present:
112
+ # - An older Setuptools without a local distutils is
113
+ # taking precedence. Ref #2957.
114
+ # - Path manipulation during sitecustomize removes
115
+ # setuptools from the path but only after the hook
116
+ # has been loaded. Ref #2980.
117
+ # In either case, fall back to stdlib behavior.
118
+ return
119
+
120
+ class DistutilsLoader(importlib.abc.Loader):
121
+ def create_module(self, spec):
122
+ mod.__name__ = 'distutils'
123
+ return mod
124
+
125
+ def exec_module(self, module):
126
+ pass
127
+
128
+ return importlib.util.spec_from_loader(
129
+ 'distutils', DistutilsLoader(), origin=mod.__file__
130
+ )
131
+
132
+ @staticmethod
133
+ def is_cpython():
134
+ """
135
+ Suppress supplying distutils for CPython (build and tests).
136
+ Ref #2965 and #3007.
137
+ """
138
+ return os.path.isfile('pybuilddir.txt')
139
+
140
+ def spec_for_pip(self):
141
+ """
142
+ Ensure stdlib distutils when running under pip.
143
+ See pypa/pip#8761 for rationale.
144
+ """
145
+ if self.pip_imported_during_build():
146
+ return
147
+ clear_distutils()
148
+ self.spec_for_distutils = lambda: None
149
+
150
+ @classmethod
151
+ def pip_imported_during_build(cls):
152
+ """
153
+ Detect if pip is being imported in a build script. Ref #2355.
154
+ """
155
+ import traceback
156
+
157
+ return any(
158
+ cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None)
159
+ )
160
+
161
+ @staticmethod
162
+ def frame_file_is_setup(frame):
163
+ """
164
+ Return True if the indicated frame suggests a setup.py file.
165
+ """
166
+ # some frames may not have __file__ (#2940)
167
+ return frame.f_globals.get('__file__', '').endswith('setup.py')
168
+
169
+ def spec_for_sensitive_tests(self):
170
+ """
171
+ Ensure stdlib distutils when running select tests under CPython.
172
+
173
+ python/cpython#91169
174
+ """
175
+ clear_distutils()
176
+ self.spec_for_distutils = lambda: None
177
+
178
+ sensitive_tests = (
179
+ [
180
+ 'test.test_distutils',
181
+ 'test.test_peg_generator',
182
+ 'test.test_importlib',
183
+ ]
184
+ if sys.version_info < (3, 10)
185
+ else [
186
+ 'test.test_distutils',
187
+ ]
188
+ )
189
+
190
+
191
+ for name in DistutilsMetaFinder.sensitive_tests:
192
+ setattr(
193
+ DistutilsMetaFinder,
194
+ f'spec_for_{name}',
195
+ DistutilsMetaFinder.spec_for_sensitive_tests,
196
+ )
197
+
198
+
199
+ DISTUTILS_FINDER = DistutilsMetaFinder()
200
+
201
+
202
+ def add_shim():
203
+ DISTUTILS_FINDER in sys.meta_path or insert_shim()
204
+
205
+
206
+ class shim:
207
+ def __enter__(self):
208
+ insert_shim()
209
+
210
+ def __exit__(self, exc, value, tb):
211
+ remove_shim()
212
+
213
+
214
+ def insert_shim():
215
+ sys.meta_path.insert(0, DISTUTILS_FINDER)
216
+
217
+
218
+ def remove_shim():
219
+ try:
220
+ sys.meta_path.remove(DISTUTILS_FINDER)
221
+ except ValueError:
222
+ pass
ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (7.6 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc ADDED
Binary file (249 Bytes). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/_distutils_hack/override.py ADDED
@@ -0,0 +1 @@
 
 
1
+ __import__('_distutils_hack').do_override()
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/METADATA ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.4
2
+ Name: pip
3
+ Version: 25.1.1
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Author-email: The pip developers <distutils-sig@python.org>
6
+ License: MIT
7
+ Project-URL: Homepage, https://pip.pypa.io/
8
+ Project-URL: Documentation, https://pip.pypa.io
9
+ Project-URL: Source, https://github.com/pypa/pip
10
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Topic :: Software Development :: Build Tools
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
25
+ Requires-Python: >=3.9
26
+ Description-Content-Type: text/x-rst
27
+ License-File: LICENSE.txt
28
+ License-File: AUTHORS.txt
29
+ Dynamic: license-file
30
+
31
+ pip - The Python Package Installer
32
+ ==================================
33
+
34
+ .. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
35
+ :target: https://pypi.org/project/pip/
36
+ :alt: PyPI
37
+
38
+ .. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
39
+ :target: https://pypi.org/project/pip
40
+ :alt: PyPI - Python Version
41
+
42
+ .. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
43
+ :target: https://pip.pypa.io/en/latest
44
+ :alt: Documentation
45
+
46
+ |pypi-version| |python-versions| |docs-badge|
47
+
48
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
49
+
50
+ Please take a look at our documentation for how to install and use pip:
51
+
52
+ * `Installation`_
53
+ * `Usage`_
54
+
55
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
56
+
57
+ * `Release notes`_
58
+ * `Release process`_
59
+
60
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
61
+
62
+ * `Issue tracking`_
63
+ * `Discourse channel`_
64
+ * `User IRC`_
65
+
66
+ If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
67
+
68
+ * `GitHub page`_
69
+ * `Development documentation`_
70
+ * `Development IRC`_
71
+
72
+ Code of Conduct
73
+ ---------------
74
+
75
+ Everyone interacting in the pip project's codebases, issue trackers, chat
76
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
77
+
78
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
79
+ .. _Python Package Index: https://pypi.org
80
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
81
+ .. _Usage: https://pip.pypa.io/en/stable/
82
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
83
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
84
+ .. _GitHub page: https://github.com/pypa/pip
85
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
86
+ .. _Issue tracking: https://github.com/pypa/pip/issues
87
+ .. _Discourse channel: https://discuss.python.org/c/packaging
88
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
89
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
90
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/RECORD ADDED
@@ -0,0 +1,856 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ../../../bin/pip,sha256=GUKm52nbzXN18Ink90C0nPpHyts6Si4jGZ9Hqycn3xo,264
2
+ ../../../bin/pip3,sha256=GUKm52nbzXN18Ink90C0nPpHyts6Si4jGZ9Hqycn3xo,264
3
+ ../../../bin/pip3.10,sha256=GUKm52nbzXN18Ink90C0nPpHyts6Si4jGZ9Hqycn3xo,264
4
+ pip-25.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
5
+ pip-25.1.1.dist-info/METADATA,sha256=QFxj1tLpk8hGWrgQLRhJYUpwo_1FqBr43OT0srIZcmU,3649
6
+ pip-25.1.1.dist-info/RECORD,,
7
+ pip-25.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ pip-25.1.1.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
9
+ pip-25.1.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
10
+ pip-25.1.1.dist-info/licenses/AUTHORS.txt,sha256=YzDFTYpeYnwpmODDFTgyKZNKWcfdO10L5Ex_U6kJLRc,11223
11
+ pip-25.1.1.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
12
+ pip-25.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
13
+ pip/__init__.py,sha256=zQQ7Na8YWi0IN86IUKEzDAJtyVpXdJXYDkQ536caUiQ,357
14
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
15
+ pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
16
+ pip/__pycache__/__init__.cpython-310.pyc,,
17
+ pip/__pycache__/__main__.cpython-310.pyc,,
18
+ pip/__pycache__/__pip-runner__.cpython-310.pyc,,
19
+ pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
20
+ pip/_internal/__pycache__/__init__.cpython-310.pyc,,
21
+ pip/_internal/__pycache__/build_env.cpython-310.pyc,,
22
+ pip/_internal/__pycache__/cache.cpython-310.pyc,,
23
+ pip/_internal/__pycache__/configuration.cpython-310.pyc,,
24
+ pip/_internal/__pycache__/exceptions.cpython-310.pyc,,
25
+ pip/_internal/__pycache__/main.cpython-310.pyc,,
26
+ pip/_internal/__pycache__/pyproject.cpython-310.pyc,,
27
+ pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,,
28
+ pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,,
29
+ pip/_internal/build_env.py,sha256=60_espLI9X3C2db3Ww2gIcyjNk2cAPNcc5gsVO4DOqg,10924
30
+ pip/_internal/cache.py,sha256=SjhJK1C6NbonrU4AyYXKTOH0CGOk5cJrYt60mRANnPM,10368
31
+ pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131
32
+ pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,,
33
+ pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,,
34
+ pip/_internal/cli/__pycache__/base_command.cpython-310.pyc,,
35
+ pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc,,
36
+ pip/_internal/cli/__pycache__/command_context.cpython-310.pyc,,
37
+ pip/_internal/cli/__pycache__/index_command.cpython-310.pyc,,
38
+ pip/_internal/cli/__pycache__/main.cpython-310.pyc,,
39
+ pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc,,
40
+ pip/_internal/cli/__pycache__/parser.cpython-310.pyc,,
41
+ pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc,,
42
+ pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,,
43
+ pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,,
44
+ pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,,
45
+ pip/_internal/cli/autocompletion.py,sha256=fs0Wy16Ga5tX1IZKvww5BDi7i5zyzfCPvu7cgXlgXys,6864
46
+ pip/_internal/cli/base_command.py,sha256=0A8YuJVJh2YyXU8pdW0eidLg1eklCW5cU01mpI-FAxA,8351
47
+ pip/_internal/cli/cmdoptions.py,sha256=-_V4gjMa0c3U8-vXKAyb5xVViJNzFAxBI3Zx_6Ds5-g,31909
48
+ pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
49
+ pip/_internal/cli/index_command.py,sha256=kplkusUgCZy75jNCo-etaDmSG8UvqcR2W50ALDdm6dk,5720
50
+ pip/_internal/cli/main.py,sha256=1bXC7uL3tdb_EZlGVKs6_TgzC9tlKU7zhAZsbZA-IzY,2816
51
+ pip/_internal/cli/main_parser.py,sha256=chZqNmCuO_JYt8ynBCumh4crURaRoXBZ0RxoSYQIwCw,4337
52
+ pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
53
+ pip/_internal/cli/progress_bars.py,sha256=r9BD4T2-egcInB1Uh9Jjw3EP9F3INy5kZhGwSePm9jo,4435
54
+ pip/_internal/cli/req_command.py,sha256=1yfssBvnUKNer8D7iT3OHqdJJNdCqRhwDqUFWgieppk,12934
55
+ pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
56
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
57
+ pip/_internal/commands/__init__.py,sha256=3405KyFv4l0ruxeF69oosFanxNQcC_fHBGv7Rpt0PXg,4009
58
+ pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,,
59
+ pip/_internal/commands/__pycache__/cache.cpython-310.pyc,,
60
+ pip/_internal/commands/__pycache__/check.cpython-310.pyc,,
61
+ pip/_internal/commands/__pycache__/completion.cpython-310.pyc,,
62
+ pip/_internal/commands/__pycache__/configuration.cpython-310.pyc,,
63
+ pip/_internal/commands/__pycache__/debug.cpython-310.pyc,,
64
+ pip/_internal/commands/__pycache__/download.cpython-310.pyc,,
65
+ pip/_internal/commands/__pycache__/freeze.cpython-310.pyc,,
66
+ pip/_internal/commands/__pycache__/hash.cpython-310.pyc,,
67
+ pip/_internal/commands/__pycache__/help.cpython-310.pyc,,
68
+ pip/_internal/commands/__pycache__/index.cpython-310.pyc,,
69
+ pip/_internal/commands/__pycache__/inspect.cpython-310.pyc,,
70
+ pip/_internal/commands/__pycache__/install.cpython-310.pyc,,
71
+ pip/_internal/commands/__pycache__/list.cpython-310.pyc,,
72
+ pip/_internal/commands/__pycache__/lock.cpython-310.pyc,,
73
+ pip/_internal/commands/__pycache__/search.cpython-310.pyc,,
74
+ pip/_internal/commands/__pycache__/show.cpython-310.pyc,,
75
+ pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc,,
76
+ pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,,
77
+ pip/_internal/commands/cache.py,sha256=IOezTicHjGE5sWdBx2nwPVgbjuJHM3s-BZEkpZLemuY,8107
78
+ pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
79
+ pip/_internal/commands/completion.py,sha256=W9QFQTPLjy2tPACJ_y3g9EgB1pbsh7pvCUX8ocuIdPg,4554
80
+ pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
81
+ pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
82
+ pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
83
+ pip/_internal/commands/freeze.py,sha256=YW-aMmAzzOaBWWobo9g4DPKuWp0dTC32lWMqXzKFLzE,3144
84
+ pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
85
+ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
86
+ pip/_internal/commands/index.py,sha256=8UucFVwx6FmM8cNbaPY8iI5kZdV3f6jhqDa-S8aGgpg,5068
87
+ pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
88
+ pip/_internal/commands/install.py,sha256=SRsiLpead7A8bLdxMqxTAJM3sUFHtgN9zgBT98UQz5E,29757
89
+ pip/_internal/commands/list.py,sha256=Rwtf8B0d0-WrkM7Qsv41-dWg8I_r9BLuZV30wSWnzgU,13274
90
+ pip/_internal/commands/lock.py,sha256=bUYrryKa769UXM61imojoeVVgc_1ZHK-9a0hIJmmlCg,5941
91
+ pip/_internal/commands/search.py,sha256=IrfvxcRCSoZY9A5XAlCF1wtl_y2HPcXslQdHcjzwMNk,5784
92
+ pip/_internal/commands/show.py,sha256=Yh5rGYhR2Io5TkL0fFCMWE1VqqM4xhPHjhbdS3QgEac,8028
93
+ pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
94
+ pip/_internal/commands/wheel.py,sha256=NEfaVF4f41VBNSn93RL8gkfCEDmdGhbP9xu_dE6cdUk,6346
95
+ pip/_internal/configuration.py,sha256=-KOok6jh3hFzXMPQFPJ1_EFjBpAsge-RSreQuLHLmzo,14005
96
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
97
+ pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,,
98
+ pip/_internal/distributions/__pycache__/base.cpython-310.pyc,,
99
+ pip/_internal/distributions/__pycache__/installed.cpython-310.pyc,,
100
+ pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc,,
101
+ pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc,,
102
+ pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
103
+ pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
104
+ pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
105
+ pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
106
+ pip/_internal/exceptions.py,sha256=wpE11H0e4L9G6AH70sRG149z82X7wX530HK-9eA_DIQ,28464
107
+ pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29
108
+ pip/_internal/index/__pycache__/__init__.cpython-310.pyc,,
109
+ pip/_internal/index/__pycache__/collector.cpython-310.pyc,,
110
+ pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,,
111
+ pip/_internal/index/__pycache__/sources.cpython-310.pyc,,
112
+ pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
113
+ pip/_internal/index/package_finder.py,sha256=RohRzzLExoXl7QDdTiqyxIaQEcHUn6UNOr9KzC1vjL0,38446
114
+ pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
115
+ pip/_internal/locations/__init__.py,sha256=vvTMNxghT0aEXrSdqpNtuRDGx08bzJxfDAUUfQ0Vb0A,14309
116
+ pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,,
117
+ pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,,
118
+ pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,,
119
+ pip/_internal/locations/__pycache__/base.cpython-310.pyc,,
120
+ pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
121
+ pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
122
+ pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
123
+ pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
124
+ pip/_internal/metadata/__init__.py,sha256=nGWuZvjQlIHudlMz_-bsUs2LDA2ZKNPGevZoEGcd64Y,5723
125
+ pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,,
126
+ pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,,
127
+ pip/_internal/metadata/__pycache__/base.cpython-310.pyc,,
128
+ pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,,
129
+ pip/_internal/metadata/_json.py,sha256=ezrIYazHCINM2QUk1eA9wEAMj3aeGWeDVgGalgUzKpc,2707
130
+ pip/_internal/metadata/base.py,sha256=jCbzdIc8MgWnPR4rfrvSQhSVzSoOyKOXhj3xe8BoG8c,25467
131
+ pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
132
+ pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,,
133
+ pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,,
134
+ pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,,
135
+ pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,,
136
+ pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
137
+ pip/_internal/metadata/importlib/_dists.py,sha256=ftmYiyfUGUIjnVwt6W-Ijsimy5c28KgmXly5Q5IQ2P4,8279
138
+ pip/_internal/metadata/importlib/_envs.py,sha256=X63CkdAPJCYPhefYSLiQzPf9ijMXm5nL_A_Z68yp2-w,5297
139
+ pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
140
+ pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62
141
+ pip/_internal/models/__pycache__/__init__.cpython-310.pyc,,
142
+ pip/_internal/models/__pycache__/candidate.cpython-310.pyc,,
143
+ pip/_internal/models/__pycache__/direct_url.cpython-310.pyc,,
144
+ pip/_internal/models/__pycache__/format_control.cpython-310.pyc,,
145
+ pip/_internal/models/__pycache__/index.cpython-310.pyc,,
146
+ pip/_internal/models/__pycache__/installation_report.cpython-310.pyc,,
147
+ pip/_internal/models/__pycache__/link.cpython-310.pyc,,
148
+ pip/_internal/models/__pycache__/pylock.cpython-310.pyc,,
149
+ pip/_internal/models/__pycache__/scheme.cpython-310.pyc,,
150
+ pip/_internal/models/__pycache__/search_scope.cpython-310.pyc,,
151
+ pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc,,
152
+ pip/_internal/models/__pycache__/target_python.cpython-310.pyc,,
153
+ pip/_internal/models/__pycache__/wheel.cpython-310.pyc,,
154
+ pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
155
+ pip/_internal/models/direct_url.py,sha256=lJ1fIVTgk5UG5SzTNR0FpgSGAQjChlH-3otgiEJAhIs,6576
156
+ pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
157
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
158
+ pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
159
+ pip/_internal/models/link.py,sha256=wIAgxhiu05ycLhbtAibknXX5L6X9ju_PPLVnMcvh9B4,21511
160
+ pip/_internal/models/pylock.py,sha256=n3-I26bf2v-Kn6qcx4ATB_Zel2SLhaUxZBmsMeGgYAo,6196
161
+ pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
162
+ pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
163
+ pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
164
+ pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
165
+ pip/_internal/models/wheel.py,sha256=10NUTXIRjf2P8oe1Wzolv8oUv7-YurrOduVFUIaDhdM,5506
166
+ pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49
167
+ pip/_internal/network/__pycache__/__init__.cpython-310.pyc,,
168
+ pip/_internal/network/__pycache__/auth.cpython-310.pyc,,
169
+ pip/_internal/network/__pycache__/cache.cpython-310.pyc,,
170
+ pip/_internal/network/__pycache__/download.cpython-310.pyc,,
171
+ pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc,,
172
+ pip/_internal/network/__pycache__/session.cpython-310.pyc,,
173
+ pip/_internal/network/__pycache__/utils.cpython-310.pyc,,
174
+ pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,,
175
+ pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
176
+ pip/_internal/network/cache.py,sha256=JGYT-BUaSMdEBwII_K1UE6qyBItz7hzGkyLl_JRzkBY,4613
177
+ pip/_internal/network/download.py,sha256=6IdZyoERWIsXXFUFL_h_e_xi8Z0G0UlpkodPy8qKv2U,11078
178
+ pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
179
+ pip/_internal/network/session.py,sha256=msM4es16LmmNEYNkrYyg8fTc7gAHbKFltawfKP27LOI,18771
180
+ pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
181
+ pip/_internal/network/xmlrpc.py,sha256=jW9oDSWamMld3iZOO9RbonVC8ZStkHyppCszoevkuJg,1837
182
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
+ pip/_internal/operations/__pycache__/__init__.cpython-310.pyc,,
184
+ pip/_internal/operations/__pycache__/check.cpython-310.pyc,,
185
+ pip/_internal/operations/__pycache__/freeze.cpython-310.pyc,,
186
+ pip/_internal/operations/__pycache__/prepare.cpython-310.pyc,,
187
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
+ pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc,,
189
+ pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc,,
190
+ pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc,,
191
+ pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc,,
192
+ pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc,,
193
+ pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc,,
194
+ pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc,,
195
+ pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc,,
196
+ pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
197
+ pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421
198
+ pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509
199
+ pip/_internal/operations/build/metadata_legacy.py,sha256=wv8cFA0wTqF62Jlm9QwloYZsofOyQ7sWBBmvCcVvn1k,2189
200
+ pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
201
+ pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
202
+ pip/_internal/operations/build/wheel_legacy.py,sha256=KXpyGYoCQYcudXNZvohLXgWHaCk4Gf3z0dbS9ol4uu0,3620
203
+ pip/_internal/operations/check.py,sha256=4cnD_2eglsDe5s2CoYkxDt4HcRitTywzLMfTZ-tGQ4U,5911
204
+ pip/_internal/operations/freeze.py,sha256=1_M79jAQKnCxWr-KCCmHuVXOVFGaUJHmoWLfFzgh7K4,9843
205
+ pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50
206
+ pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc,,
207
+ pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc,,
208
+ pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,,
209
+ pip/_internal/operations/install/editable_legacy.py,sha256=TI6wT8sLqDTprWZLYEOBOe7a6-1B9uwKb7kTBxLIaWY,1282
210
+ pip/_internal/operations/install/wheel.py,sha256=4NYSQ9ypl69iiduh5gUPCK3WNYqouTHZ0rMXoVgkiZw,27553
211
+ pip/_internal/operations/prepare.py,sha256=-i9dYwwJJjN7h6sZTabcz84tizgn7EAsY0sHnLAfs3Q,28363
212
+ pip/_internal/pyproject.py,sha256=GLJ6rWRS5_2noKdajohoLyDty57Z7QXhcUAYghmTnWc,7286
213
+ pip/_internal/req/__init__.py,sha256=dX2QGlfDwEqE5pLjOeM-f2qEgXFn6f2Vdi_zIHAYy1k,3096
214
+ pip/_internal/req/__pycache__/__init__.cpython-310.pyc,,
215
+ pip/_internal/req/__pycache__/constructors.cpython-310.pyc,,
216
+ pip/_internal/req/__pycache__/req_dependency_group.cpython-310.pyc,,
217
+ pip/_internal/req/__pycache__/req_file.cpython-310.pyc,,
218
+ pip/_internal/req/__pycache__/req_install.cpython-310.pyc,,
219
+ pip/_internal/req/__pycache__/req_set.cpython-310.pyc,,
220
+ pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,,
221
+ pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
222
+ pip/_internal/req/req_dependency_group.py,sha256=5PGuZidqwDeTHZkP4tnNrlPrasfvJBONd1B5S0146zs,2677
223
+ pip/_internal/req/req_file.py,sha256=eys82McgaICOGic2UZRHjD720piKJPwmeSYdXlWwl6w,20234
224
+ pip/_internal/req/req_install.py,sha256=gMoFak9zrhjHlHaOQxPFheHKtIobppFgq1WrKel_nTE,35788
225
+ pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
226
+ pip/_internal/req/req_uninstall.py,sha256=PQ6SyocDycUYsLAsTpjkbdwO_qjdo-y8BvQfZ5Avdrw,24075
227
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
+ pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc,,
229
+ pip/_internal/resolution/__pycache__/base.cpython-310.pyc,,
230
+ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
231
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
+ pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc,,
233
+ pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc,,
234
+ pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
235
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
+ pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc,,
237
+ pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc,,
238
+ pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc,,
239
+ pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc,,
240
+ pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc,,
241
+ pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc,,
242
+ pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc,,
243
+ pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc,,
244
+ pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc,,
245
+ pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
246
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=U3Qp83jhM_RiJviyrlPCijbps6wYO6VsTDaTnCf_B3o,20241
247
+ pip/_internal/resolution/resolvelib/factory.py,sha256=FCvHc9M8UJ_7iU63QtPiHuq_BmfdnBiMJ8WaDBJNFxk,32668
248
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=6lAF_pLQ2_Z0CBOHIFxGp6NfvT1uwIpCui6e-GgI5tk,6000
249
+ pip/_internal/resolution/resolvelib/provider.py,sha256=8ptYOOjfa336D4FZ751EQHR0LDq8jJhIGJXDou8Cv8Y,11190
250
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=EwJAHOjWZ8eTHQWss7zJjmQEj6ooP6oWSwwVXFtgpqQ,3260
251
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
252
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=9zcR4c7UZV1j2ILTmb68Ck_5HdvQvf4cmTBE2bWHkKg,12785
253
+ pip/_internal/self_outdated_check.py,sha256=1PFtttvLAeyCVR3tPoBq2sOlPD0IJ-KSqU6bc1HUk9c,8318
254
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
+ pip/_internal/utils/__pycache__/__init__.cpython-310.pyc,,
256
+ pip/_internal/utils/__pycache__/_jaraco_text.cpython-310.pyc,,
257
+ pip/_internal/utils/__pycache__/_log.cpython-310.pyc,,
258
+ pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc,,
259
+ pip/_internal/utils/__pycache__/compat.cpython-310.pyc,,
260
+ pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc,,
261
+ pip/_internal/utils/__pycache__/datetime.cpython-310.pyc,,
262
+ pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc,,
263
+ pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc,,
264
+ pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc,,
265
+ pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc,,
266
+ pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc,,
267
+ pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc,,
268
+ pip/_internal/utils/__pycache__/glibc.cpython-310.pyc,,
269
+ pip/_internal/utils/__pycache__/hashes.cpython-310.pyc,,
270
+ pip/_internal/utils/__pycache__/logging.cpython-310.pyc,,
271
+ pip/_internal/utils/__pycache__/misc.cpython-310.pyc,,
272
+ pip/_internal/utils/__pycache__/packaging.cpython-310.pyc,,
273
+ pip/_internal/utils/__pycache__/retry.cpython-310.pyc,,
274
+ pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc,,
275
+ pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc,,
276
+ pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc,,
277
+ pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc,,
278
+ pip/_internal/utils/__pycache__/urls.cpython-310.pyc,,
279
+ pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc,,
280
+ pip/_internal/utils/__pycache__/wheel.cpython-310.pyc,,
281
+ pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
282
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
283
+ pip/_internal/utils/appdirs.py,sha256=zrIISCn2QxlXYw-zJZZBTrFNTyy_0WNKiI-TOoN6wJo,1705
284
+ pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
285
+ pip/_internal/utils/compatibility_tags.py,sha256=q5W7IrNlqC5ke0AqWRG6aX5pimiqh--xuPCCNwCKPsU,6662
286
+ pip/_internal/utils/datetime.py,sha256=Gt29Ml4ToPSM88j54iu43WKtrU9A-moP4QmMiiqzedU,241
287
+ pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
288
+ pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
289
+ pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
290
+ pip/_internal/utils/entrypoints.py,sha256=4CheZ81OBPPLb3Gn-X_WEPtllUibpwDVzlVQ4RFh7PM,3325
291
+ pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
292
+ pip/_internal/utils/filetypes.py,sha256=OCPzUxq3Aa6k_95MiI8DYgkOzutTs47fA-v-vYUJp9E,715
293
+ pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
294
+ pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
295
+ pip/_internal/utils/logging.py,sha256=zMZK1NxfhM4QMGUyaU9q1grNuDhLSVbSkGCvZBKmaPw,12076
296
+ pip/_internal/utils/misc.py,sha256=DWnYxBUItjRp7hhxEg4ih6P6YpKrykM86dbi_EcU8SQ,23450
297
+ pip/_internal/utils/packaging.py,sha256=CjJOqLNENW-U88ojOllVL40f1ab2W2Bm3KHCavwNNfw,1603
298
+ pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
299
+ pip/_internal/utils/setuptools_build.py,sha256=J9EyRantVgu4V-xS_qfQy2mcPLVUM7A-227QdKGUZCA,4482
300
+ pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
301
+ pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
302
+ pip/_internal/utils/unpacking.py,sha256=4yCqlRAI2zxl5tfxlnLoWLNcEn-k1c3vaet_oaJ42iI,11926
303
+ pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
304
+ pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
305
+ pip/_internal/utils/wheel.py,sha256=MHObYn6d7VyZL10i-W1xoJZ2hT5-wB1WkII70AsYUE8,4493
306
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
307
+ pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc,,
308
+ pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc,,
309
+ pip/_internal/vcs/__pycache__/git.cpython-310.pyc,,
310
+ pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,,
311
+ pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,,
312
+ pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,,
313
+ pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
314
+ pip/_internal/vcs/git.py,sha256=3KLPrKsDL9xZchmz4H1Obo8fM2Fh8ChrhtDHWjbkj-I,18591
315
+ pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
316
+ pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
317
+ pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
318
+ pip/_internal/wheel_builder.py,sha256=Z5Z2ANADbKdSHY9BHqw9zG5-1AxstO6YM6m9yLWe7Vw,11212
319
+ pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907
320
+ pip/_vendor/__pycache__/__init__.cpython-310.pyc,,
321
+ pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc,,
322
+ pip/_vendor/cachecontrol/__init__.py,sha256=x9ecUkiwNvAGfE3g0eaRx3VrJZnZWAluA2LRcvab3HQ,677
323
+ pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc,,
324
+ pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc,,
325
+ pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc,,
326
+ pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc,,
327
+ pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc,,
328
+ pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc,,
329
+ pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc,,
330
+ pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc,,
331
+ pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc,,
332
+ pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
333
+ pip/_vendor/cachecontrol/adapter.py,sha256=8y6rTPXOzVHmDKCW5CR9sivLVuDv-cpdGcZYdRWNaPw,6599
334
+ pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
335
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
336
+ pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc,,
337
+ pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc,,
338
+ pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc,,
339
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117
340
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
341
+ pip/_vendor/cachecontrol/controller.py,sha256=cx0Hl8xLZgUuXuy78Gih9AYjCtqurmYjVJxyA4yWt7w,19101
342
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=2ktXNPE0KqnyzF24aOsKCA58HQq1xeC6l2g6_zwjghc,4291
343
+ pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
344
+ pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
345
+ pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
346
+ pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
347
+ pip/_vendor/certifi/__init__.py,sha256=neIaAf7BM36ygmQCmy-ZsSyjnvjWghFeu13wwEAnjj0,94
348
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
349
+ pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,,
350
+ pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,,
351
+ pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,,
352
+ pip/_vendor/certifi/cacert.pem,sha256=xVsh-Qf3-G1IrdCTVS-1ZRdJ_1-GBQjMu0I9bB-9gMc,297255
353
+ pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
354
+ pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
355
+ pip/_vendor/dependency_groups/__init__.py,sha256=C3OFu0NGwDzQ4LOmmSOFPsRSvkbBn-mdd4j_5YqJw-s,250
356
+ pip/_vendor/dependency_groups/__main__.py,sha256=UNTM7P5mfVtT7wDi9kOTXWgV3fu3e8bTrt1Qp1jvjKo,1709
357
+ pip/_vendor/dependency_groups/__pycache__/__init__.cpython-310.pyc,,
358
+ pip/_vendor/dependency_groups/__pycache__/__main__.cpython-310.pyc,,
359
+ pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-310.pyc,,
360
+ pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-310.pyc,,
361
+ pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-310.pyc,,
362
+ pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-310.pyc,,
363
+ pip/_vendor/dependency_groups/_implementation.py,sha256=Gqb2DlQELRakeHlKf6QtQSW0M-bcEomxHw4JsvID1ls,8041
364
+ pip/_vendor/dependency_groups/_lint_dependency_groups.py,sha256=yp-DDqKXtbkDTNa0ifa-FmOA8ra24lPZEXftW-R5AuI,1710
365
+ pip/_vendor/dependency_groups/_pip_wrapper.py,sha256=nuVW_w_ntVxpE26ELEvngMY0N04sFLsijXRyZZROFG8,1865
366
+ pip/_vendor/dependency_groups/_toml_compat.py,sha256=BHnXnFacm3DeolsA35GjI6qkDApvua-1F20kv3BfZWE,285
367
+ pip/_vendor/dependency_groups/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
368
+ pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
369
+ pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,,
370
+ pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,,
371
+ pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,,
372
+ pip/_vendor/distlib/__pycache__/index.cpython-310.pyc,,
373
+ pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc,,
374
+ pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc,,
375
+ pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc,,
376
+ pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc,,
377
+ pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc,,
378
+ pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc,,
379
+ pip/_vendor/distlib/__pycache__/util.cpython-310.pyc,,
380
+ pip/_vendor/distlib/__pycache__/version.cpython-310.pyc,,
381
+ pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc,,
382
+ pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
383
+ pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
384
+ pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
385
+ pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
386
+ pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
387
+ pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
388
+ pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
389
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
390
+ pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
391
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
392
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
393
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
394
+ pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
395
+ pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
396
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
397
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
398
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
399
+ pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
400
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
401
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
402
+ pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc,,
403
+ pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc,,
404
+ pip/_vendor/distro/__pycache__/distro.cpython-310.pyc,,
405
+ pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
406
+ pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
407
+ pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
408
+ pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc,,
409
+ pip/_vendor/idna/__pycache__/codec.cpython-310.pyc,,
410
+ pip/_vendor/idna/__pycache__/compat.cpython-310.pyc,,
411
+ pip/_vendor/idna/__pycache__/core.cpython-310.pyc,,
412
+ pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc,,
413
+ pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc,,
414
+ pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,,
415
+ pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,,
416
+ pip/_vendor/idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
417
+ pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
418
+ pip/_vendor/idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
419
+ pip/_vendor/idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
420
+ pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
421
+ pip/_vendor/idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
422
+ pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
423
+ pip/_vendor/idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
424
+ pip/_vendor/msgpack/__init__.py,sha256=reRaiOtEzSjPnr7TpxjgIvbfln5pV66FhricAs2eC-g,1109
425
+ pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,,
426
+ pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,,
427
+ pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc,,
428
+ pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc,,
429
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
430
+ pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
431
+ pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
432
+ pip/_vendor/packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494
433
+ pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc,,
434
+ pip/_vendor/packaging/__pycache__/_elffile.cpython-310.pyc,,
435
+ pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc,,
436
+ pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc,,
437
+ pip/_vendor/packaging/__pycache__/_parser.cpython-310.pyc,,
438
+ pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc,,
439
+ pip/_vendor/packaging/__pycache__/_tokenizer.cpython-310.pyc,,
440
+ pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc,,
441
+ pip/_vendor/packaging/__pycache__/metadata.cpython-310.pyc,,
442
+ pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc,,
443
+ pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc,,
444
+ pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc,,
445
+ pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc,,
446
+ pip/_vendor/packaging/__pycache__/version.cpython-310.pyc,,
447
+ pip/_vendor/packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286
448
+ pip/_vendor/packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596
449
+ pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
450
+ pip/_vendor/packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221
451
+ pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
452
+ pip/_vendor/packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310
453
+ pip/_vendor/packaging/licenses/__init__.py,sha256=3bx-gryo4sRv5LsrwApouy65VIs3u6irSORJzALkrzU,5727
454
+ pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-310.pyc,,
455
+ pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-310.pyc,,
456
+ pip/_vendor/packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
457
+ pip/_vendor/packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049
458
+ pip/_vendor/packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739
459
+ pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
460
+ pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
461
+ pip/_vendor/packaging/specifiers.py,sha256=yc9D_MycJEmwUpZvcs1OZL9HfiNFmyw0RZaeHRNHkPw,40079
462
+ pip/_vendor/packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745
463
+ pip/_vendor/packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
464
+ pip/_vendor/packaging/version.py,sha256=oiHqzTUv_p12hpjgsLDVcaF5hT7pDaSOViUNMD4GTW0,16688
465
+ pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
466
+ pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,,
467
+ pip/_vendor/platformdirs/__init__.py,sha256=UfeSHWl8AeTtbOBOoHAxK4dODOWkZtfy-m_i7cWdJ8c,22344
468
+ pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
469
+ pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc,,
470
+ pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc,,
471
+ pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc,,
472
+ pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc,,
473
+ pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc,,
474
+ pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc,,
475
+ pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc,,
476
+ pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc,,
477
+ pip/_vendor/platformdirs/android.py,sha256=r0DshVBf-RO1jXJGX8C4Til7F1XWt-bkdWMgmvEiaYg,9013
478
+ pip/_vendor/platformdirs/api.py,sha256=U9EzI3EYxcXWUCtIGRllqrcN99i2LSY1mq2-GtsUwEQ,9277
479
+ pip/_vendor/platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154
480
+ pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
481
+ pip/_vendor/platformdirs/unix.py,sha256=WZmkUA--L3JNRGmz32s35YfoD3ica6xKIPdCV_HhLcs,10458
482
+ pip/_vendor/platformdirs/version.py,sha256=0fnw4ljascx7O5PfIeZ2yj6w3pAkqwp099vDcivxuvY,511
483
+ pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
484
+ pip/_vendor/pygments/__init__.py,sha256=qMm7-KYqNpMrmjymZaqfH-_9iJtjnexAKodkb9G5D5g,2983
485
+ pip/_vendor/pygments/__main__.py,sha256=WrndpSe6i1ckX_SQ1KaxD9CTKGzD0EuCOFxcbwFpoLU,353
486
+ pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,,
487
+ pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,,
488
+ pip/_vendor/pygments/__pycache__/console.cpython-310.pyc,,
489
+ pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc,,
490
+ pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc,,
491
+ pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc,,
492
+ pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc,,
493
+ pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc,,
494
+ pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc,,
495
+ pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc,,
496
+ pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc,,
497
+ pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,,
498
+ pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,,
499
+ pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,,
500
+ pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,,
501
+ pip/_vendor/pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
502
+ pip/_vendor/pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
503
+ pip/_vendor/pygments/filters/__init__.py,sha256=4U4jtA0X3iP83uQnB9-TI-HDSw8E8y8zMYHa0UjbbaI,40392
504
+ pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,,
505
+ pip/_vendor/pygments/formatter.py,sha256=KZQMmyo_xkOIkQG8g66LYEkBh1bx7a0HyGCBcvhI9Ew,4390
506
+ pip/_vendor/pygments/formatters/__init__.py,sha256=KTwBmnXlaopJhQDOemVHYHskiDghuq-08YtP6xPNJPg,5385
507
+ pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,,
508
+ pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,,
509
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
510
+ pip/_vendor/pygments/lexer.py,sha256=_kBrOJ_NT5Tl0IVM0rA9c8eysP6_yrlGzEQI0eVYB-A,35349
511
+ pip/_vendor/pygments/lexers/__init__.py,sha256=wbIME35GH7bI1B9rNPJFqWT-ij_RApZDYPUlZycaLzA,12115
512
+ pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,,
513
+ pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,,
514
+ pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,,
515
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=l4tCXM8e9aPC2BD6sjIr0deT-J-z5tHgCwL-p1fS0PE,77602
516
+ pip/_vendor/pygments/lexers/python.py,sha256=vxjn1cOHclIKJKxoyiBsQTY65GHbkZtZRuKQ2AVCKaw,53853
517
+ pip/_vendor/pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
518
+ pip/_vendor/pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
519
+ pip/_vendor/pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
520
+ pip/_vendor/pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
521
+ pip/_vendor/pygments/sphinxext.py,sha256=5x7Zh9YlU6ISJ31dMwduiaanb5dWZnKg3MyEQsseNnQ,7981
522
+ pip/_vendor/pygments/style.py,sha256=PlOZqlsnTVd58RGy50vkA2cXQ_lP5bF5EGMEBTno6DA,6420
523
+ pip/_vendor/pygments/styles/__init__.py,sha256=x9ebctfyvCAFpMTlMJ5YxwcNYBzjgq6zJaKkNm78r4M,2042
524
+ pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,,
525
+ pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-310.pyc,,
526
+ pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
527
+ pip/_vendor/pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
528
+ pip/_vendor/pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
529
+ pip/_vendor/pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
530
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
531
+ pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-310.pyc,,
532
+ pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-310.pyc,,
533
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
534
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
535
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-310.pyc,,
536
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-310.pyc,,
537
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
538
+ pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
539
+ pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
540
+ pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc,,
541
+ pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc,,
542
+ pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc,,
543
+ pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc,,
544
+ pip/_vendor/requests/__pycache__/api.cpython-310.pyc,,
545
+ pip/_vendor/requests/__pycache__/auth.cpython-310.pyc,,
546
+ pip/_vendor/requests/__pycache__/certs.cpython-310.pyc,,
547
+ pip/_vendor/requests/__pycache__/compat.cpython-310.pyc,,
548
+ pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc,,
549
+ pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc,,
550
+ pip/_vendor/requests/__pycache__/help.cpython-310.pyc,,
551
+ pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc,,
552
+ pip/_vendor/requests/__pycache__/models.cpython-310.pyc,,
553
+ pip/_vendor/requests/__pycache__/packages.cpython-310.pyc,,
554
+ pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc,,
555
+ pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc,,
556
+ pip/_vendor/requests/__pycache__/structures.cpython-310.pyc,,
557
+ pip/_vendor/requests/__pycache__/utils.cpython-310.pyc,,
558
+ pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
559
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
560
+ pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
561
+ pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
562
+ pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
563
+ pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
564
+ pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
565
+ pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
566
+ pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
567
+ pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
568
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
569
+ pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
570
+ pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
571
+ pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
572
+ pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
573
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
574
+ pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
575
+ pip/_vendor/resolvelib/__init__.py,sha256=4LcBWHMH317EKEkpV5XLVnqiU1lrmCiygjsADuCgz4s,541
576
+ pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc,,
577
+ pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc,,
578
+ pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc,,
579
+ pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc,,
580
+ pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914
581
+ pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
582
+ pip/_vendor/resolvelib/reporters.py,sha256=8BNa7G9cKW4Lie4BhDhd7Z57J_Vlb1CYPGSgVN2erMA,2038
583
+ pip/_vendor/resolvelib/resolvers/__init__.py,sha256=GMYuhrbSsYTIjOij0tuJKLvlk6UXmp3nXQetn2sOvpQ,640
584
+ pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-310.pyc,,
585
+ pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-310.pyc,,
586
+ pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-310.pyc,,
587
+ pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-310.pyc,,
588
+ pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-310.pyc,,
589
+ pip/_vendor/resolvelib/resolvers/abstract.py,sha256=jZOBVigE4PUub9i3F-bTvBwaIXX8S9EU3CGASBvFqEU,1558
590
+ pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768
591
+ pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768
592
+ pip/_vendor/resolvelib/resolvers/resolution.py,sha256=yQegMuOmlzAElLLpgD-k6NbPDMCQf29rWhiFC26OdkM,20671
593
+ pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420
594
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
595
+ pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
596
+ pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc,,
597
+ pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc,,
598
+ pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc,,
599
+ pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc,,
600
+ pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc,,
601
+ pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc,,
602
+ pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc,,
603
+ pip/_vendor/rich/__pycache__/_fileno.cpython-310.pyc,,
604
+ pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc,,
605
+ pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc,,
606
+ pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc,,
607
+ pip/_vendor/rich/__pycache__/_null_file.cpython-310.pyc,,
608
+ pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc,,
609
+ pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc,,
610
+ pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc,,
611
+ pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc,,
612
+ pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc,,
613
+ pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc,,
614
+ pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc,,
615
+ pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc,,
616
+ pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc,,
617
+ pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc,,
618
+ pip/_vendor/rich/__pycache__/abc.cpython-310.pyc,,
619
+ pip/_vendor/rich/__pycache__/align.cpython-310.pyc,,
620
+ pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc,,
621
+ pip/_vendor/rich/__pycache__/bar.cpython-310.pyc,,
622
+ pip/_vendor/rich/__pycache__/box.cpython-310.pyc,,
623
+ pip/_vendor/rich/__pycache__/cells.cpython-310.pyc,,
624
+ pip/_vendor/rich/__pycache__/color.cpython-310.pyc,,
625
+ pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc,,
626
+ pip/_vendor/rich/__pycache__/columns.cpython-310.pyc,,
627
+ pip/_vendor/rich/__pycache__/console.cpython-310.pyc,,
628
+ pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc,,
629
+ pip/_vendor/rich/__pycache__/containers.cpython-310.pyc,,
630
+ pip/_vendor/rich/__pycache__/control.cpython-310.pyc,,
631
+ pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc,,
632
+ pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc,,
633
+ pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc,,
634
+ pip/_vendor/rich/__pycache__/errors.cpython-310.pyc,,
635
+ pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc,,
636
+ pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc,,
637
+ pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc,,
638
+ pip/_vendor/rich/__pycache__/json.cpython-310.pyc,,
639
+ pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc,,
640
+ pip/_vendor/rich/__pycache__/layout.cpython-310.pyc,,
641
+ pip/_vendor/rich/__pycache__/live.cpython-310.pyc,,
642
+ pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc,,
643
+ pip/_vendor/rich/__pycache__/logging.cpython-310.pyc,,
644
+ pip/_vendor/rich/__pycache__/markup.cpython-310.pyc,,
645
+ pip/_vendor/rich/__pycache__/measure.cpython-310.pyc,,
646
+ pip/_vendor/rich/__pycache__/padding.cpython-310.pyc,,
647
+ pip/_vendor/rich/__pycache__/pager.cpython-310.pyc,,
648
+ pip/_vendor/rich/__pycache__/palette.cpython-310.pyc,,
649
+ pip/_vendor/rich/__pycache__/panel.cpython-310.pyc,,
650
+ pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc,,
651
+ pip/_vendor/rich/__pycache__/progress.cpython-310.pyc,,
652
+ pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc,,
653
+ pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc,,
654
+ pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc,,
655
+ pip/_vendor/rich/__pycache__/region.cpython-310.pyc,,
656
+ pip/_vendor/rich/__pycache__/repr.cpython-310.pyc,,
657
+ pip/_vendor/rich/__pycache__/rule.cpython-310.pyc,,
658
+ pip/_vendor/rich/__pycache__/scope.cpython-310.pyc,,
659
+ pip/_vendor/rich/__pycache__/screen.cpython-310.pyc,,
660
+ pip/_vendor/rich/__pycache__/segment.cpython-310.pyc,,
661
+ pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc,,
662
+ pip/_vendor/rich/__pycache__/status.cpython-310.pyc,,
663
+ pip/_vendor/rich/__pycache__/style.cpython-310.pyc,,
664
+ pip/_vendor/rich/__pycache__/styled.cpython-310.pyc,,
665
+ pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc,,
666
+ pip/_vendor/rich/__pycache__/table.cpython-310.pyc,,
667
+ pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc,,
668
+ pip/_vendor/rich/__pycache__/text.cpython-310.pyc,,
669
+ pip/_vendor/rich/__pycache__/theme.cpython-310.pyc,,
670
+ pip/_vendor/rich/__pycache__/themes.cpython-310.pyc,,
671
+ pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc,,
672
+ pip/_vendor/rich/__pycache__/tree.cpython-310.pyc,,
673
+ pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
674
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
675
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
676
+ pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
677
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
678
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
679
+ pip/_vendor/rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655
680
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
681
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
682
+ pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
683
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
684
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
685
+ pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
686
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
687
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
688
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
689
+ pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
690
+ pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
691
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
692
+ pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
693
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
694
+ pip/_vendor/rich/align.py,sha256=Rh-3adnDaN1Ao07EjR2PhgE62PGLPgO8SMwJBku1urQ,10469
695
+ pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
696
+ pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
697
+ pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
698
+ pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
699
+ pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
700
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
701
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
702
+ pip/_vendor/rich/console.py,sha256=_RJizBQIn9qxr4Ln7Q_SC5N9ekPWPAxH0KGVxsgg69Y,100565
703
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
704
+ pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
705
+ pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
706
+ pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257
707
+ pip/_vendor/rich/diagnose.py,sha256=WNPjU2pEdrPICJ24KOaTD_hzP839qArpmF1JIM5x_EQ,998
708
+ pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
709
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
710
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
711
+ pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
712
+ pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
713
+ pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
714
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
715
+ pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
716
+ pip/_vendor/rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270
717
+ pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
718
+ pip/_vendor/rich/logging.py,sha256=ZgpKMMBY_BuMAI_BYzo-UtXak6t5oH9VK8m9Q2Lm0f4,12458
719
+ pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
720
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
721
+ pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
722
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
723
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
724
+ pip/_vendor/rich/panel.py,sha256=SUDaa3z4MU7vIjzvbi0SXuc6BslDzADwdY1AX4TbTdY,11225
725
+ pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
726
+ pip/_vendor/rich/progress.py,sha256=MtmCjTk5zYU_XtRHxRHTAEHG6hF9PeF7EMWbEPleIC0,60357
727
+ pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
728
+ pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
729
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
730
+ pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
731
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
732
+ pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
733
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
734
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
735
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
736
+ pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
737
+ pip/_vendor/rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364
738
+ pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
739
+ pip/_vendor/rich/style.py,sha256=xpj4uMBZMtuNuNomfUiamigl3p1sDvTCZwrG1tcTVeg,27059
740
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
741
+ pip/_vendor/rich/syntax.py,sha256=qqAnEUZ4K57Po81_5RBxnsuU4KRzSdvDPAhKw8ma_3E,35763
742
+ pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049
743
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
744
+ pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
745
+ pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
746
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
747
+ pip/_vendor/rich/traceback.py,sha256=ZA8Q67DyP5a_stpIh6GPf9IiXj_s3dAhDIr6Zbfkahk,35170
748
+ pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
749
+ pip/_vendor/tomli/__init__.py,sha256=PhNw_eyLgdn7McJ6nrAN8yIm3dXC75vr1sVGVVwDSpA,314
750
+ pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,,
751
+ pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,,
752
+ pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc,,
753
+ pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,,
754
+ pip/_vendor/tomli/_parser.py,sha256=9w8LG0jB7fwmZZWB0vVXbeejDHcl4ANIJxB2scEnDlA,25591
755
+ pip/_vendor/tomli/_re.py,sha256=sh4sBDRgO94KJZwNIrgdcyV_qQast50YvzOAUGpRDKA,3171
756
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
757
+ pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
758
+ pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169
759
+ pip/_vendor/tomli_w/__pycache__/__init__.cpython-310.pyc,,
760
+ pip/_vendor/tomli_w/__pycache__/_writer.cpython-310.pyc,,
761
+ pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961
762
+ pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
763
+ pip/_vendor/truststore/__init__.py,sha256=2wRSVijjRzPLVXUzWqvdZLNsEOhDfopKLd2EKAYLwKU,1320
764
+ pip/_vendor/truststore/__pycache__/__init__.cpython-310.pyc,,
765
+ pip/_vendor/truststore/__pycache__/_api.cpython-310.pyc,,
766
+ pip/_vendor/truststore/__pycache__/_macos.cpython-310.pyc,,
767
+ pip/_vendor/truststore/__pycache__/_openssl.cpython-310.pyc,,
768
+ pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-310.pyc,,
769
+ pip/_vendor/truststore/__pycache__/_windows.cpython-310.pyc,,
770
+ pip/_vendor/truststore/_api.py,sha256=40I0ojO2DnITiHvOnUYvJ1bfQMBKHOkci14noNxEnCs,11246
771
+ pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
772
+ pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
773
+ pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
774
+ pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
775
+ pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
776
+ pip/_vendor/typing_extensions.py,sha256=ipKHUPtZCqL6c-HfvGl-9t0opsXcSL72y4GYjyJXs_g,172702
777
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
778
+ pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,,
779
+ pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,,
780
+ pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,,
781
+ pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc,,
782
+ pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc,,
783
+ pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc,,
784
+ pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc,,
785
+ pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc,,
786
+ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,,
787
+ pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,,
788
+ pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,,
789
+ pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
790
+ pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
791
+ pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
792
+ pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
793
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
794
+ pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc,,
795
+ pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc,,
796
+ pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc,,
797
+ pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc,,
798
+ pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc,,
799
+ pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc,,
800
+ pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc,,
801
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
802
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
803
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc,,
804
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc,,
805
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc,,
806
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
807
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
808
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
809
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
810
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
811
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
812
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
813
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
814
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
815
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
816
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
817
+ pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc,,
818
+ pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc,,
819
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
820
+ pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc,,
821
+ pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc,,
822
+ pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-310.pyc,,
823
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
824
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
825
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
826
+ pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
827
+ pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
828
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
829
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
830
+ pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,,
831
+ pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,,
832
+ pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc,,
833
+ pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc,,
834
+ pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc,,
835
+ pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc,,
836
+ pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc,,
837
+ pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc,,
838
+ pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc,,
839
+ pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc,,
840
+ pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc,,
841
+ pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc,,
842
+ pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc,,
843
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
844
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
845
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
846
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
847
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
848
+ pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
849
+ pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
850
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
851
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
852
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
853
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
854
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
855
+ pip/_vendor/vendor.txt,sha256=Fym1hhuw75IJOl33NPi5nIJJc66DioBSUWrVRIVtRUE,373
856
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/REQUESTED ADDED
File without changes
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (79.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/entry_points.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ [console_scripts]
2
+ pip = pip._internal.cli.main:main
3
+ pip3 = pip._internal.cli.main:main
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt ADDED
@@ -0,0 +1,821 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @Switch01
2
+ A_Rog
3
+ Aakanksha Agrawal
4
+ Abhinav Sagar
5
+ ABHYUDAY PRATAP SINGH
6
+ abs51295
7
+ AceGentile
8
+ Adam Chainz
9
+ Adam Tse
10
+ Adam Turner
11
+ Adam Wentz
12
+ admin
13
+ Adolfo Ochagavía
14
+ Adrien Morison
15
+ Agus
16
+ ahayrapetyan
17
+ Ahilya
18
+ AinsworthK
19
+ Akash Srivastava
20
+ Alan Yee
21
+ Albert Tugushev
22
+ Albert-Guan
23
+ albertg
24
+ Alberto Sottile
25
+ Aleks Bunin
26
+ Ales Erjavec
27
+ Alethea Flowers
28
+ Alex Gaynor
29
+ Alex Grönholm
30
+ Alex Hedges
31
+ Alex Loosley
32
+ Alex Morega
33
+ Alex Stachowiak
34
+ Alexander Regueiro
35
+ Alexander Shtyrov
36
+ Alexandre Conrad
37
+ Alexey Popravka
38
+ Aleš Erjavec
39
+ Alli
40
+ Ami Fischman
41
+ Ananya Maiti
42
+ Anatoly Techtonik
43
+ Anders Kaseorg
44
+ Andre Aguiar
45
+ Andreas Lutro
46
+ Andrei Geacar
47
+ Andrew Gaul
48
+ Andrew Shymanel
49
+ Andrey Bienkowski
50
+ Andrey Bulgakov
51
+ Andrés Delfino
52
+ Andy Freeland
53
+ Andy Kluger
54
+ Ani Hayrapetyan
55
+ Aniruddha Basak
56
+ Anish Tambe
57
+ Anrs Hu
58
+ Anthony Sottile
59
+ Antoine Musso
60
+ Anton Ovchinnikov
61
+ Anton Patrushev
62
+ Anton Zelenov
63
+ Antonio Alvarado Hernandez
64
+ Antony Lee
65
+ Antti Kaihola
66
+ Anubhav Patel
67
+ Anudit Nagar
68
+ Anuj Godase
69
+ AQNOUCH Mohammed
70
+ AraHaan
71
+ arena
72
+ arenasys
73
+ Arindam Choudhury
74
+ Armin Ronacher
75
+ Arnon Yaari
76
+ Artem
77
+ Arun Babu Neelicattu
78
+ Ashley Manton
79
+ Ashwin Ramaswami
80
+ atse
81
+ Atsushi Odagiri
82
+ Avinash Karhana
83
+ Avner Cohen
84
+ Awit (Ah-Wit) Ghirmai
85
+ Baptiste Mispelon
86
+ Barney Gale
87
+ barneygale
88
+ Bartek Ogryczak
89
+ Bastian Venthur
90
+ Ben Bodenmiller
91
+ Ben Darnell
92
+ Ben Hoyt
93
+ Ben Mares
94
+ Ben Rosser
95
+ Bence Nagy
96
+ Benjamin Peterson
97
+ Benjamin VanEvery
98
+ Benoit Pierre
99
+ Berker Peksag
100
+ Bernard
101
+ Bernard Tyers
102
+ Bernardo B. Marques
103
+ Bernhard M. Wiedemann
104
+ Bertil Hatt
105
+ Bhavam Vidyarthi
106
+ Blazej Michalik
107
+ Bogdan Opanchuk
108
+ BorisZZZ
109
+ Brad Erickson
110
+ Bradley Ayers
111
+ Bradley Reynolds
112
+ Branch Vincent
113
+ Brandon L. Reiss
114
+ Brandt Bucher
115
+ Brannon Dorsey
116
+ Brett Randall
117
+ Brett Rosen
118
+ Brian Cristante
119
+ Brian Rosner
120
+ briantracy
121
+ BrownTruck
122
+ Bruno Oliveira
123
+ Bruno Renié
124
+ Bruno S
125
+ Bstrdsmkr
126
+ Buck Golemon
127
+ burrows
128
+ Bussonnier Matthias
129
+ bwoodsend
130
+ c22
131
+ Caleb Brown
132
+ Caleb Martinez
133
+ Calvin Smith
134
+ Carl Meyer
135
+ Carlos Liam
136
+ Carol Willing
137
+ Carter Thayer
138
+ Cass
139
+ Chandrasekhar Atina
140
+ Charlie Marsh
141
+ charwick
142
+ Chih-Hsuan Yen
143
+ Chris Brinker
144
+ Chris Hunt
145
+ Chris Jerdonek
146
+ Chris Kuehl
147
+ Chris Markiewicz
148
+ Chris McDonough
149
+ Chris Pawley
150
+ Chris Pryer
151
+ Chris Wolfe
152
+ Christian Clauss
153
+ Christian Heimes
154
+ Christian Oudard
155
+ Christoph Reiter
156
+ Christopher Hunt
157
+ Christopher Snyder
158
+ chrysle
159
+ cjc7373
160
+ Clark Boylan
161
+ Claudio Jolowicz
162
+ Clay McClure
163
+ Cody
164
+ Cody Soyland
165
+ Colin Watson
166
+ Collin Anderson
167
+ Connor Osborn
168
+ Cooper Lees
169
+ Cooper Ry Lees
170
+ Cory Benfield
171
+ Cory Wright
172
+ Craig Kerstiens
173
+ Cristian Sorinel
174
+ Cristina
175
+ Cristina Muñoz
176
+ ctg123
177
+ Curtis Doty
178
+ cytolentino
179
+ Daan De Meyer
180
+ Dale
181
+ Damian
182
+ Damian Quiroga
183
+ Damian Shaw
184
+ Dan Black
185
+ Dan Savilonis
186
+ Dan Sully
187
+ Dane Hillard
188
+ daniel
189
+ Daniel Collins
190
+ Daniel Hahler
191
+ Daniel Holth
192
+ Daniel Jost
193
+ Daniel Katz
194
+ Daniel Shaulov
195
+ Daniele Esposti
196
+ Daniele Nicolodi
197
+ Daniele Procida
198
+ Daniil Konovalenko
199
+ Danny Hermes
200
+ Danny McClanahan
201
+ Darren Kavanagh
202
+ Dav Clark
203
+ Dave Abrahams
204
+ Dave Jones
205
+ David Aguilar
206
+ David Black
207
+ David Bordeynik
208
+ David Caro
209
+ David D Lowe
210
+ David Evans
211
+ David Hewitt
212
+ David Linke
213
+ David Poggi
214
+ David Poznik
215
+ David Pursehouse
216
+ David Runge
217
+ David Tucker
218
+ David Wales
219
+ Davidovich
220
+ ddelange
221
+ Deepak Sharma
222
+ Deepyaman Datta
223
+ Denise Yu
224
+ dependabot[bot]
225
+ derwolfe
226
+ Desetude
227
+ developer
228
+ Devesh Kumar Singh
229
+ devsagul
230
+ Diego Caraballo
231
+ Diego Ramirez
232
+ DiegoCaraballo
233
+ Dimitri Merejkowsky
234
+ Dimitri Papadopoulos
235
+ Dimitri Papadopoulos Orfanos
236
+ Dirk Stolle
237
+ Dmitry Gladkov
238
+ Dmitry Volodin
239
+ Domen Kožar
240
+ Dominic Davis-Foster
241
+ Donald Stufft
242
+ Dongweiming
243
+ doron zarhi
244
+ Dos Moonen
245
+ Douglas Thor
246
+ DrFeathers
247
+ Dustin Ingram
248
+ Dustin Rodrigues
249
+ Dwayne Bailey
250
+ Ed Morley
251
+ Edgar Ramírez
252
+ Edgar Ramírez Mondragón
253
+ Ee Durbin
254
+ Efflam Lemaillet
255
+ efflamlemaillet
256
+ Eitan Adler
257
+ ekristina
258
+ elainechan
259
+ Eli Schwartz
260
+ Elisha Hollander
261
+ Ellen Marie Dash
262
+ Emil Burzo
263
+ Emil Styrke
264
+ Emmanuel Arias
265
+ Endoh Takanao
266
+ enoch
267
+ Erdinc Mutlu
268
+ Eric Cousineau
269
+ Eric Gillingham
270
+ Eric Hanchrow
271
+ Eric Hopper
272
+ Erik M. Bray
273
+ Erik Rose
274
+ Erwin Janssen
275
+ Eugene Vereshchagin
276
+ everdimension
277
+ Federico
278
+ Felipe Peter
279
+ Felix Yan
280
+ fiber-space
281
+ Filip Kokosiński
282
+ Filipe Laíns
283
+ Finn Womack
284
+ finnagin
285
+ Flavio Amurrio
286
+ Florian Briand
287
+ Florian Rathgeber
288
+ Francesco
289
+ Francesco Montesano
290
+ Fredrik Orderud
291
+ Fredrik Roubert
292
+ Frost Ming
293
+ Gabriel Curio
294
+ Gabriel de Perthuis
295
+ Garry Polley
296
+ gavin
297
+ gdanielson
298
+ Geoffrey Sneddon
299
+ George Margaritis
300
+ George Song
301
+ Georgi Valkov
302
+ Georgy Pchelkin
303
+ ghost
304
+ Giftlin Rajaiah
305
+ gizmoguy1
306
+ gkdoc
307
+ Godefroid Chapelle
308
+ Gopinath M
309
+ GOTO Hayato
310
+ gousaiyang
311
+ gpiks
312
+ Greg Roodt
313
+ Greg Ward
314
+ Guilherme Espada
315
+ Guillaume Seguin
316
+ gutsytechster
317
+ Guy Rozendorn
318
+ Guy Tuval
319
+ gzpan123
320
+ Hanjun Kim
321
+ Hari Charan
322
+ Harsh Vardhan
323
+ harupy
324
+ Harutaka Kawamura
325
+ hauntsaninja
326
+ Henrich Hartzer
327
+ Henry Schreiner
328
+ Herbert Pfennig
329
+ Holly Stotelmyer
330
+ Honnix
331
+ Hsiaoming Yang
332
+ Hugo Lopes Tavares
333
+ Hugo van Kemenade
334
+ Hugues Bruant
335
+ Hynek Schlawack
336
+ Ian Bicking
337
+ Ian Cordasco
338
+ Ian Lee
339
+ Ian Stapleton Cordasco
340
+ Ian Wienand
341
+ Igor Kuzmitshov
342
+ Igor Sobreira
343
+ Ikko Ashimine
344
+ Ilan Schnell
345
+ Illia Volochii
346
+ Ilya Baryshev
347
+ Inada Naoki
348
+ Ionel Cristian Mărieș
349
+ Ionel Maries Cristian
350
+ Itamar Turner-Trauring
351
+ iTrooz
352
+ Ivan Pozdeev
353
+ J. Nick Koston
354
+ Jacob Kim
355
+ Jacob Walls
356
+ Jaime Sanz
357
+ Jake Lishman
358
+ jakirkham
359
+ Jakub Kuczys
360
+ Jakub Stasiak
361
+ Jakub Vysoky
362
+ Jakub Wilk
363
+ James Cleveland
364
+ James Curtin
365
+ James Firth
366
+ James Gerity
367
+ James Polley
368
+ Jan Pokorný
369
+ Jannis Leidel
370
+ Jarek Potiuk
371
+ jarondl
372
+ Jason Curtis
373
+ Jason R. Coombs
374
+ JasonMo
375
+ JasonMo1
376
+ Jay Graves
377
+ Jean Abou Samra
378
+ Jean-Christophe Fillion-Robin
379
+ Jeff Barber
380
+ Jeff Dairiki
381
+ Jeff Widman
382
+ Jelmer Vernooij
383
+ jenix21
384
+ Jeremy Fleischman
385
+ Jeremy Stanley
386
+ Jeremy Zafran
387
+ Jesse Rittner
388
+ Jiashuo Li
389
+ Jim Fisher
390
+ Jim Garrison
391
+ Jinzhe Zeng
392
+ Jiun Bae
393
+ Jivan Amara
394
+ Joa
395
+ Joe Bylund
396
+ Joe Michelini
397
+ Johannes Altmanninger
398
+ John Paton
399
+ John Sirois
400
+ John T. Wodder II
401
+ John-Scott Atlakson
402
+ johnthagen
403
+ Jon Banafato
404
+ Jon Dufresne
405
+ Jon Parise
406
+ Jonas Nockert
407
+ Jonathan Herbert
408
+ Joonatan Partanen
409
+ Joost Molenaar
410
+ Jorge Niedbalski
411
+ Joseph Bylund
412
+ Joseph Long
413
+ Josh Bronson
414
+ Josh Cannon
415
+ Josh Hansen
416
+ Josh Schneier
417
+ Joshua
418
+ JoshuaPerdue
419
+ Juan Luis Cano Rodríguez
420
+ Juanjo Bazán
421
+ Judah Rand
422
+ Julian Berman
423
+ Julian Gethmann
424
+ Julien Demoor
425
+ July Tikhonov
426
+ Jussi Kukkonen
427
+ Justin van Heek
428
+ jwg4
429
+ Jyrki Pulliainen
430
+ Kai Chen
431
+ Kai Mueller
432
+ Kamal Bin Mustafa
433
+ Karolina Surma
434
+ kasium
435
+ kaustav haldar
436
+ keanemind
437
+ Keith Maxwell
438
+ Kelsey Hightower
439
+ Kenneth Belitzky
440
+ Kenneth Reitz
441
+ Kevin Burke
442
+ Kevin Carter
443
+ Kevin Frommelt
444
+ Kevin R Patterson
445
+ Kexuan Sun
446
+ Kit Randel
447
+ Klaas van Schelven
448
+ KOLANICH
449
+ konstin
450
+ kpinc
451
+ Krishan Bhasin
452
+ Krishna Oza
453
+ Kumar McMillan
454
+ Kuntal Majumder
455
+ Kurt McKee
456
+ Kyle Persohn
457
+ lakshmanaram
458
+ Laszlo Kiss-Kollar
459
+ Laurent Bristiel
460
+ Laurent LAPORTE
461
+ Laurie O
462
+ Laurie Opperman
463
+ layday
464
+ Leon Sasson
465
+ Lev Givon
466
+ Lincoln de Sousa
467
+ Lipis
468
+ lorddavidiii
469
+ Loren Carvalho
470
+ Lucas Cimon
471
+ Ludovic Gasc
472
+ Luis Medel
473
+ Lukas Geiger
474
+ Lukas Juhrich
475
+ Luke Macken
476
+ Luo Jiebin
477
+ luojiebin
478
+ luz.paz
479
+ László Kiss Kollár
480
+ M00nL1ght
481
+ Malcolm Smith
482
+ Marc Abramowitz
483
+ Marc Tamlyn
484
+ Marcus Smith
485
+ Mariatta
486
+ Mark Kohler
487
+ Mark McLoughlin
488
+ Mark Williams
489
+ Markus Hametner
490
+ Martey Dodoo
491
+ Martin Fischer
492
+ Martin Häcker
493
+ Martin Pavlasek
494
+ Masaki
495
+ Masklinn
496
+ Matej Stuchlik
497
+ Mathew Jennings
498
+ Mathieu Bridon
499
+ Mathieu Kniewallner
500
+ Matt Bacchi
501
+ Matt Good
502
+ Matt Maker
503
+ Matt Robenolt
504
+ Matt Wozniski
505
+ matthew
506
+ Matthew Einhorn
507
+ Matthew Feickert
508
+ Matthew Gilliard
509
+ Matthew Hughes
510
+ Matthew Iversen
511
+ Matthew Treinish
512
+ Matthew Trumbell
513
+ Matthew Willson
514
+ Matthias Bussonnier
515
+ mattip
516
+ Maurits van Rees
517
+ Max W Chase
518
+ Maxim Kurnikov
519
+ Maxime Rouyrre
520
+ mayeut
521
+ mbaluna
522
+ Md Sujauddin Sekh
523
+ mdebi
524
+ memoselyk
525
+ meowmeowcat
526
+ Michael
527
+ Michael Aquilina
528
+ Michael E. Karpeles
529
+ Michael Klich
530
+ Michael Mintz
531
+ Michael Williamson
532
+ michaelpacer
533
+ Michał Górny
534
+ Mickaël Schoentgen
535
+ Miguel Araujo Perez
536
+ Mihir Singh
537
+ Mike
538
+ Mike Hendricks
539
+ Min RK
540
+ MinRK
541
+ Miro Hrončok
542
+ Monica Baluna
543
+ montefra
544
+ Monty Taylor
545
+ morotti
546
+ mrKazzila
547
+ Muha Ajjan
548
+ Nadav Wexler
549
+ Nahuel Ambrosini
550
+ Nate Coraor
551
+ Nate Prewitt
552
+ Nathan Houghton
553
+ Nathaniel J. Smith
554
+ Nehal J Wani
555
+ Neil Botelho
556
+ Nguyễn Gia Phong
557
+ Nicholas Serra
558
+ Nick Coghlan
559
+ Nick Stenning
560
+ Nick Timkovich
561
+ Nicolas Bock
562
+ Nicole Harris
563
+ Nikhil Benesch
564
+ Nikhil Ladha
565
+ Nikita Chepanov
566
+ Nikolay Korolev
567
+ Nipunn Koorapati
568
+ Nitesh Sharma
569
+ Niyas Sait
570
+ Noah
571
+ Noah Gorny
572
+ Nowell Strite
573
+ NtaleGrey
574
+ nucccc
575
+ nvdv
576
+ OBITORASU
577
+ Ofek Lev
578
+ ofrinevo
579
+ Oleg Burnaev
580
+ Oliver Freund
581
+ Oliver Jeeves
582
+ Oliver Mannion
583
+ Oliver Tonnhofer
584
+ Olivier Girardot
585
+ Olivier Grisel
586
+ Ollie Rutherfurd
587
+ OMOTO Kenji
588
+ Omry Yadan
589
+ onlinejudge95
590
+ Oren Held
591
+ Oscar Benjamin
592
+ Oz N Tiram
593
+ Pachwenko
594
+ Patrick Dubroy
595
+ Patrick Jenkins
596
+ Patrick Lawson
597
+ patricktokeeffe
598
+ Patrik Kopkan
599
+ Paul Ganssle
600
+ Paul Kehrer
601
+ Paul Moore
602
+ Paul Nasrat
603
+ Paul Oswald
604
+ Paul van der Linden
605
+ Paulus Schoutsen
606
+ Pavel Safronov
607
+ Pavithra Eswaramoorthy
608
+ Pawel Jasinski
609
+ Paweł Szramowski
610
+ Pekka Klärck
611
+ Peter Gessler
612
+ Peter Lisák
613
+ Peter Shen
614
+ Peter Waller
615
+ Petr Viktorin
616
+ petr-tik
617
+ Phaneendra Chiruvella
618
+ Phil Elson
619
+ Phil Freo
620
+ Phil Pennock
621
+ Phil Whelan
622
+ Philip Jägenstedt
623
+ Philip Molloy
624
+ Philippe Ombredanne
625
+ Pi Delport
626
+ Pierre-Yves Rofes
627
+ Pieter Degroote
628
+ pip
629
+ Prabakaran Kumaresshan
630
+ Prabhjyotsing Surjit Singh Sodhi
631
+ Prabhu Marappan
632
+ Pradyun Gedam
633
+ Prashant Sharma
634
+ Pratik Mallya
635
+ pre-commit-ci[bot]
636
+ Preet Thakkar
637
+ Preston Holmes
638
+ Przemek Wrzos
639
+ Pulkit Goyal
640
+ q0w
641
+ Qiangning Hong
642
+ Qiming Xu
643
+ Quentin Lee
644
+ Quentin Pradet
645
+ R. David Murray
646
+ Rafael Caricio
647
+ Ralf Schmitt
648
+ Ran Benita
649
+ Randy Döring
650
+ Razzi Abuissa
651
+ rdb
652
+ Reece Dunham
653
+ Remi Rampin
654
+ Rene Dudfield
655
+ Riccardo Magliocchetti
656
+ Riccardo Schirone
657
+ Richard Jones
658
+ Richard Si
659
+ Ricky Ng-Adam
660
+ Rishi
661
+ rmorotti
662
+ RobberPhex
663
+ Robert Collins
664
+ Robert McGibbon
665
+ Robert Pollak
666
+ Robert T. McGibbon
667
+ robin elisha robinson
668
+ Roey Berman
669
+ Rohan Jain
670
+ Roman Bogorodskiy
671
+ Roman Donchenko
672
+ Romuald Brunet
673
+ ronaudinho
674
+ Ronny Pfannschmidt
675
+ Rory McCann
676
+ Ross Brattain
677
+ Roy Wellington Ⅳ
678
+ Ruairidh MacLeod
679
+ Russell Keith-Magee
680
+ Ryan Shepherd
681
+ Ryan Wooden
682
+ ryneeverett
683
+ S. Guliaev
684
+ Sachi King
685
+ Salvatore Rinchiera
686
+ sandeepkiran-js
687
+ Sander Van Balen
688
+ Savio Jomton
689
+ schlamar
690
+ Scott Kitterman
691
+ Sean
692
+ seanj
693
+ Sebastian Jordan
694
+ Sebastian Schaetz
695
+ Segev Finer
696
+ SeongSoo Cho
697
+ Sergey Vasilyev
698
+ Seth Michael Larson
699
+ Seth Woodworth
700
+ Shahar Epstein
701
+ Shantanu
702
+ shenxianpeng
703
+ shireenrao
704
+ Shivansh-007
705
+ Shixian Sheng
706
+ Shlomi Fish
707
+ Shovan Maity
708
+ Simeon Visser
709
+ Simon Cross
710
+ Simon Pichugin
711
+ sinoroc
712
+ sinscary
713
+ snook92
714
+ socketubs
715
+ Sorin Sbarnea
716
+ Srinivas Nyayapati
717
+ Srishti Hegde
718
+ Stavros Korokithakis
719
+ Stefan Scherfke
720
+ Stefano Rivera
721
+ Stephan Erb
722
+ Stephen Rosen
723
+ stepshal
724
+ Steve (Gadget) Barnes
725
+ Steve Barnes
726
+ Steve Dower
727
+ Steve Kowalik
728
+ Steven Myint
729
+ Steven Silvester
730
+ stonebig
731
+ studioj
732
+ Stéphane Bidoul
733
+ Stéphane Bidoul (ACSONE)
734
+ Stéphane Klein
735
+ Sumana Harihareswara
736
+ Surbhi Sharma
737
+ Sviatoslav Sydorenko
738
+ Sviatoslav Sydorenko (Святослав Сидоренко)
739
+ Swat009
740
+ Sylvain
741
+ Takayuki SHIMIZUKAWA
742
+ Taneli Hukkinen
743
+ tbeswick
744
+ Thiago
745
+ Thijs Triemstra
746
+ Thomas Fenzl
747
+ Thomas Grainger
748
+ Thomas Guettler
749
+ Thomas Johansson
750
+ Thomas Kluyver
751
+ Thomas Smith
752
+ Thomas VINCENT
753
+ Tim D. Smith
754
+ Tim Gates
755
+ Tim Harder
756
+ Tim Heap
757
+ tim smith
758
+ tinruufu
759
+ Tobias Hermann
760
+ Tom Forbes
761
+ Tom Freudenheim
762
+ Tom V
763
+ Tomas Hrnciar
764
+ Tomas Orsava
765
+ Tomer Chachamu
766
+ Tommi Enenkel | AnB
767
+ Tomáš Hrnčiar
768
+ Tony Beswick
769
+ Tony Narlock
770
+ Tony Zhaocheng Tan
771
+ TonyBeswick
772
+ toonarmycaptain
773
+ Toshio Kuratomi
774
+ toxinu
775
+ Travis Swicegood
776
+ Tushar Sadhwani
777
+ Tzu-ping Chung
778
+ Valentin Haenel
779
+ Victor Stinner
780
+ victorvpaulo
781
+ Vikram - Google
782
+ Viktor Szépe
783
+ Ville Skyttä
784
+ Vinay Sajip
785
+ Vincent Philippon
786
+ Vinicyus Macedo
787
+ Vipul Kumar
788
+ Vitaly Babiy
789
+ Vladimir Fokow
790
+ Vladimir Rutsky
791
+ W. Trevor King
792
+ Wil Tan
793
+ Wilfred Hughes
794
+ William Edwards
795
+ William ML Leslie
796
+ William T Olson
797
+ William Woodruff
798
+ Wilson Mo
799
+ wim glenn
800
+ Winson Luk
801
+ Wolfgang Maier
802
+ Wu Zhenyu
803
+ XAMES3
804
+ Xavier Fernandez
805
+ Xianpeng Shen
806
+ xoviat
807
+ xtreak
808
+ YAMAMOTO Takashi
809
+ Yen Chi Hsuan
810
+ Yeray Diaz Diaz
811
+ Yoval P
812
+ Yu Jian
813
+ Yuan Jing Vincent Yan
814
+ Yusuke Hayashi
815
+ Zearin
816
+ Zhiping Deng
817
+ ziebam
818
+ Zvezdan Petkovic
819
+ Łukasz Langa
820
+ Роман Донченко
821
+ Семён Марьясин
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ACE_plus/flashenv/lib/python3.10/site-packages/pip-25.1.1.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
ACE_plus/flashenv/lib/python3.10/site-packages/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ __version__ = "25.1.1"
4
+
5
+
6
+ def main(args: Optional[List[str]] = None) -> int:
7
+ """This is an internal API only meant for use by pip's own console scripts.
8
+
9
+ For additional details, see https://github.com/pypa/pip/issues/7498.
10
+ """
11
+ from pip._internal.utils.entrypoints import _wrapper
12
+
13
+ return _wrapper(args)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/__main__.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Remove '' and current working directory from the first entry
5
+ # of sys.path, if present to avoid using current directory
6
+ # in pip commands check, freeze, install, list and show,
7
+ # when invoked as python -m pip <command>
8
+ if sys.path[0] in ("", os.getcwd()):
9
+ sys.path.pop(0)
10
+
11
+ # If we are running from a wheel, add the wheel to sys.path
12
+ # This allows the usage python pip-*.whl/pip install pip-*.whl
13
+ if __package__ == "":
14
+ # __file__ is pip-*.whl/pip/__main__.py
15
+ # first dirname call strips of '/__main__.py', second strips off '/pip'
16
+ # Resulting path is the name of the wheel itself
17
+ # Add that to sys.path so we can import pip
18
+ path = os.path.dirname(os.path.dirname(__file__))
19
+ sys.path.insert(0, path)
20
+
21
+ if __name__ == "__main__":
22
+ from pip._internal.cli.main import main as _main
23
+
24
+ sys.exit(_main())
ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pip-runner__.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Execute exactly this copy of pip, within a different environment.
2
+
3
+ This file is named as it is, to ensure that this module can't be imported via
4
+ an import statement.
5
+ """
6
+
7
+ # /!\ This version compatibility check section must be Python 2 compatible. /!\
8
+
9
+ import sys
10
+
11
+ # Copied from pyproject.toml
12
+ PYTHON_REQUIRES = (3, 9)
13
+
14
+
15
+ def version_str(version): # type: ignore
16
+ return ".".join(str(v) for v in version)
17
+
18
+
19
+ if sys.version_info[:2] < PYTHON_REQUIRES:
20
+ raise SystemExit(
21
+ "This version of pip does not support python {} (requires >={}).".format(
22
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
23
+ )
24
+ )
25
+
26
+ # From here on, we can use Python 3 features, but the syntax must remain
27
+ # Python 2 compatible.
28
+
29
+ import runpy # noqa: E402
30
+ from importlib.machinery import PathFinder # noqa: E402
31
+ from os.path import dirname # noqa: E402
32
+
33
+ PIP_SOURCES_ROOT = dirname(dirname(__file__))
34
+
35
+
36
+ class PipImportRedirectingFinder:
37
+ @classmethod
38
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
39
+ if fullname != "pip":
40
+ return None
41
+
42
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
43
+ assert spec, (PIP_SOURCES_ROOT, fullname)
44
+ return spec
45
+
46
+
47
+ sys.meta_path.insert(0, PipImportRedirectingFinder())
48
+
49
+ assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
50
+ runpy.run_module("pip", run_name="__main__", alter_sys=True)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (642 Bytes). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pycache__/__main__.cpython-310.pyc ADDED
Binary file (476 Bytes). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/__pycache__/__pip-runner__.cpython-310.pyc ADDED
Binary file (1.64 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/__init__.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ from pip._internal.utils import _log
4
+
5
+ # init_logging() must be called before any call to logging.getLogger()
6
+ # which happens at import of most modules.
7
+ _log.init_logging()
8
+
9
+
10
+ def main(args: Optional[List[str]] = None) -> int:
11
+ """This is preserved for old console scripts that may still be referencing
12
+ it.
13
+
14
+ For additional details, see https://github.com/pypa/pip/issues/7498.
15
+ """
16
+ from pip._internal.utils.entrypoints import _wrapper
17
+
18
+ return _wrapper(args)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/build_env.py ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building"""
2
+
3
+ import logging
4
+ import os
5
+ import pathlib
6
+ import site
7
+ import sys
8
+ import textwrap
9
+ from collections import OrderedDict
10
+ from types import TracebackType
11
+ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
12
+
13
+ from pip._vendor.packaging.version import Version
14
+
15
+ from pip import __file__ as pip_location
16
+ from pip._internal.cli.spinners import open_spinner
17
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
18
+ from pip._internal.metadata import get_default_environment, get_environment
19
+ from pip._internal.utils.logging import VERBOSE
20
+ from pip._internal.utils.packaging import get_requirement
21
+ from pip._internal.utils.subprocess import call_subprocess
22
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
23
+
24
+ if TYPE_CHECKING:
25
+ from pip._internal.index.package_finder import PackageFinder
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
31
+ return (a, b) if a != b else (a,)
32
+
33
+
34
+ class _Prefix:
35
+ def __init__(self, path: str) -> None:
36
+ self.path = path
37
+ self.setup = False
38
+ scheme = get_scheme("", prefix=path)
39
+ self.bin_dir = scheme.scripts
40
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
41
+
42
+
43
+ def get_runnable_pip() -> str:
44
+ """Get a file to pass to a Python executable, to run the currently-running pip.
45
+
46
+ This is used to run a pip subprocess, for installing requirements into the build
47
+ environment.
48
+ """
49
+ source = pathlib.Path(pip_location).resolve().parent
50
+
51
+ if not source.is_dir():
52
+ # This would happen if someone is using pip from inside a zip file. In that
53
+ # case, we can use that directly.
54
+ return str(source)
55
+
56
+ return os.fsdecode(source / "__pip-runner__.py")
57
+
58
+
59
+ def _get_system_sitepackages() -> Set[str]:
60
+ """Get system site packages
61
+
62
+ Usually from site.getsitepackages,
63
+ but fallback on `get_purelib()/get_platlib()` if unavailable
64
+ (e.g. in a virtualenv created by virtualenv<20)
65
+
66
+ Returns normalized set of strings.
67
+ """
68
+ if hasattr(site, "getsitepackages"):
69
+ system_sites = site.getsitepackages()
70
+ else:
71
+ # virtualenv < 20 overwrites site.py without getsitepackages
72
+ # fallback on get_purelib/get_platlib.
73
+ # this is known to miss things, but shouldn't in the cases
74
+ # where getsitepackages() has been removed (inside a virtualenv)
75
+ system_sites = [get_purelib(), get_platlib()]
76
+ return {os.path.normcase(path) for path in system_sites}
77
+
78
+
79
+ class BuildEnvironment:
80
+ """Creates and manages an isolated environment to install build deps"""
81
+
82
+ def __init__(self) -> None:
83
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
84
+
85
+ self._prefixes = OrderedDict(
86
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
87
+ for name in ("normal", "overlay")
88
+ )
89
+
90
+ self._bin_dirs: List[str] = []
91
+ self._lib_dirs: List[str] = []
92
+ for prefix in reversed(list(self._prefixes.values())):
93
+ self._bin_dirs.append(prefix.bin_dir)
94
+ self._lib_dirs.extend(prefix.lib_dirs)
95
+
96
+ # Customize site to:
97
+ # - ensure .pth files are honored
98
+ # - prevent access to system site packages
99
+ system_sites = _get_system_sitepackages()
100
+
101
+ self._site_dir = os.path.join(temp_dir.path, "site")
102
+ if not os.path.exists(self._site_dir):
103
+ os.mkdir(self._site_dir)
104
+ with open(
105
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
106
+ ) as fp:
107
+ fp.write(
108
+ textwrap.dedent(
109
+ """
110
+ import os, site, sys
111
+
112
+ # First, drop system-sites related paths.
113
+ original_sys_path = sys.path[:]
114
+ known_paths = set()
115
+ for path in {system_sites!r}:
116
+ site.addsitedir(path, known_paths=known_paths)
117
+ system_paths = set(
118
+ os.path.normcase(path)
119
+ for path in sys.path[len(original_sys_path):]
120
+ )
121
+ original_sys_path = [
122
+ path for path in original_sys_path
123
+ if os.path.normcase(path) not in system_paths
124
+ ]
125
+ sys.path = original_sys_path
126
+
127
+ # Second, add lib directories.
128
+ # ensuring .pth file are processed.
129
+ for path in {lib_dirs!r}:
130
+ assert not path in sys.path
131
+ site.addsitedir(path)
132
+ """
133
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
134
+ )
135
+
136
+ def __enter__(self) -> None:
137
+ self._save_env = {
138
+ name: os.environ.get(name, None)
139
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
140
+ }
141
+
142
+ path = self._bin_dirs[:]
143
+ old_path = self._save_env["PATH"]
144
+ if old_path:
145
+ path.extend(old_path.split(os.pathsep))
146
+
147
+ pythonpath = [self._site_dir]
148
+
149
+ os.environ.update(
150
+ {
151
+ "PATH": os.pathsep.join(path),
152
+ "PYTHONNOUSERSITE": "1",
153
+ "PYTHONPATH": os.pathsep.join(pythonpath),
154
+ }
155
+ )
156
+
157
+ def __exit__(
158
+ self,
159
+ exc_type: Optional[Type[BaseException]],
160
+ exc_val: Optional[BaseException],
161
+ exc_tb: Optional[TracebackType],
162
+ ) -> None:
163
+ for varname, old_value in self._save_env.items():
164
+ if old_value is None:
165
+ os.environ.pop(varname, None)
166
+ else:
167
+ os.environ[varname] = old_value
168
+
169
+ def check_requirements(
170
+ self, reqs: Iterable[str]
171
+ ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
172
+ """Return 2 sets:
173
+ - conflicting requirements: set of (installed, wanted) reqs tuples
174
+ - missing requirements: set of reqs
175
+ """
176
+ missing = set()
177
+ conflicting = set()
178
+ if reqs:
179
+ env = (
180
+ get_environment(self._lib_dirs)
181
+ if hasattr(self, "_lib_dirs")
182
+ else get_default_environment()
183
+ )
184
+ for req_str in reqs:
185
+ req = get_requirement(req_str)
186
+ # We're explicitly evaluating with an empty extra value, since build
187
+ # environments are not provided any mechanism to select specific extras.
188
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
189
+ continue
190
+ dist = env.get_distribution(req.name)
191
+ if not dist:
192
+ missing.add(req_str)
193
+ continue
194
+ if isinstance(dist.version, Version):
195
+ installed_req_str = f"{req.name}=={dist.version}"
196
+ else:
197
+ installed_req_str = f"{req.name}==={dist.version}"
198
+ if not req.specifier.contains(dist.version, prereleases=True):
199
+ conflicting.add((installed_req_str, req_str))
200
+ # FIXME: Consider direct URL?
201
+ return conflicting, missing
202
+
203
+ def install_requirements(
204
+ self,
205
+ finder: "PackageFinder",
206
+ requirements: Iterable[str],
207
+ prefix_as_string: str,
208
+ *,
209
+ kind: str,
210
+ ) -> None:
211
+ prefix = self._prefixes[prefix_as_string]
212
+ assert not prefix.setup
213
+ prefix.setup = True
214
+ if not requirements:
215
+ return
216
+ self._install_requirements(
217
+ get_runnable_pip(),
218
+ finder,
219
+ requirements,
220
+ prefix,
221
+ kind=kind,
222
+ )
223
+
224
+ @staticmethod
225
+ def _install_requirements(
226
+ pip_runnable: str,
227
+ finder: "PackageFinder",
228
+ requirements: Iterable[str],
229
+ prefix: _Prefix,
230
+ *,
231
+ kind: str,
232
+ ) -> None:
233
+ args: List[str] = [
234
+ sys.executable,
235
+ pip_runnable,
236
+ "install",
237
+ "--ignore-installed",
238
+ "--no-user",
239
+ "--prefix",
240
+ prefix.path,
241
+ "--no-warn-script-location",
242
+ "--disable-pip-version-check",
243
+ # As the build environment is ephemeral, it's wasteful to
244
+ # pre-compile everything, especially as not every Python
245
+ # module will be used/compiled in most cases.
246
+ "--no-compile",
247
+ # The prefix specified two lines above, thus
248
+ # target from config file or env var should be ignored
249
+ "--target",
250
+ "",
251
+ ]
252
+ if logger.getEffectiveLevel() <= logging.DEBUG:
253
+ args.append("-vv")
254
+ elif logger.getEffectiveLevel() <= VERBOSE:
255
+ args.append("-v")
256
+ for format_control in ("no_binary", "only_binary"):
257
+ formats = getattr(finder.format_control, format_control)
258
+ args.extend(
259
+ (
260
+ "--" + format_control.replace("_", "-"),
261
+ ",".join(sorted(formats or {":none:"})),
262
+ )
263
+ )
264
+
265
+ index_urls = finder.index_urls
266
+ if index_urls:
267
+ args.extend(["-i", index_urls[0]])
268
+ for extra_index in index_urls[1:]:
269
+ args.extend(["--extra-index-url", extra_index])
270
+ else:
271
+ args.append("--no-index")
272
+ for link in finder.find_links:
273
+ args.extend(["--find-links", link])
274
+
275
+ if finder.proxy:
276
+ args.extend(["--proxy", finder.proxy])
277
+ for host in finder.trusted_hosts:
278
+ args.extend(["--trusted-host", host])
279
+ if finder.custom_cert:
280
+ args.extend(["--cert", finder.custom_cert])
281
+ if finder.client_cert:
282
+ args.extend(["--client-cert", finder.client_cert])
283
+ if finder.allow_all_prereleases:
284
+ args.append("--pre")
285
+ if finder.prefer_binary:
286
+ args.append("--prefer-binary")
287
+ args.append("--")
288
+ args.extend(requirements)
289
+ with open_spinner(f"Installing {kind}") as spinner:
290
+ call_subprocess(
291
+ args,
292
+ command_desc=f"pip subprocess to install {kind}",
293
+ spinner=spinner,
294
+ )
295
+
296
+
297
+ class NoOpBuildEnvironment(BuildEnvironment):
298
+ """A no-op drop-in replacement for BuildEnvironment"""
299
+
300
+ def __init__(self) -> None:
301
+ pass
302
+
303
+ def __enter__(self) -> None:
304
+ pass
305
+
306
+ def __exit__(
307
+ self,
308
+ exc_type: Optional[Type[BaseException]],
309
+ exc_val: Optional[BaseException],
310
+ exc_tb: Optional[TracebackType],
311
+ ) -> None:
312
+ pass
313
+
314
+ def cleanup(self) -> None:
315
+ pass
316
+
317
+ def install_requirements(
318
+ self,
319
+ finder: "PackageFinder",
320
+ requirements: Iterable[str],
321
+ prefix_as_string: str,
322
+ *,
323
+ kind: str,
324
+ ) -> None:
325
+ raise NotImplementedError()
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/cache.py ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management"""
2
+
3
+ import hashlib
4
+ import json
5
+ import logging
6
+ import os
7
+ from pathlib import Path
8
+ from typing import Any, Dict, List, Optional
9
+
10
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
11
+ from pip._vendor.packaging.utils import canonicalize_name
12
+
13
+ from pip._internal.exceptions import InvalidWheelFilename
14
+ from pip._internal.models.direct_url import DirectUrl
15
+ from pip._internal.models.link import Link
16
+ from pip._internal.models.wheel import Wheel
17
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
18
+ from pip._internal.utils.urls import path_to_url
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ ORIGIN_JSON_NAME = "origin.json"
23
+
24
+
25
+ def _hash_dict(d: Dict[str, str]) -> str:
26
+ """Return a stable sha224 of a dictionary."""
27
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
28
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
29
+
30
+
31
+ class Cache:
32
+ """An abstract class - provides cache directories for data from links
33
+
34
+ :param cache_dir: The root of the cache.
35
+ """
36
+
37
+ def __init__(self, cache_dir: str) -> None:
38
+ super().__init__()
39
+ assert not cache_dir or os.path.isabs(cache_dir)
40
+ self.cache_dir = cache_dir or None
41
+
42
+ def _get_cache_path_parts(self, link: Link) -> List[str]:
43
+ """Get parts of part that must be os.path.joined with cache_dir"""
44
+
45
+ # We want to generate an url to use as our cache key, we don't want to
46
+ # just reuse the URL because it might have other items in the fragment
47
+ # and we don't care about those.
48
+ key_parts = {"url": link.url_without_fragment}
49
+ if link.hash_name is not None and link.hash is not None:
50
+ key_parts[link.hash_name] = link.hash
51
+ if link.subdirectory_fragment:
52
+ key_parts["subdirectory"] = link.subdirectory_fragment
53
+
54
+ # Include interpreter name, major and minor version in cache key
55
+ # to cope with ill-behaved sdists that build a different wheel
56
+ # depending on the python version their setup.py is being run on,
57
+ # and don't encode the difference in compatibility tags.
58
+ # https://github.com/pypa/pip/issues/7296
59
+ key_parts["interpreter_name"] = interpreter_name()
60
+ key_parts["interpreter_version"] = interpreter_version()
61
+
62
+ # Encode our key url with sha224, we'll use this because it has similar
63
+ # security properties to sha256, but with a shorter total output (and
64
+ # thus less secure). However the differences don't make a lot of
65
+ # difference for our use case here.
66
+ hashed = _hash_dict(key_parts)
67
+
68
+ # We want to nest the directories some to prevent having a ton of top
69
+ # level directories where we might run out of sub directories on some
70
+ # FS.
71
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
72
+
73
+ return parts
74
+
75
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
76
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
77
+ if can_not_cache:
78
+ return []
79
+
80
+ path = self.get_path_for_link(link)
81
+ if os.path.isdir(path):
82
+ return [(candidate, path) for candidate in os.listdir(path)]
83
+ return []
84
+
85
+ def get_path_for_link(self, link: Link) -> str:
86
+ """Return a directory to store cached items in for link."""
87
+ raise NotImplementedError()
88
+
89
+ def get(
90
+ self,
91
+ link: Link,
92
+ package_name: Optional[str],
93
+ supported_tags: List[Tag],
94
+ ) -> Link:
95
+ """Returns a link to a cached item if it exists, otherwise returns the
96
+ passed link.
97
+ """
98
+ raise NotImplementedError()
99
+
100
+
101
+ class SimpleWheelCache(Cache):
102
+ """A cache of wheels for future installs."""
103
+
104
+ def __init__(self, cache_dir: str) -> None:
105
+ super().__init__(cache_dir)
106
+
107
+ def get_path_for_link(self, link: Link) -> str:
108
+ """Return a directory to store cached wheels for link
109
+
110
+ Because there are M wheels for any one sdist, we provide a directory
111
+ to cache them in, and then consult that directory when looking up
112
+ cache hits.
113
+
114
+ We only insert things into the cache if they have plausible version
115
+ numbers, so that we don't contaminate the cache with things that were
116
+ not unique. E.g. ./package might have dozens of installs done for it
117
+ and build a version of 0.0...and if we built and cached a wheel, we'd
118
+ end up using the same wheel even if the source has been edited.
119
+
120
+ :param link: The link of the sdist for which this will cache wheels.
121
+ """
122
+ parts = self._get_cache_path_parts(link)
123
+ assert self.cache_dir
124
+ # Store wheels within the root cache_dir
125
+ return os.path.join(self.cache_dir, "wheels", *parts)
126
+
127
+ def get(
128
+ self,
129
+ link: Link,
130
+ package_name: Optional[str],
131
+ supported_tags: List[Tag],
132
+ ) -> Link:
133
+ candidates = []
134
+
135
+ if not package_name:
136
+ return link
137
+
138
+ canonical_package_name = canonicalize_name(package_name)
139
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
140
+ try:
141
+ wheel = Wheel(wheel_name)
142
+ except InvalidWheelFilename:
143
+ continue
144
+ if canonicalize_name(wheel.name) != canonical_package_name:
145
+ logger.debug(
146
+ "Ignoring cached wheel %s for %s as it "
147
+ "does not match the expected distribution name %s.",
148
+ wheel_name,
149
+ link,
150
+ package_name,
151
+ )
152
+ continue
153
+ if not wheel.supported(supported_tags):
154
+ # Built for a different python/arch/etc
155
+ continue
156
+ candidates.append(
157
+ (
158
+ wheel.support_index_min(supported_tags),
159
+ wheel_name,
160
+ wheel_dir,
161
+ )
162
+ )
163
+
164
+ if not candidates:
165
+ return link
166
+
167
+ _, wheel_name, wheel_dir = min(candidates)
168
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
169
+
170
+
171
+ class EphemWheelCache(SimpleWheelCache):
172
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
173
+
174
+ def __init__(self) -> None:
175
+ self._temp_dir = TempDirectory(
176
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
177
+ globally_managed=True,
178
+ )
179
+
180
+ super().__init__(self._temp_dir.path)
181
+
182
+
183
+ class CacheEntry:
184
+ def __init__(
185
+ self,
186
+ link: Link,
187
+ persistent: bool,
188
+ ):
189
+ self.link = link
190
+ self.persistent = persistent
191
+ self.origin: Optional[DirectUrl] = None
192
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
193
+ if origin_direct_url_path.exists():
194
+ try:
195
+ self.origin = DirectUrl.from_json(
196
+ origin_direct_url_path.read_text(encoding="utf-8")
197
+ )
198
+ except Exception as e:
199
+ logger.warning(
200
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
201
+ origin_direct_url_path,
202
+ link.filename,
203
+ e,
204
+ )
205
+
206
+
207
+ class WheelCache(Cache):
208
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
209
+
210
+ This Cache allows for gracefully degradation, using the ephem wheel cache
211
+ when a certain link is not found in the simple wheel cache first.
212
+ """
213
+
214
+ def __init__(self, cache_dir: str) -> None:
215
+ super().__init__(cache_dir)
216
+ self._wheel_cache = SimpleWheelCache(cache_dir)
217
+ self._ephem_cache = EphemWheelCache()
218
+
219
+ def get_path_for_link(self, link: Link) -> str:
220
+ return self._wheel_cache.get_path_for_link(link)
221
+
222
+ def get_ephem_path_for_link(self, link: Link) -> str:
223
+ return self._ephem_cache.get_path_for_link(link)
224
+
225
+ def get(
226
+ self,
227
+ link: Link,
228
+ package_name: Optional[str],
229
+ supported_tags: List[Tag],
230
+ ) -> Link:
231
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
232
+ if cache_entry is None:
233
+ return link
234
+ return cache_entry.link
235
+
236
+ def get_cache_entry(
237
+ self,
238
+ link: Link,
239
+ package_name: Optional[str],
240
+ supported_tags: List[Tag],
241
+ ) -> Optional[CacheEntry]:
242
+ """Returns a CacheEntry with a link to a cached item if it exists or
243
+ None. The cache entry indicates if the item was found in the persistent
244
+ or ephemeral cache.
245
+ """
246
+ retval = self._wheel_cache.get(
247
+ link=link,
248
+ package_name=package_name,
249
+ supported_tags=supported_tags,
250
+ )
251
+ if retval is not link:
252
+ return CacheEntry(retval, persistent=True)
253
+
254
+ retval = self._ephem_cache.get(
255
+ link=link,
256
+ package_name=package_name,
257
+ supported_tags=supported_tags,
258
+ )
259
+ if retval is not link:
260
+ return CacheEntry(retval, persistent=False)
261
+
262
+ return None
263
+
264
+ @staticmethod
265
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
266
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
267
+ if origin_path.exists():
268
+ try:
269
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
270
+ except Exception as e:
271
+ logger.warning(
272
+ "Could not read origin file %s in cache entry (%s). "
273
+ "Will attempt to overwrite it.",
274
+ origin_path,
275
+ e,
276
+ )
277
+ else:
278
+ # TODO: use DirectUrl.equivalent when
279
+ # https://github.com/pypa/pip/pull/10564 is merged.
280
+ if origin.url != download_info.url:
281
+ logger.warning(
282
+ "Origin URL %s in cache entry %s does not match download URL "
283
+ "%s. This is likely a pip bug or a cache corruption issue. "
284
+ "Will overwrite it with the new value.",
285
+ origin.url,
286
+ cache_dir,
287
+ download_info.url,
288
+ )
289
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/configuration.py ADDED
@@ -0,0 +1,383 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Configuration management setup
2
+
3
+ Some terminology:
4
+ - name
5
+ As written in config files.
6
+ - value
7
+ Value associated with a name
8
+ - key
9
+ Name combined with it's section (section.name)
10
+ - variant
11
+ A single word describing where the configuration key-value pair came from
12
+ """
13
+
14
+ import configparser
15
+ import locale
16
+ import os
17
+ import sys
18
+ from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple
19
+
20
+ from pip._internal.exceptions import (
21
+ ConfigurationError,
22
+ ConfigurationFileCouldNotBeLoaded,
23
+ )
24
+ from pip._internal.utils import appdirs
25
+ from pip._internal.utils.compat import WINDOWS
26
+ from pip._internal.utils.logging import getLogger
27
+ from pip._internal.utils.misc import ensure_dir, enum
28
+
29
+ RawConfigParser = configparser.RawConfigParser # Shorthand
30
+ Kind = NewType("Kind", str)
31
+
32
+ CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf"
33
+ ENV_NAMES_IGNORED = "version", "help"
34
+
35
+ # The kinds of configurations there are.
36
+ kinds = enum(
37
+ USER="user", # User Specific
38
+ GLOBAL="global", # System Wide
39
+ SITE="site", # [Virtual] Environment Specific
40
+ ENV="env", # from PIP_CONFIG_FILE
41
+ ENV_VAR="env-var", # from Environment Variables
42
+ )
43
+ OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR
44
+ VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE
45
+
46
+ logger = getLogger(__name__)
47
+
48
+
49
+ # NOTE: Maybe use the optionx attribute to normalize keynames.
50
+ def _normalize_name(name: str) -> str:
51
+ """Make a name consistent regardless of source (environment or file)"""
52
+ name = name.lower().replace("_", "-")
53
+ if name.startswith("--"):
54
+ name = name[2:] # only prefer long opts
55
+ return name
56
+
57
+
58
+ def _disassemble_key(name: str) -> List[str]:
59
+ if "." not in name:
60
+ error_message = (
61
+ "Key does not contain dot separated section and key. "
62
+ f"Perhaps you wanted to use 'global.{name}' instead?"
63
+ )
64
+ raise ConfigurationError(error_message)
65
+ return name.split(".", 1)
66
+
67
+
68
+ def get_configuration_files() -> Dict[Kind, List[str]]:
69
+ global_config_files = [
70
+ os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip")
71
+ ]
72
+
73
+ site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME)
74
+ legacy_config_file = os.path.join(
75
+ os.path.expanduser("~"),
76
+ "pip" if WINDOWS else ".pip",
77
+ CONFIG_BASENAME,
78
+ )
79
+ new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME)
80
+ return {
81
+ kinds.GLOBAL: global_config_files,
82
+ kinds.SITE: [site_config_file],
83
+ kinds.USER: [legacy_config_file, new_config_file],
84
+ }
85
+
86
+
87
+ class Configuration:
88
+ """Handles management of configuration.
89
+
90
+ Provides an interface to accessing and managing configuration files.
91
+
92
+ This class converts provides an API that takes "section.key-name" style
93
+ keys and stores the value associated with it as "key-name" under the
94
+ section "section".
95
+
96
+ This allows for a clean interface wherein the both the section and the
97
+ key-name are preserved in an easy to manage form in the configuration files
98
+ and the data stored is also nice.
99
+ """
100
+
101
+ def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None:
102
+ super().__init__()
103
+
104
+ if load_only is not None and load_only not in VALID_LOAD_ONLY:
105
+ raise ConfigurationError(
106
+ "Got invalid value for load_only - should be one of {}".format(
107
+ ", ".join(map(repr, VALID_LOAD_ONLY))
108
+ )
109
+ )
110
+ self.isolated = isolated
111
+ self.load_only = load_only
112
+
113
+ # Because we keep track of where we got the data from
114
+ self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = {
115
+ variant: [] for variant in OVERRIDE_ORDER
116
+ }
117
+ self._config: Dict[Kind, Dict[str, Any]] = {
118
+ variant: {} for variant in OVERRIDE_ORDER
119
+ }
120
+ self._modified_parsers: List[Tuple[str, RawConfigParser]] = []
121
+
122
+ def load(self) -> None:
123
+ """Loads configuration from configuration files and environment"""
124
+ self._load_config_files()
125
+ if not self.isolated:
126
+ self._load_environment_vars()
127
+
128
+ def get_file_to_edit(self) -> Optional[str]:
129
+ """Returns the file with highest priority in configuration"""
130
+ assert self.load_only is not None, "Need to be specified a file to be editing"
131
+
132
+ try:
133
+ return self._get_parser_to_modify()[0]
134
+ except IndexError:
135
+ return None
136
+
137
+ def items(self) -> Iterable[Tuple[str, Any]]:
138
+ """Returns key-value pairs like dict.items() representing the loaded
139
+ configuration
140
+ """
141
+ return self._dictionary.items()
142
+
143
+ def get_value(self, key: str) -> Any:
144
+ """Get a value from the configuration."""
145
+ orig_key = key
146
+ key = _normalize_name(key)
147
+ try:
148
+ return self._dictionary[key]
149
+ except KeyError:
150
+ # disassembling triggers a more useful error message than simply
151
+ # "No such key" in the case that the key isn't in the form command.option
152
+ _disassemble_key(key)
153
+ raise ConfigurationError(f"No such key - {orig_key}")
154
+
155
+ def set_value(self, key: str, value: Any) -> None:
156
+ """Modify a value in the configuration."""
157
+ key = _normalize_name(key)
158
+ self._ensure_have_load_only()
159
+
160
+ assert self.load_only
161
+ fname, parser = self._get_parser_to_modify()
162
+
163
+ if parser is not None:
164
+ section, name = _disassemble_key(key)
165
+
166
+ # Modify the parser and the configuration
167
+ if not parser.has_section(section):
168
+ parser.add_section(section)
169
+ parser.set(section, name, value)
170
+
171
+ self._config[self.load_only][key] = value
172
+ self._mark_as_modified(fname, parser)
173
+
174
+ def unset_value(self, key: str) -> None:
175
+ """Unset a value in the configuration."""
176
+ orig_key = key
177
+ key = _normalize_name(key)
178
+ self._ensure_have_load_only()
179
+
180
+ assert self.load_only
181
+ if key not in self._config[self.load_only]:
182
+ raise ConfigurationError(f"No such key - {orig_key}")
183
+
184
+ fname, parser = self._get_parser_to_modify()
185
+
186
+ if parser is not None:
187
+ section, name = _disassemble_key(key)
188
+ if not (
189
+ parser.has_section(section) and parser.remove_option(section, name)
190
+ ):
191
+ # The option was not removed.
192
+ raise ConfigurationError(
193
+ "Fatal Internal error [id=1]. Please report as a bug."
194
+ )
195
+
196
+ # The section may be empty after the option was removed.
197
+ if not parser.items(section):
198
+ parser.remove_section(section)
199
+ self._mark_as_modified(fname, parser)
200
+
201
+ del self._config[self.load_only][key]
202
+
203
+ def save(self) -> None:
204
+ """Save the current in-memory state."""
205
+ self._ensure_have_load_only()
206
+
207
+ for fname, parser in self._modified_parsers:
208
+ logger.info("Writing to %s", fname)
209
+
210
+ # Ensure directory exists.
211
+ ensure_dir(os.path.dirname(fname))
212
+
213
+ # Ensure directory's permission(need to be writeable)
214
+ try:
215
+ with open(fname, "w") as f:
216
+ parser.write(f)
217
+ except OSError as error:
218
+ raise ConfigurationError(
219
+ f"An error occurred while writing to the configuration file "
220
+ f"{fname}: {error}"
221
+ )
222
+
223
+ #
224
+ # Private routines
225
+ #
226
+
227
+ def _ensure_have_load_only(self) -> None:
228
+ if self.load_only is None:
229
+ raise ConfigurationError("Needed a specific file to be modifying.")
230
+ logger.debug("Will be working with %s variant only", self.load_only)
231
+
232
+ @property
233
+ def _dictionary(self) -> Dict[str, Any]:
234
+ """A dictionary representing the loaded configuration."""
235
+ # NOTE: Dictionaries are not populated if not loaded. So, conditionals
236
+ # are not needed here.
237
+ retval = {}
238
+
239
+ for variant in OVERRIDE_ORDER:
240
+ retval.update(self._config[variant])
241
+
242
+ return retval
243
+
244
+ def _load_config_files(self) -> None:
245
+ """Loads configuration from configuration files"""
246
+ config_files = dict(self.iter_config_files())
247
+ if config_files[kinds.ENV][0:1] == [os.devnull]:
248
+ logger.debug(
249
+ "Skipping loading configuration files due to "
250
+ "environment's PIP_CONFIG_FILE being os.devnull"
251
+ )
252
+ return
253
+
254
+ for variant, files in config_files.items():
255
+ for fname in files:
256
+ # If there's specific variant set in `load_only`, load only
257
+ # that variant, not the others.
258
+ if self.load_only is not None and variant != self.load_only:
259
+ logger.debug("Skipping file '%s' (variant: %s)", fname, variant)
260
+ continue
261
+
262
+ parser = self._load_file(variant, fname)
263
+
264
+ # Keeping track of the parsers used
265
+ self._parsers[variant].append((fname, parser))
266
+
267
+ def _load_file(self, variant: Kind, fname: str) -> RawConfigParser:
268
+ logger.verbose("For variant '%s', will try loading '%s'", variant, fname)
269
+ parser = self._construct_parser(fname)
270
+
271
+ for section in parser.sections():
272
+ items = parser.items(section)
273
+ self._config[variant].update(self._normalized_keys(section, items))
274
+
275
+ return parser
276
+
277
+ def _construct_parser(self, fname: str) -> RawConfigParser:
278
+ parser = configparser.RawConfigParser()
279
+ # If there is no such file, don't bother reading it but create the
280
+ # parser anyway, to hold the data.
281
+ # Doing this is useful when modifying and saving files, where we don't
282
+ # need to construct a parser.
283
+ if os.path.exists(fname):
284
+ locale_encoding = locale.getpreferredencoding(False)
285
+ try:
286
+ parser.read(fname, encoding=locale_encoding)
287
+ except UnicodeDecodeError:
288
+ # See https://github.com/pypa/pip/issues/4963
289
+ raise ConfigurationFileCouldNotBeLoaded(
290
+ reason=f"contains invalid {locale_encoding} characters",
291
+ fname=fname,
292
+ )
293
+ except configparser.Error as error:
294
+ # See https://github.com/pypa/pip/issues/4893
295
+ raise ConfigurationFileCouldNotBeLoaded(error=error)
296
+ return parser
297
+
298
+ def _load_environment_vars(self) -> None:
299
+ """Loads configuration from environment variables"""
300
+ self._config[kinds.ENV_VAR].update(
301
+ self._normalized_keys(":env:", self.get_environ_vars())
302
+ )
303
+
304
+ def _normalized_keys(
305
+ self, section: str, items: Iterable[Tuple[str, Any]]
306
+ ) -> Dict[str, Any]:
307
+ """Normalizes items to construct a dictionary with normalized keys.
308
+
309
+ This routine is where the names become keys and are made the same
310
+ regardless of source - configuration files or environment.
311
+ """
312
+ normalized = {}
313
+ for name, val in items:
314
+ key = section + "." + _normalize_name(name)
315
+ normalized[key] = val
316
+ return normalized
317
+
318
+ def get_environ_vars(self) -> Iterable[Tuple[str, str]]:
319
+ """Returns a generator with all environmental vars with prefix PIP_"""
320
+ for key, val in os.environ.items():
321
+ if key.startswith("PIP_"):
322
+ name = key[4:].lower()
323
+ if name not in ENV_NAMES_IGNORED:
324
+ yield name, val
325
+
326
+ # XXX: This is patched in the tests.
327
+ def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]:
328
+ """Yields variant and configuration files associated with it.
329
+
330
+ This should be treated like items of a dictionary. The order
331
+ here doesn't affect what gets overridden. That is controlled
332
+ by OVERRIDE_ORDER. However this does control the order they are
333
+ displayed to the user. It's probably most ergonomic to display
334
+ things in the same order as OVERRIDE_ORDER
335
+ """
336
+ # SMELL: Move the conditions out of this function
337
+
338
+ env_config_file = os.environ.get("PIP_CONFIG_FILE", None)
339
+ config_files = get_configuration_files()
340
+
341
+ yield kinds.GLOBAL, config_files[kinds.GLOBAL]
342
+
343
+ # per-user config is not loaded when env_config_file exists
344
+ should_load_user_config = not self.isolated and not (
345
+ env_config_file and os.path.exists(env_config_file)
346
+ )
347
+ if should_load_user_config:
348
+ # The legacy config file is overridden by the new config file
349
+ yield kinds.USER, config_files[kinds.USER]
350
+
351
+ # virtualenv config
352
+ yield kinds.SITE, config_files[kinds.SITE]
353
+
354
+ if env_config_file is not None:
355
+ yield kinds.ENV, [env_config_file]
356
+ else:
357
+ yield kinds.ENV, []
358
+
359
+ def get_values_in_config(self, variant: Kind) -> Dict[str, Any]:
360
+ """Get values present in a config file"""
361
+ return self._config[variant]
362
+
363
+ def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]:
364
+ # Determine which parser to modify
365
+ assert self.load_only
366
+ parsers = self._parsers[self.load_only]
367
+ if not parsers:
368
+ # This should not happen if everything works correctly.
369
+ raise ConfigurationError(
370
+ "Fatal Internal error [id=2]. Please report as a bug."
371
+ )
372
+
373
+ # Use the highest priority parser.
374
+ return parsers[-1]
375
+
376
+ # XXX: This is patched in the tests.
377
+ def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None:
378
+ file_parser_tuple = (fname, parser)
379
+ if file_parser_tuple not in self._modified_parsers:
380
+ self._modified_parsers.append(file_parser_tuple)
381
+
382
+ def __repr__(self) -> str:
383
+ return f"{self.__class__.__name__}({self._dictionary!r})"
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/exceptions.py ADDED
@@ -0,0 +1,862 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Exceptions used throughout package.
2
+
3
+ This module MUST NOT try to import from anything within `pip._internal` to
4
+ operate. This is expected to be importable from any/all files within the
5
+ subpackage and, thus, should not depend on them.
6
+ """
7
+
8
+ import configparser
9
+ import contextlib
10
+ import locale
11
+ import logging
12
+ import pathlib
13
+ import re
14
+ import sys
15
+ from itertools import chain, groupby, repeat
16
+ from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union
17
+
18
+ from pip._vendor.packaging.requirements import InvalidRequirement
19
+ from pip._vendor.packaging.version import InvalidVersion
20
+ from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult
21
+ from pip._vendor.rich.markup import escape
22
+ from pip._vendor.rich.text import Text
23
+
24
+ if TYPE_CHECKING:
25
+ from hashlib import _Hash
26
+
27
+ from pip._vendor.requests.models import Request, Response
28
+
29
+ from pip._internal.metadata import BaseDistribution
30
+ from pip._internal.models.link import Link
31
+ from pip._internal.req.req_install import InstallRequirement
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ #
37
+ # Scaffolding
38
+ #
39
+ def _is_kebab_case(s: str) -> bool:
40
+ return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None
41
+
42
+
43
+ def _prefix_with_indent(
44
+ s: Union[Text, str],
45
+ console: Console,
46
+ *,
47
+ prefix: str,
48
+ indent: str,
49
+ ) -> Text:
50
+ if isinstance(s, Text):
51
+ text = s
52
+ else:
53
+ text = console.render_str(s)
54
+
55
+ return console.render_str(prefix, overflow="ignore") + console.render_str(
56
+ f"\n{indent}", overflow="ignore"
57
+ ).join(text.split(allow_blank=True))
58
+
59
+
60
+ class PipError(Exception):
61
+ """The base pip error."""
62
+
63
+
64
+ class DiagnosticPipError(PipError):
65
+ """An error, that presents diagnostic information to the user.
66
+
67
+ This contains a bunch of logic, to enable pretty presentation of our error
68
+ messages. Each error gets a unique reference. Each error can also include
69
+ additional context, a hint and/or a note -- which are presented with the
70
+ main error message in a consistent style.
71
+
72
+ This is adapted from the error output styling in `sphinx-theme-builder`.
73
+ """
74
+
75
+ reference: str
76
+
77
+ def __init__(
78
+ self,
79
+ *,
80
+ kind: 'Literal["error", "warning"]' = "error",
81
+ reference: Optional[str] = None,
82
+ message: Union[str, Text],
83
+ context: Optional[Union[str, Text]],
84
+ hint_stmt: Optional[Union[str, Text]],
85
+ note_stmt: Optional[Union[str, Text]] = None,
86
+ link: Optional[str] = None,
87
+ ) -> None:
88
+ # Ensure a proper reference is provided.
89
+ if reference is None:
90
+ assert hasattr(self, "reference"), "error reference not provided!"
91
+ reference = self.reference
92
+ assert _is_kebab_case(reference), "error reference must be kebab-case!"
93
+
94
+ self.kind = kind
95
+ self.reference = reference
96
+
97
+ self.message = message
98
+ self.context = context
99
+
100
+ self.note_stmt = note_stmt
101
+ self.hint_stmt = hint_stmt
102
+
103
+ self.link = link
104
+
105
+ super().__init__(f"<{self.__class__.__name__}: {self.reference}>")
106
+
107
+ def __repr__(self) -> str:
108
+ return (
109
+ f"<{self.__class__.__name__}("
110
+ f"reference={self.reference!r}, "
111
+ f"message={self.message!r}, "
112
+ f"context={self.context!r}, "
113
+ f"note_stmt={self.note_stmt!r}, "
114
+ f"hint_stmt={self.hint_stmt!r}"
115
+ ")>"
116
+ )
117
+
118
+ def __rich_console__(
119
+ self,
120
+ console: Console,
121
+ options: ConsoleOptions,
122
+ ) -> RenderResult:
123
+ colour = "red" if self.kind == "error" else "yellow"
124
+
125
+ yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]"
126
+ yield ""
127
+
128
+ if not options.ascii_only:
129
+ # Present the main message, with relevant context indented.
130
+ if self.context is not None:
131
+ yield _prefix_with_indent(
132
+ self.message,
133
+ console,
134
+ prefix=f"[{colour}]×[/] ",
135
+ indent=f"[{colour}]│[/] ",
136
+ )
137
+ yield _prefix_with_indent(
138
+ self.context,
139
+ console,
140
+ prefix=f"[{colour}]╰─>[/] ",
141
+ indent=f"[{colour}] [/] ",
142
+ )
143
+ else:
144
+ yield _prefix_with_indent(
145
+ self.message,
146
+ console,
147
+ prefix="[red]×[/] ",
148
+ indent=" ",
149
+ )
150
+ else:
151
+ yield self.message
152
+ if self.context is not None:
153
+ yield ""
154
+ yield self.context
155
+
156
+ if self.note_stmt is not None or self.hint_stmt is not None:
157
+ yield ""
158
+
159
+ if self.note_stmt is not None:
160
+ yield _prefix_with_indent(
161
+ self.note_stmt,
162
+ console,
163
+ prefix="[magenta bold]note[/]: ",
164
+ indent=" ",
165
+ )
166
+ if self.hint_stmt is not None:
167
+ yield _prefix_with_indent(
168
+ self.hint_stmt,
169
+ console,
170
+ prefix="[cyan bold]hint[/]: ",
171
+ indent=" ",
172
+ )
173
+
174
+ if self.link is not None:
175
+ yield ""
176
+ yield f"Link: {self.link}"
177
+
178
+
179
+ #
180
+ # Actual Errors
181
+ #
182
+ class ConfigurationError(PipError):
183
+ """General exception in configuration"""
184
+
185
+
186
+ class InstallationError(PipError):
187
+ """General exception during installation"""
188
+
189
+
190
+ class MissingPyProjectBuildRequires(DiagnosticPipError):
191
+ """Raised when pyproject.toml has `build-system`, but no `build-system.requires`."""
192
+
193
+ reference = "missing-pyproject-build-system-requires"
194
+
195
+ def __init__(self, *, package: str) -> None:
196
+ super().__init__(
197
+ message=f"Can not process {escape(package)}",
198
+ context=Text(
199
+ "This package has an invalid pyproject.toml file.\n"
200
+ "The [build-system] table is missing the mandatory `requires` key."
201
+ ),
202
+ note_stmt="This is an issue with the package mentioned above, not pip.",
203
+ hint_stmt=Text("See PEP 518 for the detailed specification."),
204
+ )
205
+
206
+
207
+ class InvalidPyProjectBuildRequires(DiagnosticPipError):
208
+ """Raised when pyproject.toml an invalid `build-system.requires`."""
209
+
210
+ reference = "invalid-pyproject-build-system-requires"
211
+
212
+ def __init__(self, *, package: str, reason: str) -> None:
213
+ super().__init__(
214
+ message=f"Can not process {escape(package)}",
215
+ context=Text(
216
+ "This package has an invalid `build-system.requires` key in "
217
+ f"pyproject.toml.\n{reason}"
218
+ ),
219
+ note_stmt="This is an issue with the package mentioned above, not pip.",
220
+ hint_stmt=Text("See PEP 518 for the detailed specification."),
221
+ )
222
+
223
+
224
+ class NoneMetadataError(PipError):
225
+ """Raised when accessing a Distribution's "METADATA" or "PKG-INFO".
226
+
227
+ This signifies an inconsistency, when the Distribution claims to have
228
+ the metadata file (if not, raise ``FileNotFoundError`` instead), but is
229
+ not actually able to produce its content. This may be due to permission
230
+ errors.
231
+ """
232
+
233
+ def __init__(
234
+ self,
235
+ dist: "BaseDistribution",
236
+ metadata_name: str,
237
+ ) -> None:
238
+ """
239
+ :param dist: A Distribution object.
240
+ :param metadata_name: The name of the metadata being accessed
241
+ (can be "METADATA" or "PKG-INFO").
242
+ """
243
+ self.dist = dist
244
+ self.metadata_name = metadata_name
245
+
246
+ def __str__(self) -> str:
247
+ # Use `dist` in the error message because its stringification
248
+ # includes more information, like the version and location.
249
+ return f"None {self.metadata_name} metadata found for distribution: {self.dist}"
250
+
251
+
252
+ class UserInstallationInvalid(InstallationError):
253
+ """A --user install is requested on an environment without user site."""
254
+
255
+ def __str__(self) -> str:
256
+ return "User base directory is not specified"
257
+
258
+
259
+ class InvalidSchemeCombination(InstallationError):
260
+ def __str__(self) -> str:
261
+ before = ", ".join(str(a) for a in self.args[:-1])
262
+ return f"Cannot set {before} and {self.args[-1]} together"
263
+
264
+
265
+ class DistributionNotFound(InstallationError):
266
+ """Raised when a distribution cannot be found to satisfy a requirement"""
267
+
268
+
269
+ class RequirementsFileParseError(InstallationError):
270
+ """Raised when a general error occurs parsing a requirements file line."""
271
+
272
+
273
+ class BestVersionAlreadyInstalled(PipError):
274
+ """Raised when the most up-to-date version of a package is already
275
+ installed."""
276
+
277
+
278
+ class BadCommand(PipError):
279
+ """Raised when virtualenv or a command is not found"""
280
+
281
+
282
+ class CommandError(PipError):
283
+ """Raised when there is an error in command-line arguments"""
284
+
285
+
286
+ class PreviousBuildDirError(PipError):
287
+ """Raised when there's a previous conflicting build directory"""
288
+
289
+
290
+ class NetworkConnectionError(PipError):
291
+ """HTTP connection error"""
292
+
293
+ def __init__(
294
+ self,
295
+ error_msg: str,
296
+ response: Optional["Response"] = None,
297
+ request: Optional["Request"] = None,
298
+ ) -> None:
299
+ """
300
+ Initialize NetworkConnectionError with `request` and `response`
301
+ objects.
302
+ """
303
+ self.response = response
304
+ self.request = request
305
+ self.error_msg = error_msg
306
+ if (
307
+ self.response is not None
308
+ and not self.request
309
+ and hasattr(response, "request")
310
+ ):
311
+ self.request = self.response.request
312
+ super().__init__(error_msg, response, request)
313
+
314
+ def __str__(self) -> str:
315
+ return str(self.error_msg)
316
+
317
+
318
+ class InvalidWheelFilename(InstallationError):
319
+ """Invalid wheel filename."""
320
+
321
+
322
+ class UnsupportedWheel(InstallationError):
323
+ """Unsupported wheel."""
324
+
325
+
326
+ class InvalidWheel(InstallationError):
327
+ """Invalid (e.g. corrupt) wheel."""
328
+
329
+ def __init__(self, location: str, name: str):
330
+ self.location = location
331
+ self.name = name
332
+
333
+ def __str__(self) -> str:
334
+ return f"Wheel '{self.name}' located at {self.location} is invalid."
335
+
336
+
337
+ class MetadataInconsistent(InstallationError):
338
+ """Built metadata contains inconsistent information.
339
+
340
+ This is raised when the metadata contains values (e.g. name and version)
341
+ that do not match the information previously obtained from sdist filename,
342
+ user-supplied ``#egg=`` value, or an install requirement name.
343
+ """
344
+
345
+ def __init__(
346
+ self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str
347
+ ) -> None:
348
+ self.ireq = ireq
349
+ self.field = field
350
+ self.f_val = f_val
351
+ self.m_val = m_val
352
+
353
+ def __str__(self) -> str:
354
+ return (
355
+ f"Requested {self.ireq} has inconsistent {self.field}: "
356
+ f"expected {self.f_val!r}, but metadata has {self.m_val!r}"
357
+ )
358
+
359
+
360
+ class MetadataInvalid(InstallationError):
361
+ """Metadata is invalid."""
362
+
363
+ def __init__(self, ireq: "InstallRequirement", error: str) -> None:
364
+ self.ireq = ireq
365
+ self.error = error
366
+
367
+ def __str__(self) -> str:
368
+ return f"Requested {self.ireq} has invalid metadata: {self.error}"
369
+
370
+
371
+ class InstallationSubprocessError(DiagnosticPipError, InstallationError):
372
+ """A subprocess call failed."""
373
+
374
+ reference = "subprocess-exited-with-error"
375
+
376
+ def __init__(
377
+ self,
378
+ *,
379
+ command_description: str,
380
+ exit_code: int,
381
+ output_lines: Optional[List[str]],
382
+ ) -> None:
383
+ if output_lines is None:
384
+ output_prompt = Text("See above for output.")
385
+ else:
386
+ output_prompt = (
387
+ Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n")
388
+ + Text("".join(output_lines))
389
+ + Text.from_markup(R"[red]\[end of output][/]")
390
+ )
391
+
392
+ super().__init__(
393
+ message=(
394
+ f"[green]{escape(command_description)}[/] did not run successfully.\n"
395
+ f"exit code: {exit_code}"
396
+ ),
397
+ context=output_prompt,
398
+ hint_stmt=None,
399
+ note_stmt=(
400
+ "This error originates from a subprocess, and is likely not a "
401
+ "problem with pip."
402
+ ),
403
+ )
404
+
405
+ self.command_description = command_description
406
+ self.exit_code = exit_code
407
+
408
+ def __str__(self) -> str:
409
+ return f"{self.command_description} exited with {self.exit_code}"
410
+
411
+
412
+ class MetadataGenerationFailed(InstallationSubprocessError, InstallationError):
413
+ reference = "metadata-generation-failed"
414
+
415
+ def __init__(
416
+ self,
417
+ *,
418
+ package_details: str,
419
+ ) -> None:
420
+ super(InstallationSubprocessError, self).__init__(
421
+ message="Encountered error while generating package metadata.",
422
+ context=escape(package_details),
423
+ hint_stmt="See above for details.",
424
+ note_stmt="This is an issue with the package mentioned above, not pip.",
425
+ )
426
+
427
+ def __str__(self) -> str:
428
+ return "metadata generation failed"
429
+
430
+
431
+ class HashErrors(InstallationError):
432
+ """Multiple HashError instances rolled into one for reporting"""
433
+
434
+ def __init__(self) -> None:
435
+ self.errors: List[HashError] = []
436
+
437
+ def append(self, error: "HashError") -> None:
438
+ self.errors.append(error)
439
+
440
+ def __str__(self) -> str:
441
+ lines = []
442
+ self.errors.sort(key=lambda e: e.order)
443
+ for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__):
444
+ lines.append(cls.head)
445
+ lines.extend(e.body() for e in errors_of_cls)
446
+ if lines:
447
+ return "\n".join(lines)
448
+ return ""
449
+
450
+ def __bool__(self) -> bool:
451
+ return bool(self.errors)
452
+
453
+
454
+ class HashError(InstallationError):
455
+ """
456
+ A failure to verify a package against known-good hashes
457
+
458
+ :cvar order: An int sorting hash exception classes by difficulty of
459
+ recovery (lower being harder), so the user doesn't bother fretting
460
+ about unpinned packages when he has deeper issues, like VCS
461
+ dependencies, to deal with. Also keeps error reports in a
462
+ deterministic order.
463
+ :cvar head: A section heading for display above potentially many
464
+ exceptions of this kind
465
+ :ivar req: The InstallRequirement that triggered this error. This is
466
+ pasted on after the exception is instantiated, because it's not
467
+ typically available earlier.
468
+
469
+ """
470
+
471
+ req: Optional["InstallRequirement"] = None
472
+ head = ""
473
+ order: int = -1
474
+
475
+ def body(self) -> str:
476
+ """Return a summary of me for display under the heading.
477
+
478
+ This default implementation simply prints a description of the
479
+ triggering requirement.
480
+
481
+ :param req: The InstallRequirement that provoked this error, with
482
+ its link already populated by the resolver's _populate_link().
483
+
484
+ """
485
+ return f" {self._requirement_name()}"
486
+
487
+ def __str__(self) -> str:
488
+ return f"{self.head}\n{self.body()}"
489
+
490
+ def _requirement_name(self) -> str:
491
+ """Return a description of the requirement that triggered me.
492
+
493
+ This default implementation returns long description of the req, with
494
+ line numbers
495
+
496
+ """
497
+ return str(self.req) if self.req else "unknown package"
498
+
499
+
500
+ class VcsHashUnsupported(HashError):
501
+ """A hash was provided for a version-control-system-based requirement, but
502
+ we don't have a method for hashing those."""
503
+
504
+ order = 0
505
+ head = (
506
+ "Can't verify hashes for these requirements because we don't "
507
+ "have a way to hash version control repositories:"
508
+ )
509
+
510
+
511
+ class DirectoryUrlHashUnsupported(HashError):
512
+ """A hash was provided for a version-control-system-based requirement, but
513
+ we don't have a method for hashing those."""
514
+
515
+ order = 1
516
+ head = (
517
+ "Can't verify hashes for these file:// requirements because they "
518
+ "point to directories:"
519
+ )
520
+
521
+
522
+ class HashMissing(HashError):
523
+ """A hash was needed for a requirement but is absent."""
524
+
525
+ order = 2
526
+ head = (
527
+ "Hashes are required in --require-hashes mode, but they are "
528
+ "missing from some requirements. Here is a list of those "
529
+ "requirements along with the hashes their downloaded archives "
530
+ "actually had. Add lines like these to your requirements files to "
531
+ "prevent tampering. (If you did not enable --require-hashes "
532
+ "manually, note that it turns on automatically when any package "
533
+ "has a hash.)"
534
+ )
535
+
536
+ def __init__(self, gotten_hash: str) -> None:
537
+ """
538
+ :param gotten_hash: The hash of the (possibly malicious) archive we
539
+ just downloaded
540
+ """
541
+ self.gotten_hash = gotten_hash
542
+
543
+ def body(self) -> str:
544
+ # Dodge circular import.
545
+ from pip._internal.utils.hashes import FAVORITE_HASH
546
+
547
+ package = None
548
+ if self.req:
549
+ # In the case of URL-based requirements, display the original URL
550
+ # seen in the requirements file rather than the package name,
551
+ # so the output can be directly copied into the requirements file.
552
+ package = (
553
+ self.req.original_link
554
+ if self.req.is_direct
555
+ # In case someone feeds something downright stupid
556
+ # to InstallRequirement's constructor.
557
+ else getattr(self.req, "req", None)
558
+ )
559
+ return " {} --hash={}:{}".format(
560
+ package or "unknown package", FAVORITE_HASH, self.gotten_hash
561
+ )
562
+
563
+
564
+ class HashUnpinned(HashError):
565
+ """A requirement had a hash specified but was not pinned to a specific
566
+ version."""
567
+
568
+ order = 3
569
+ head = (
570
+ "In --require-hashes mode, all requirements must have their "
571
+ "versions pinned with ==. These do not:"
572
+ )
573
+
574
+
575
+ class HashMismatch(HashError):
576
+ """
577
+ Distribution file hash values don't match.
578
+
579
+ :ivar package_name: The name of the package that triggered the hash
580
+ mismatch. Feel free to write to this after the exception is raise to
581
+ improve its error message.
582
+
583
+ """
584
+
585
+ order = 4
586
+ head = (
587
+ "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS "
588
+ "FILE. If you have updated the package versions, please update "
589
+ "the hashes. Otherwise, examine the package contents carefully; "
590
+ "someone may have tampered with them."
591
+ )
592
+
593
+ def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None:
594
+ """
595
+ :param allowed: A dict of algorithm names pointing to lists of allowed
596
+ hex digests
597
+ :param gots: A dict of algorithm names pointing to hashes we
598
+ actually got from the files under suspicion
599
+ """
600
+ self.allowed = allowed
601
+ self.gots = gots
602
+
603
+ def body(self) -> str:
604
+ return f" {self._requirement_name()}:\n{self._hash_comparison()}"
605
+
606
+ def _hash_comparison(self) -> str:
607
+ """
608
+ Return a comparison of actual and expected hash values.
609
+
610
+ Example::
611
+
612
+ Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
613
+ or 123451234512345123451234512345123451234512345
614
+ Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef
615
+
616
+ """
617
+
618
+ def hash_then_or(hash_name: str) -> "chain[str]":
619
+ # For now, all the decent hashes have 6-char names, so we can get
620
+ # away with hard-coding space literals.
621
+ return chain([hash_name], repeat(" or"))
622
+
623
+ lines: List[str] = []
624
+ for hash_name, expecteds in self.allowed.items():
625
+ prefix = hash_then_or(hash_name)
626
+ lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds)
627
+ lines.append(
628
+ f" Got {self.gots[hash_name].hexdigest()}\n"
629
+ )
630
+ return "\n".join(lines)
631
+
632
+
633
+ class UnsupportedPythonVersion(InstallationError):
634
+ """Unsupported python version according to Requires-Python package
635
+ metadata."""
636
+
637
+
638
+ class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
639
+ """When there are errors while loading a configuration file"""
640
+
641
+ def __init__(
642
+ self,
643
+ reason: str = "could not be loaded",
644
+ fname: Optional[str] = None,
645
+ error: Optional[configparser.Error] = None,
646
+ ) -> None:
647
+ super().__init__(error)
648
+ self.reason = reason
649
+ self.fname = fname
650
+ self.error = error
651
+
652
+ def __str__(self) -> str:
653
+ if self.fname is not None:
654
+ message_part = f" in {self.fname}."
655
+ else:
656
+ assert self.error is not None
657
+ message_part = f".\n{self.error}\n"
658
+ return f"Configuration file {self.reason}{message_part}"
659
+
660
+
661
+ _DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\
662
+ The Python environment under {sys.prefix} is managed externally, and may not be
663
+ manipulated by the user. Please use specific tooling from the distributor of
664
+ the Python installation to interact with this environment instead.
665
+ """
666
+
667
+
668
+ class ExternallyManagedEnvironment(DiagnosticPipError):
669
+ """The current environment is externally managed.
670
+
671
+ This is raised when the current environment is externally managed, as
672
+ defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked
673
+ and displayed when the error is bubbled up to the user.
674
+
675
+ :param error: The error message read from ``EXTERNALLY-MANAGED``.
676
+ """
677
+
678
+ reference = "externally-managed-environment"
679
+
680
+ def __init__(self, error: Optional[str]) -> None:
681
+ if error is None:
682
+ context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR)
683
+ else:
684
+ context = Text(error)
685
+ super().__init__(
686
+ message="This environment is externally managed",
687
+ context=context,
688
+ note_stmt=(
689
+ "If you believe this is a mistake, please contact your "
690
+ "Python installation or OS distribution provider. "
691
+ "You can override this, at the risk of breaking your Python "
692
+ "installation or OS, by passing --break-system-packages."
693
+ ),
694
+ hint_stmt=Text("See PEP 668 for the detailed specification."),
695
+ )
696
+
697
+ @staticmethod
698
+ def _iter_externally_managed_error_keys() -> Iterator[str]:
699
+ # LC_MESSAGES is in POSIX, but not the C standard. The most common
700
+ # platform that does not implement this category is Windows, where
701
+ # using other categories for console message localization is equally
702
+ # unreliable, so we fall back to the locale-less vendor message. This
703
+ # can always be re-evaluated when a vendor proposes a new alternative.
704
+ try:
705
+ category = locale.LC_MESSAGES
706
+ except AttributeError:
707
+ lang: Optional[str] = None
708
+ else:
709
+ lang, _ = locale.getlocale(category)
710
+ if lang is not None:
711
+ yield f"Error-{lang}"
712
+ for sep in ("-", "_"):
713
+ before, found, _ = lang.partition(sep)
714
+ if not found:
715
+ continue
716
+ yield f"Error-{before}"
717
+ yield "Error"
718
+
719
+ @classmethod
720
+ def from_config(
721
+ cls,
722
+ config: Union[pathlib.Path, str],
723
+ ) -> "ExternallyManagedEnvironment":
724
+ parser = configparser.ConfigParser(interpolation=None)
725
+ try:
726
+ parser.read(config, encoding="utf-8")
727
+ section = parser["externally-managed"]
728
+ for key in cls._iter_externally_managed_error_keys():
729
+ with contextlib.suppress(KeyError):
730
+ return cls(section[key])
731
+ except KeyError:
732
+ pass
733
+ except (OSError, UnicodeDecodeError, configparser.ParsingError):
734
+ from pip._internal.utils._log import VERBOSE
735
+
736
+ exc_info = logger.isEnabledFor(VERBOSE)
737
+ logger.warning("Failed to read %s", config, exc_info=exc_info)
738
+ return cls(None)
739
+
740
+
741
+ class UninstallMissingRecord(DiagnosticPipError):
742
+ reference = "uninstall-no-record-file"
743
+
744
+ def __init__(self, *, distribution: "BaseDistribution") -> None:
745
+ installer = distribution.installer
746
+ if not installer or installer == "pip":
747
+ dep = f"{distribution.raw_name}=={distribution.version}"
748
+ hint = Text.assemble(
749
+ "You might be able to recover from this via: ",
750
+ (f"pip install --force-reinstall --no-deps {dep}", "green"),
751
+ )
752
+ else:
753
+ hint = Text(
754
+ f"The package was installed by {installer}. "
755
+ "You should check if it can uninstall the package."
756
+ )
757
+
758
+ super().__init__(
759
+ message=Text(f"Cannot uninstall {distribution}"),
760
+ context=(
761
+ "The package's contents are unknown: "
762
+ f"no RECORD file was found for {distribution.raw_name}."
763
+ ),
764
+ hint_stmt=hint,
765
+ )
766
+
767
+
768
+ class LegacyDistutilsInstall(DiagnosticPipError):
769
+ reference = "uninstall-distutils-installed-package"
770
+
771
+ def __init__(self, *, distribution: "BaseDistribution") -> None:
772
+ super().__init__(
773
+ message=Text(f"Cannot uninstall {distribution}"),
774
+ context=(
775
+ "It is a distutils installed project and thus we cannot accurately "
776
+ "determine which files belong to it which would lead to only a partial "
777
+ "uninstall."
778
+ ),
779
+ hint_stmt=None,
780
+ )
781
+
782
+
783
+ class InvalidInstalledPackage(DiagnosticPipError):
784
+ reference = "invalid-installed-package"
785
+
786
+ def __init__(
787
+ self,
788
+ *,
789
+ dist: "BaseDistribution",
790
+ invalid_exc: Union[InvalidRequirement, InvalidVersion],
791
+ ) -> None:
792
+ installed_location = dist.installed_location
793
+
794
+ if isinstance(invalid_exc, InvalidRequirement):
795
+ invalid_type = "requirement"
796
+ else:
797
+ invalid_type = "version"
798
+
799
+ super().__init__(
800
+ message=Text(
801
+ f"Cannot process installed package {dist} "
802
+ + (f"in {installed_location!r} " if installed_location else "")
803
+ + f"because it has an invalid {invalid_type}:\n{invalid_exc.args[0]}"
804
+ ),
805
+ context=(
806
+ "Starting with pip 24.1, packages with invalid "
807
+ f"{invalid_type}s can not be processed."
808
+ ),
809
+ hint_stmt="To proceed this package must be uninstalled.",
810
+ )
811
+
812
+
813
+ class IncompleteDownloadError(DiagnosticPipError):
814
+ """Raised when the downloader receives fewer bytes than advertised
815
+ in the Content-Length header."""
816
+
817
+ reference = "incomplete-download"
818
+
819
+ def __init__(
820
+ self, link: "Link", received: int, expected: int, *, retries: int
821
+ ) -> None:
822
+ # Dodge circular import.
823
+ from pip._internal.utils.misc import format_size
824
+
825
+ download_status = f"{format_size(received)}/{format_size(expected)}"
826
+ if retries:
827
+ retry_status = f"after {retries} attempts "
828
+ hint = "Use --resume-retries to configure resume attempt limit."
829
+ else:
830
+ retry_status = ""
831
+ hint = "Consider using --resume-retries to enable download resumption."
832
+ message = Text(
833
+ f"Download failed {retry_status}because not enough bytes "
834
+ f"were received ({download_status})"
835
+ )
836
+
837
+ super().__init__(
838
+ message=message,
839
+ context=f"URL: {link.redacted_url}",
840
+ hint_stmt=hint,
841
+ note_stmt="This is an issue with network connectivity, not pip.",
842
+ )
843
+
844
+
845
+ class ResolutionTooDeepError(DiagnosticPipError):
846
+ """Raised when the dependency resolver exceeds the maximum recursion depth."""
847
+
848
+ reference = "resolution-too-deep"
849
+
850
+ def __init__(self) -> None:
851
+ super().__init__(
852
+ message="Dependency resolution exceeded maximum depth",
853
+ context=(
854
+ "Pip cannot resolve the current dependencies as the dependency graph "
855
+ "is too complex for pip to solve efficiently."
856
+ ),
857
+ hint_stmt=(
858
+ "Try adding lower bounds to constrain your dependencies, "
859
+ "for example: 'package>=2.0.0' instead of just 'package'. "
860
+ ),
861
+ link="https://pip.pypa.io/en/stable/topics/dependency-resolution/#handling-resolution-too-deep-errors",
862
+ )
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/main.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+
4
+ def main(args: Optional[List[str]] = None) -> int:
5
+ """This is preserved for old console scripts that may still be referencing
6
+ it.
7
+
8
+ For additional details, see https://github.com/pypa/pip/issues/7498.
9
+ """
10
+ from pip._internal.utils.entrypoints import _wrapper
11
+
12
+ return _wrapper(args)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import contextlib
2
+ import functools
3
+ import os
4
+ import sys
5
+ from typing import List, Literal, Optional, Protocol, Type, cast
6
+
7
+ from pip._internal.utils.deprecation import deprecated
8
+ from pip._internal.utils.misc import strtobool
9
+
10
+ from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel
11
+
12
+ __all__ = [
13
+ "BaseDistribution",
14
+ "BaseEnvironment",
15
+ "FilesystemWheel",
16
+ "MemoryWheel",
17
+ "Wheel",
18
+ "get_default_environment",
19
+ "get_environment",
20
+ "get_wheel_distribution",
21
+ "select_backend",
22
+ ]
23
+
24
+
25
+ def _should_use_importlib_metadata() -> bool:
26
+ """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend.
27
+
28
+ By default, pip uses ``importlib.metadata`` on Python 3.11+, and
29
+ ``pkg_resources`` otherwise. Up to Python 3.13, This can be
30
+ overridden by a couple of ways:
31
+
32
+ * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it
33
+ dictates whether ``importlib.metadata`` is used, for Python <3.14.
34
+ * On Python 3.11, 3.12 and 3.13, Python distributors can patch
35
+ ``importlib.metadata`` to add a global constant
36
+ ``_PIP_USE_IMPORTLIB_METADATA = False``. This makes pip use
37
+ ``pkg_resources`` (unless the user set the aforementioned environment
38
+ variable to *True*).
39
+
40
+ On Python 3.14+, the ``pkg_resources`` backend cannot be used.
41
+ """
42
+ if sys.version_info >= (3, 14):
43
+ # On Python >=3.14 we only support importlib.metadata.
44
+ return True
45
+ with contextlib.suppress(KeyError, ValueError):
46
+ # On Python <3.14, if the environment variable is set, we obey what it says.
47
+ return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"]))
48
+ if sys.version_info < (3, 11):
49
+ # On Python <3.11, we always use pkg_resources, unless the environment
50
+ # variable was set.
51
+ return False
52
+ # On Python 3.11, 3.12 and 3.13, we check if the global constant is set.
53
+ import importlib.metadata
54
+
55
+ return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True))
56
+
57
+
58
+ def _emit_pkg_resources_deprecation_if_needed() -> None:
59
+ if sys.version_info < (3, 11):
60
+ # All pip versions supporting Python<=3.11 will support pkg_resources,
61
+ # and pkg_resources is the default for these, so let's not bother users.
62
+ return
63
+
64
+ import importlib.metadata
65
+
66
+ if hasattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA"):
67
+ # The Python distributor has set the global constant, so we don't
68
+ # warn, since it is not a user decision.
69
+ return
70
+
71
+ # The user has decided to use pkg_resources, so we warn.
72
+ deprecated(
73
+ reason="Using the pkg_resources metadata backend is deprecated.",
74
+ replacement=(
75
+ "to use the default importlib.metadata backend, "
76
+ "by unsetting the _PIP_USE_IMPORTLIB_METADATA environment variable"
77
+ ),
78
+ gone_in="26.3",
79
+ issue=13317,
80
+ )
81
+
82
+
83
+ class Backend(Protocol):
84
+ NAME: 'Literal["importlib", "pkg_resources"]'
85
+ Distribution: Type[BaseDistribution]
86
+ Environment: Type[BaseEnvironment]
87
+
88
+
89
+ @functools.lru_cache(maxsize=None)
90
+ def select_backend() -> Backend:
91
+ if _should_use_importlib_metadata():
92
+ from . import importlib
93
+
94
+ return cast(Backend, importlib)
95
+
96
+ _emit_pkg_resources_deprecation_if_needed()
97
+
98
+ from . import pkg_resources
99
+
100
+ return cast(Backend, pkg_resources)
101
+
102
+
103
+ def get_default_environment() -> BaseEnvironment:
104
+ """Get the default representation for the current environment.
105
+
106
+ This returns an Environment instance from the chosen backend. The default
107
+ Environment instance should be built from ``sys.path`` and may use caching
108
+ to share instance state across calls.
109
+ """
110
+ return select_backend().Environment.default()
111
+
112
+
113
+ def get_environment(paths: Optional[List[str]]) -> BaseEnvironment:
114
+ """Get a representation of the environment specified by ``paths``.
115
+
116
+ This returns an Environment instance from the chosen backend based on the
117
+ given import paths. The backend must build a fresh instance representing
118
+ the state of installed distributions when this function is called.
119
+ """
120
+ return select_backend().Environment.from_paths(paths)
121
+
122
+
123
+ def get_directory_distribution(directory: str) -> BaseDistribution:
124
+ """Get the distribution metadata representation in the specified directory.
125
+
126
+ This returns a Distribution instance from the chosen backend based on
127
+ the given on-disk ``.dist-info`` directory.
128
+ """
129
+ return select_backend().Distribution.from_directory(directory)
130
+
131
+
132
+ def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution:
133
+ """Get the representation of the specified wheel's distribution metadata.
134
+
135
+ This returns a Distribution instance from the chosen backend based on
136
+ the given wheel's ``.dist-info`` directory.
137
+
138
+ :param canonical_name: Normalized project name of the given wheel.
139
+ """
140
+ return select_backend().Distribution.from_wheel(wheel, canonical_name)
141
+
142
+
143
+ def get_metadata_distribution(
144
+ metadata_contents: bytes,
145
+ filename: str,
146
+ canonical_name: str,
147
+ ) -> BaseDistribution:
148
+ """Get the dist representation of the specified METADATA file contents.
149
+
150
+ This returns a Distribution instance from the chosen backend sourced from the data
151
+ in `metadata_contents`.
152
+
153
+ :param metadata_contents: Contents of a METADATA file within a dist, or one served
154
+ via PEP 658.
155
+ :param filename: Filename for the dist this metadata represents.
156
+ :param canonical_name: Normalized project name of the given dist.
157
+ """
158
+ return select_backend().Distribution.from_metadata_file_contents(
159
+ metadata_contents,
160
+ filename,
161
+ canonical_name,
162
+ )
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (5.44 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-310.pyc ADDED
Binary file (2.26 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc ADDED
Binary file (26.9 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc ADDED
Binary file (11 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/_json.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Extracted from https://github.com/pfmoore/pkg_metadata
2
+
3
+ from email.header import Header, decode_header, make_header
4
+ from email.message import Message
5
+ from typing import Any, Dict, List, Union, cast
6
+
7
+ METADATA_FIELDS = [
8
+ # Name, Multiple-Use
9
+ ("Metadata-Version", False),
10
+ ("Name", False),
11
+ ("Version", False),
12
+ ("Dynamic", True),
13
+ ("Platform", True),
14
+ ("Supported-Platform", True),
15
+ ("Summary", False),
16
+ ("Description", False),
17
+ ("Description-Content-Type", False),
18
+ ("Keywords", False),
19
+ ("Home-page", False),
20
+ ("Download-URL", False),
21
+ ("Author", False),
22
+ ("Author-email", False),
23
+ ("Maintainer", False),
24
+ ("Maintainer-email", False),
25
+ ("License", False),
26
+ ("License-Expression", False),
27
+ ("License-File", True),
28
+ ("Classifier", True),
29
+ ("Requires-Dist", True),
30
+ ("Requires-Python", False),
31
+ ("Requires-External", True),
32
+ ("Project-URL", True),
33
+ ("Provides-Extra", True),
34
+ ("Provides-Dist", True),
35
+ ("Obsoletes-Dist", True),
36
+ ]
37
+
38
+
39
+ def json_name(field: str) -> str:
40
+ return field.lower().replace("-", "_")
41
+
42
+
43
+ def msg_to_json(msg: Message) -> Dict[str, Any]:
44
+ """Convert a Message object into a JSON-compatible dictionary."""
45
+
46
+ def sanitise_header(h: Union[Header, str]) -> str:
47
+ if isinstance(h, Header):
48
+ chunks = []
49
+ for bytes, encoding in decode_header(h):
50
+ if encoding == "unknown-8bit":
51
+ try:
52
+ # See if UTF-8 works
53
+ bytes.decode("utf-8")
54
+ encoding = "utf-8"
55
+ except UnicodeDecodeError:
56
+ # If not, latin1 at least won't fail
57
+ encoding = "latin1"
58
+ chunks.append((bytes, encoding))
59
+ return str(make_header(chunks))
60
+ return str(h)
61
+
62
+ result = {}
63
+ for field, multi in METADATA_FIELDS:
64
+ if field not in msg:
65
+ continue
66
+ key = json_name(field)
67
+ if multi:
68
+ value: Union[str, List[str]] = [
69
+ sanitise_header(v) for v in msg.get_all(field) # type: ignore
70
+ ]
71
+ else:
72
+ value = sanitise_header(msg.get(field)) # type: ignore
73
+ if key == "keywords":
74
+ # Accept both comma-separated and space-separated
75
+ # forms, for better compatibility with old data.
76
+ if "," in value:
77
+ value = [v.strip() for v in value.split(",")]
78
+ else:
79
+ value = value.split()
80
+ result[key] = value
81
+
82
+ payload = cast(str, msg.get_payload())
83
+ if payload:
84
+ result["description"] = payload
85
+
86
+ return result
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/base.py ADDED
@@ -0,0 +1,690 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import csv
2
+ import email.message
3
+ import functools
4
+ import json
5
+ import logging
6
+ import pathlib
7
+ import re
8
+ import zipfile
9
+ from typing import (
10
+ IO,
11
+ Any,
12
+ Collection,
13
+ Container,
14
+ Dict,
15
+ Iterable,
16
+ Iterator,
17
+ List,
18
+ NamedTuple,
19
+ Optional,
20
+ Protocol,
21
+ Tuple,
22
+ Union,
23
+ )
24
+
25
+ from pip._vendor.packaging.requirements import Requirement
26
+ from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
27
+ from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
28
+ from pip._vendor.packaging.version import Version
29
+
30
+ from pip._internal.exceptions import NoneMetadataError
31
+ from pip._internal.locations import site_packages, user_site
32
+ from pip._internal.models.direct_url import (
33
+ DIRECT_URL_METADATA_NAME,
34
+ DirectUrl,
35
+ DirectUrlValidationError,
36
+ )
37
+ from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here.
38
+ from pip._internal.utils.egg_link import egg_link_path_from_sys_path
39
+ from pip._internal.utils.misc import is_local, normalize_path
40
+ from pip._internal.utils.urls import url_to_path
41
+
42
+ from ._json import msg_to_json
43
+
44
+ InfoPath = Union[str, pathlib.PurePath]
45
+
46
+ logger = logging.getLogger(__name__)
47
+
48
+
49
+ class BaseEntryPoint(Protocol):
50
+ @property
51
+ def name(self) -> str:
52
+ raise NotImplementedError()
53
+
54
+ @property
55
+ def value(self) -> str:
56
+ raise NotImplementedError()
57
+
58
+ @property
59
+ def group(self) -> str:
60
+ raise NotImplementedError()
61
+
62
+
63
+ def _convert_installed_files_path(
64
+ entry: Tuple[str, ...],
65
+ info: Tuple[str, ...],
66
+ ) -> str:
67
+ """Convert a legacy installed-files.txt path into modern RECORD path.
68
+
69
+ The legacy format stores paths relative to the info directory, while the
70
+ modern format stores paths relative to the package root, e.g. the
71
+ site-packages directory.
72
+
73
+ :param entry: Path parts of the installed-files.txt entry.
74
+ :param info: Path parts of the egg-info directory relative to package root.
75
+ :returns: The converted entry.
76
+
77
+ For best compatibility with symlinks, this does not use ``abspath()`` or
78
+ ``Path.resolve()``, but tries to work with path parts:
79
+
80
+ 1. While ``entry`` starts with ``..``, remove the equal amounts of parts
81
+ from ``info``; if ``info`` is empty, start appending ``..`` instead.
82
+ 2. Join the two directly.
83
+ """
84
+ while entry and entry[0] == "..":
85
+ if not info or info[-1] == "..":
86
+ info += ("..",)
87
+ else:
88
+ info = info[:-1]
89
+ entry = entry[1:]
90
+ return str(pathlib.Path(*info, *entry))
91
+
92
+
93
+ class RequiresEntry(NamedTuple):
94
+ requirement: str
95
+ extra: str
96
+ marker: str
97
+
98
+
99
+ class BaseDistribution(Protocol):
100
+ @classmethod
101
+ def from_directory(cls, directory: str) -> "BaseDistribution":
102
+ """Load the distribution from a metadata directory.
103
+
104
+ :param directory: Path to a metadata directory, e.g. ``.dist-info``.
105
+ """
106
+ raise NotImplementedError()
107
+
108
+ @classmethod
109
+ def from_metadata_file_contents(
110
+ cls,
111
+ metadata_contents: bytes,
112
+ filename: str,
113
+ project_name: str,
114
+ ) -> "BaseDistribution":
115
+ """Load the distribution from the contents of a METADATA file.
116
+
117
+ This is used to implement PEP 658 by generating a "shallow" dist object that can
118
+ be used for resolution without downloading or building the actual dist yet.
119
+
120
+ :param metadata_contents: The contents of a METADATA file.
121
+ :param filename: File name for the dist with this metadata.
122
+ :param project_name: Name of the project this dist represents.
123
+ """
124
+ raise NotImplementedError()
125
+
126
+ @classmethod
127
+ def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution":
128
+ """Load the distribution from a given wheel.
129
+
130
+ :param wheel: A concrete wheel definition.
131
+ :param name: File name of the wheel.
132
+
133
+ :raises InvalidWheel: Whenever loading of the wheel causes a
134
+ :py:exc:`zipfile.BadZipFile` exception to be thrown.
135
+ :raises UnsupportedWheel: If the wheel is a valid zip, but malformed
136
+ internally.
137
+ """
138
+ raise NotImplementedError()
139
+
140
+ def __repr__(self) -> str:
141
+ return f"{self.raw_name} {self.raw_version} ({self.location})"
142
+
143
+ def __str__(self) -> str:
144
+ return f"{self.raw_name} {self.raw_version}"
145
+
146
+ @property
147
+ def location(self) -> Optional[str]:
148
+ """Where the distribution is loaded from.
149
+
150
+ A string value is not necessarily a filesystem path, since distributions
151
+ can be loaded from other sources, e.g. arbitrary zip archives. ``None``
152
+ means the distribution is created in-memory.
153
+
154
+ Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If
155
+ this is a symbolic link, we want to preserve the relative path between
156
+ it and files in the distribution.
157
+ """
158
+ raise NotImplementedError()
159
+
160
+ @property
161
+ def editable_project_location(self) -> Optional[str]:
162
+ """The project location for editable distributions.
163
+
164
+ This is the directory where pyproject.toml or setup.py is located.
165
+ None if the distribution is not installed in editable mode.
166
+ """
167
+ # TODO: this property is relatively costly to compute, memoize it ?
168
+ direct_url = self.direct_url
169
+ if direct_url:
170
+ if direct_url.is_local_editable():
171
+ return url_to_path(direct_url.url)
172
+ else:
173
+ # Search for an .egg-link file by walking sys.path, as it was
174
+ # done before by dist_is_editable().
175
+ egg_link_path = egg_link_path_from_sys_path(self.raw_name)
176
+ if egg_link_path:
177
+ # TODO: get project location from second line of egg_link file
178
+ # (https://github.com/pypa/pip/issues/10243)
179
+ return self.location
180
+ return None
181
+
182
+ @property
183
+ def installed_location(self) -> Optional[str]:
184
+ """The distribution's "installed" location.
185
+
186
+ This should generally be a ``site-packages`` directory. This is
187
+ usually ``dist.location``, except for legacy develop-installed packages,
188
+ where ``dist.location`` is the source code location, and this is where
189
+ the ``.egg-link`` file is.
190
+
191
+ The returned location is normalized (in particular, with symlinks removed).
192
+ """
193
+ raise NotImplementedError()
194
+
195
+ @property
196
+ def info_location(self) -> Optional[str]:
197
+ """Location of the .[egg|dist]-info directory or file.
198
+
199
+ Similarly to ``location``, a string value is not necessarily a
200
+ filesystem path. ``None`` means the distribution is created in-memory.
201
+
202
+ For a modern .dist-info installation on disk, this should be something
203
+ like ``{location}/{raw_name}-{version}.dist-info``.
204
+
205
+ Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If
206
+ this is a symbolic link, we want to preserve the relative path between
207
+ it and other files in the distribution.
208
+ """
209
+ raise NotImplementedError()
210
+
211
+ @property
212
+ def installed_by_distutils(self) -> bool:
213
+ """Whether this distribution is installed with legacy distutils format.
214
+
215
+ A distribution installed with "raw" distutils not patched by setuptools
216
+ uses one single file at ``info_location`` to store metadata. We need to
217
+ treat this specially on uninstallation.
218
+ """
219
+ info_location = self.info_location
220
+ if not info_location:
221
+ return False
222
+ return pathlib.Path(info_location).is_file()
223
+
224
+ @property
225
+ def installed_as_egg(self) -> bool:
226
+ """Whether this distribution is installed as an egg.
227
+
228
+ This usually indicates the distribution was installed by (older versions
229
+ of) easy_install.
230
+ """
231
+ location = self.location
232
+ if not location:
233
+ return False
234
+ # XXX if the distribution is a zipped egg, location has a trailing /
235
+ # so we resort to pathlib.Path to check the suffix in a reliable way.
236
+ return pathlib.Path(location).suffix == ".egg"
237
+
238
+ @property
239
+ def installed_with_setuptools_egg_info(self) -> bool:
240
+ """Whether this distribution is installed with the ``.egg-info`` format.
241
+
242
+ This usually indicates the distribution was installed with setuptools
243
+ with an old pip version or with ``single-version-externally-managed``.
244
+
245
+ Note that this ensure the metadata store is a directory. distutils can
246
+ also installs an ``.egg-info``, but as a file, not a directory. This
247
+ property is *False* for that case. Also see ``installed_by_distutils``.
248
+ """
249
+ info_location = self.info_location
250
+ if not info_location:
251
+ return False
252
+ if not info_location.endswith(".egg-info"):
253
+ return False
254
+ return pathlib.Path(info_location).is_dir()
255
+
256
+ @property
257
+ def installed_with_dist_info(self) -> bool:
258
+ """Whether this distribution is installed with the "modern format".
259
+
260
+ This indicates a "modern" installation, e.g. storing metadata in the
261
+ ``.dist-info`` directory. This applies to installations made by
262
+ setuptools (but through pip, not directly), or anything using the
263
+ standardized build backend interface (PEP 517).
264
+ """
265
+ info_location = self.info_location
266
+ if not info_location:
267
+ return False
268
+ if not info_location.endswith(".dist-info"):
269
+ return False
270
+ return pathlib.Path(info_location).is_dir()
271
+
272
+ @property
273
+ def canonical_name(self) -> NormalizedName:
274
+ raise NotImplementedError()
275
+
276
+ @property
277
+ def version(self) -> Version:
278
+ raise NotImplementedError()
279
+
280
+ @property
281
+ def raw_version(self) -> str:
282
+ raise NotImplementedError()
283
+
284
+ @property
285
+ def setuptools_filename(self) -> str:
286
+ """Convert a project name to its setuptools-compatible filename.
287
+
288
+ This is a copy of ``pkg_resources.to_filename()`` for compatibility.
289
+ """
290
+ return self.raw_name.replace("-", "_")
291
+
292
+ @property
293
+ def direct_url(self) -> Optional[DirectUrl]:
294
+ """Obtain a DirectUrl from this distribution.
295
+
296
+ Returns None if the distribution has no `direct_url.json` metadata,
297
+ or if `direct_url.json` is invalid.
298
+ """
299
+ try:
300
+ content = self.read_text(DIRECT_URL_METADATA_NAME)
301
+ except FileNotFoundError:
302
+ return None
303
+ try:
304
+ return DirectUrl.from_json(content)
305
+ except (
306
+ UnicodeDecodeError,
307
+ json.JSONDecodeError,
308
+ DirectUrlValidationError,
309
+ ) as e:
310
+ logger.warning(
311
+ "Error parsing %s for %s: %s",
312
+ DIRECT_URL_METADATA_NAME,
313
+ self.canonical_name,
314
+ e,
315
+ )
316
+ return None
317
+
318
+ @property
319
+ def installer(self) -> str:
320
+ try:
321
+ installer_text = self.read_text("INSTALLER")
322
+ except (OSError, ValueError, NoneMetadataError):
323
+ return "" # Fail silently if the installer file cannot be read.
324
+ for line in installer_text.splitlines():
325
+ cleaned_line = line.strip()
326
+ if cleaned_line:
327
+ return cleaned_line
328
+ return ""
329
+
330
+ @property
331
+ def requested(self) -> bool:
332
+ return self.is_file("REQUESTED")
333
+
334
+ @property
335
+ def editable(self) -> bool:
336
+ return bool(self.editable_project_location)
337
+
338
+ @property
339
+ def local(self) -> bool:
340
+ """If distribution is installed in the current virtual environment.
341
+
342
+ Always True if we're not in a virtualenv.
343
+ """
344
+ if self.installed_location is None:
345
+ return False
346
+ return is_local(self.installed_location)
347
+
348
+ @property
349
+ def in_usersite(self) -> bool:
350
+ if self.installed_location is None or user_site is None:
351
+ return False
352
+ return self.installed_location.startswith(normalize_path(user_site))
353
+
354
+ @property
355
+ def in_site_packages(self) -> bool:
356
+ if self.installed_location is None or site_packages is None:
357
+ return False
358
+ return self.installed_location.startswith(normalize_path(site_packages))
359
+
360
+ def is_file(self, path: InfoPath) -> bool:
361
+ """Check whether an entry in the info directory is a file."""
362
+ raise NotImplementedError()
363
+
364
+ def iter_distutils_script_names(self) -> Iterator[str]:
365
+ """Find distutils 'scripts' entries metadata.
366
+
367
+ If 'scripts' is supplied in ``setup.py``, distutils records those in the
368
+ installed distribution's ``scripts`` directory, a file for each script.
369
+ """
370
+ raise NotImplementedError()
371
+
372
+ def read_text(self, path: InfoPath) -> str:
373
+ """Read a file in the info directory.
374
+
375
+ :raise FileNotFoundError: If ``path`` does not exist in the directory.
376
+ :raise NoneMetadataError: If ``path`` exists in the info directory, but
377
+ cannot be read.
378
+ """
379
+ raise NotImplementedError()
380
+
381
+ def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
382
+ raise NotImplementedError()
383
+
384
+ def _metadata_impl(self) -> email.message.Message:
385
+ raise NotImplementedError()
386
+
387
+ @functools.cached_property
388
+ def metadata(self) -> email.message.Message:
389
+ """Metadata of distribution parsed from e.g. METADATA or PKG-INFO.
390
+
391
+ This should return an empty message if the metadata file is unavailable.
392
+
393
+ :raises NoneMetadataError: If the metadata file is available, but does
394
+ not contain valid metadata.
395
+ """
396
+ metadata = self._metadata_impl()
397
+ self._add_egg_info_requires(metadata)
398
+ return metadata
399
+
400
+ @property
401
+ def metadata_dict(self) -> Dict[str, Any]:
402
+ """PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO.
403
+
404
+ This should return an empty dict if the metadata file is unavailable.
405
+
406
+ :raises NoneMetadataError: If the metadata file is available, but does
407
+ not contain valid metadata.
408
+ """
409
+ return msg_to_json(self.metadata)
410
+
411
+ @property
412
+ def metadata_version(self) -> Optional[str]:
413
+ """Value of "Metadata-Version:" in distribution metadata, if available."""
414
+ return self.metadata.get("Metadata-Version")
415
+
416
+ @property
417
+ def raw_name(self) -> str:
418
+ """Value of "Name:" in distribution metadata."""
419
+ # The metadata should NEVER be missing the Name: key, but if it somehow
420
+ # does, fall back to the known canonical name.
421
+ return self.metadata.get("Name", self.canonical_name)
422
+
423
+ @property
424
+ def requires_python(self) -> SpecifierSet:
425
+ """Value of "Requires-Python:" in distribution metadata.
426
+
427
+ If the key does not exist or contains an invalid value, an empty
428
+ SpecifierSet should be returned.
429
+ """
430
+ value = self.metadata.get("Requires-Python")
431
+ if value is None:
432
+ return SpecifierSet()
433
+ try:
434
+ # Convert to str to satisfy the type checker; this can be a Header object.
435
+ spec = SpecifierSet(str(value))
436
+ except InvalidSpecifier as e:
437
+ message = "Package %r has an invalid Requires-Python: %s"
438
+ logger.warning(message, self.raw_name, e)
439
+ return SpecifierSet()
440
+ return spec
441
+
442
+ def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
443
+ """Dependencies of this distribution.
444
+
445
+ For modern .dist-info distributions, this is the collection of
446
+ "Requires-Dist:" entries in distribution metadata.
447
+ """
448
+ raise NotImplementedError()
449
+
450
+ def iter_raw_dependencies(self) -> Iterable[str]:
451
+ """Raw Requires-Dist metadata."""
452
+ return self.metadata.get_all("Requires-Dist", [])
453
+
454
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
455
+ """Extras provided by this distribution.
456
+
457
+ For modern .dist-info distributions, this is the collection of
458
+ "Provides-Extra:" entries in distribution metadata.
459
+
460
+ The return value of this function is expected to be normalised names,
461
+ per PEP 685, with the returned value being handled appropriately by
462
+ `iter_dependencies`.
463
+ """
464
+ raise NotImplementedError()
465
+
466
+ def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]:
467
+ try:
468
+ text = self.read_text("RECORD")
469
+ except FileNotFoundError:
470
+ return None
471
+ # This extra Path-str cast normalizes entries.
472
+ return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines()))
473
+
474
+ def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]:
475
+ try:
476
+ text = self.read_text("installed-files.txt")
477
+ except FileNotFoundError:
478
+ return None
479
+ paths = (p for p in text.splitlines(keepends=False) if p)
480
+ root = self.location
481
+ info = self.info_location
482
+ if root is None or info is None:
483
+ return paths
484
+ try:
485
+ info_rel = pathlib.Path(info).relative_to(root)
486
+ except ValueError: # info is not relative to root.
487
+ return paths
488
+ if not info_rel.parts: # info *is* root.
489
+ return paths
490
+ return (
491
+ _convert_installed_files_path(pathlib.Path(p).parts, info_rel.parts)
492
+ for p in paths
493
+ )
494
+
495
+ def iter_declared_entries(self) -> Optional[Iterator[str]]:
496
+ """Iterate through file entries declared in this distribution.
497
+
498
+ For modern .dist-info distributions, this is the files listed in the
499
+ ``RECORD`` metadata file. For legacy setuptools distributions, this
500
+ comes from ``installed-files.txt``, with entries normalized to be
501
+ compatible with the format used by ``RECORD``.
502
+
503
+ :return: An iterator for listed entries, or None if the distribution
504
+ contains neither ``RECORD`` nor ``installed-files.txt``.
505
+ """
506
+ return (
507
+ self._iter_declared_entries_from_record()
508
+ or self._iter_declared_entries_from_legacy()
509
+ )
510
+
511
+ def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]:
512
+ """Parse a ``requires.txt`` in an egg-info directory.
513
+
514
+ This is an INI-ish format where an egg-info stores dependencies. A
515
+ section name describes extra other environment markers, while each entry
516
+ is an arbitrary string (not a key-value pair) representing a dependency
517
+ as a requirement string (no markers).
518
+
519
+ There is a construct in ``importlib.metadata`` called ``Sectioned`` that
520
+ does mostly the same, but the format is currently considered private.
521
+ """
522
+ try:
523
+ content = self.read_text("requires.txt")
524
+ except FileNotFoundError:
525
+ return
526
+ extra = marker = "" # Section-less entries don't have markers.
527
+ for line in content.splitlines():
528
+ line = line.strip()
529
+ if not line or line.startswith("#"): # Comment; ignored.
530
+ continue
531
+ if line.startswith("[") and line.endswith("]"): # A section header.
532
+ extra, _, marker = line.strip("[]").partition(":")
533
+ continue
534
+ yield RequiresEntry(requirement=line, extra=extra, marker=marker)
535
+
536
+ def _iter_egg_info_extras(self) -> Iterable[str]:
537
+ """Get extras from the egg-info directory."""
538
+ known_extras = {""}
539
+ for entry in self._iter_requires_txt_entries():
540
+ extra = canonicalize_name(entry.extra)
541
+ if extra in known_extras:
542
+ continue
543
+ known_extras.add(extra)
544
+ yield extra
545
+
546
+ def _iter_egg_info_dependencies(self) -> Iterable[str]:
547
+ """Get distribution dependencies from the egg-info directory.
548
+
549
+ To ease parsing, this converts a legacy dependency entry into a PEP 508
550
+ requirement string. Like ``_iter_requires_txt_entries()``, there is code
551
+ in ``importlib.metadata`` that does mostly the same, but not do exactly
552
+ what we need.
553
+
554
+ Namely, ``importlib.metadata`` does not normalize the extra name before
555
+ putting it into the requirement string, which causes marker comparison
556
+ to fail because the dist-info format do normalize. This is consistent in
557
+ all currently available PEP 517 backends, although not standardized.
558
+ """
559
+ for entry in self._iter_requires_txt_entries():
560
+ extra = canonicalize_name(entry.extra)
561
+ if extra and entry.marker:
562
+ marker = f'({entry.marker}) and extra == "{extra}"'
563
+ elif extra:
564
+ marker = f'extra == "{extra}"'
565
+ elif entry.marker:
566
+ marker = entry.marker
567
+ else:
568
+ marker = ""
569
+ if marker:
570
+ yield f"{entry.requirement} ; {marker}"
571
+ else:
572
+ yield entry.requirement
573
+
574
+ def _add_egg_info_requires(self, metadata: email.message.Message) -> None:
575
+ """Add egg-info requires.txt information to the metadata."""
576
+ if not metadata.get_all("Requires-Dist"):
577
+ for dep in self._iter_egg_info_dependencies():
578
+ metadata["Requires-Dist"] = dep
579
+ if not metadata.get_all("Provides-Extra"):
580
+ for extra in self._iter_egg_info_extras():
581
+ metadata["Provides-Extra"] = extra
582
+
583
+
584
+ class BaseEnvironment:
585
+ """An environment containing distributions to introspect."""
586
+
587
+ @classmethod
588
+ def default(cls) -> "BaseEnvironment":
589
+ raise NotImplementedError()
590
+
591
+ @classmethod
592
+ def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment":
593
+ raise NotImplementedError()
594
+
595
+ def get_distribution(self, name: str) -> Optional["BaseDistribution"]:
596
+ """Given a requirement name, return the installed distributions.
597
+
598
+ The name may not be normalized. The implementation must canonicalize
599
+ it for lookup.
600
+ """
601
+ raise NotImplementedError()
602
+
603
+ def _iter_distributions(self) -> Iterator["BaseDistribution"]:
604
+ """Iterate through installed distributions.
605
+
606
+ This function should be implemented by subclass, but never called
607
+ directly. Use the public ``iter_distribution()`` instead, which
608
+ implements additional logic to make sure the distributions are valid.
609
+ """
610
+ raise NotImplementedError()
611
+
612
+ def iter_all_distributions(self) -> Iterator[BaseDistribution]:
613
+ """Iterate through all installed distributions without any filtering."""
614
+ for dist in self._iter_distributions():
615
+ # Make sure the distribution actually comes from a valid Python
616
+ # packaging distribution. Pip's AdjacentTempDirectory leaves folders
617
+ # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The
618
+ # valid project name pattern is taken from PEP 508.
619
+ project_name_valid = re.match(
620
+ r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$",
621
+ dist.canonical_name,
622
+ flags=re.IGNORECASE,
623
+ )
624
+ if not project_name_valid:
625
+ logger.warning(
626
+ "Ignoring invalid distribution %s (%s)",
627
+ dist.canonical_name,
628
+ dist.location,
629
+ )
630
+ continue
631
+ yield dist
632
+
633
+ def iter_installed_distributions(
634
+ self,
635
+ local_only: bool = True,
636
+ skip: Container[str] = stdlib_pkgs,
637
+ include_editables: bool = True,
638
+ editables_only: bool = False,
639
+ user_only: bool = False,
640
+ ) -> Iterator[BaseDistribution]:
641
+ """Return a list of installed distributions.
642
+
643
+ This is based on ``iter_all_distributions()`` with additional filtering
644
+ options. Note that ``iter_installed_distributions()`` without arguments
645
+ is *not* equal to ``iter_all_distributions()``, since some of the
646
+ configurations exclude packages by default.
647
+
648
+ :param local_only: If True (default), only return installations
649
+ local to the current virtualenv, if in a virtualenv.
650
+ :param skip: An iterable of canonicalized project names to ignore;
651
+ defaults to ``stdlib_pkgs``.
652
+ :param include_editables: If False, don't report editables.
653
+ :param editables_only: If True, only report editables.
654
+ :param user_only: If True, only report installations in the user
655
+ site directory.
656
+ """
657
+ it = self.iter_all_distributions()
658
+ if local_only:
659
+ it = (d for d in it if d.local)
660
+ if not include_editables:
661
+ it = (d for d in it if not d.editable)
662
+ if editables_only:
663
+ it = (d for d in it if d.editable)
664
+ if user_only:
665
+ it = (d for d in it if d.in_usersite)
666
+ return (d for d in it if d.canonical_name not in skip)
667
+
668
+
669
+ class Wheel(Protocol):
670
+ location: str
671
+
672
+ def as_zipfile(self) -> zipfile.ZipFile:
673
+ raise NotImplementedError()
674
+
675
+
676
+ class FilesystemWheel(Wheel):
677
+ def __init__(self, location: str) -> None:
678
+ self.location = location
679
+
680
+ def as_zipfile(self) -> zipfile.ZipFile:
681
+ return zipfile.ZipFile(self.location, allowZip64=True)
682
+
683
+
684
+ class MemoryWheel(Wheel):
685
+ def __init__(self, location: str, stream: IO[bytes]) -> None:
686
+ self.location = location
687
+ self.stream = stream
688
+
689
+ def as_zipfile(self) -> zipfile.ZipFile:
690
+ return zipfile.ZipFile(self.stream, allowZip64=True)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__init__.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ from ._dists import Distribution
2
+ from ._envs import Environment
3
+
4
+ __all__ = ["NAME", "Distribution", "Environment"]
5
+
6
+ NAME = "importlib"
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (358 Bytes). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc ADDED
Binary file (3.51 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc ADDED
Binary file (8.86 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc ADDED
Binary file (5.76 kB). View file
 
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_compat.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib.metadata
2
+ import os
3
+ from typing import Any, Optional, Protocol, Tuple, cast
4
+
5
+ from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
6
+
7
+
8
+ class BadMetadata(ValueError):
9
+ def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None:
10
+ self.dist = dist
11
+ self.reason = reason
12
+
13
+ def __str__(self) -> str:
14
+ return f"Bad metadata in {self.dist} ({self.reason})"
15
+
16
+
17
+ class BasePath(Protocol):
18
+ """A protocol that various path objects conform.
19
+
20
+ This exists because importlib.metadata uses both ``pathlib.Path`` and
21
+ ``zipfile.Path``, and we need a common base for type hints (Union does not
22
+ work well since ``zipfile.Path`` is too new for our linter setup).
23
+
24
+ This does not mean to be exhaustive, but only contains things that present
25
+ in both classes *that we need*.
26
+ """
27
+
28
+ @property
29
+ def name(self) -> str:
30
+ raise NotImplementedError()
31
+
32
+ @property
33
+ def parent(self) -> "BasePath":
34
+ raise NotImplementedError()
35
+
36
+
37
+ def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]:
38
+ """Find the path to the distribution's metadata directory.
39
+
40
+ HACK: This relies on importlib.metadata's private ``_path`` attribute. Not
41
+ all distributions exist on disk, so importlib.metadata is correct to not
42
+ expose the attribute as public. But pip's code base is old and not as clean,
43
+ so we do this to avoid having to rewrite too many things. Hopefully we can
44
+ eliminate this some day.
45
+ """
46
+ return getattr(d, "_path", None)
47
+
48
+
49
+ def parse_name_and_version_from_info_directory(
50
+ dist: importlib.metadata.Distribution,
51
+ ) -> Tuple[Optional[str], Optional[str]]:
52
+ """Get a name and version from the metadata directory name.
53
+
54
+ This is much faster than reading distribution metadata.
55
+ """
56
+ info_location = get_info_location(dist)
57
+ if info_location is None:
58
+ return None, None
59
+
60
+ stem, suffix = os.path.splitext(info_location.name)
61
+ if suffix == ".dist-info":
62
+ name, sep, version = stem.partition("-")
63
+ if sep:
64
+ return name, version
65
+
66
+ if suffix == ".egg-info":
67
+ name = stem.split("-", 1)[0]
68
+ return name, None
69
+
70
+ return None, None
71
+
72
+
73
+ def get_dist_canonical_name(dist: importlib.metadata.Distribution) -> NormalizedName:
74
+ """Get the distribution's normalized name.
75
+
76
+ The ``name`` attribute is only available in Python 3.10 or later. We are
77
+ targeting exactly that, but Mypy does not know this.
78
+ """
79
+ if name := parse_name_and_version_from_info_directory(dist)[0]:
80
+ return canonicalize_name(name)
81
+
82
+ name = cast(Any, dist).name
83
+ if not isinstance(name, str):
84
+ raise BadMetadata(dist, reason="invalid metadata entry 'name'")
85
+ return canonicalize_name(name)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_dists.py ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import email.message
2
+ import importlib.metadata
3
+ import pathlib
4
+ import zipfile
5
+ from os import PathLike
6
+ from typing import (
7
+ Collection,
8
+ Dict,
9
+ Iterable,
10
+ Iterator,
11
+ Mapping,
12
+ Optional,
13
+ Sequence,
14
+ Union,
15
+ cast,
16
+ )
17
+
18
+ from pip._vendor.packaging.requirements import Requirement
19
+ from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
20
+ from pip._vendor.packaging.version import Version
21
+ from pip._vendor.packaging.version import parse as parse_version
22
+
23
+ from pip._internal.exceptions import InvalidWheel, UnsupportedWheel
24
+ from pip._internal.metadata.base import (
25
+ BaseDistribution,
26
+ BaseEntryPoint,
27
+ InfoPath,
28
+ Wheel,
29
+ )
30
+ from pip._internal.utils.misc import normalize_path
31
+ from pip._internal.utils.packaging import get_requirement
32
+ from pip._internal.utils.temp_dir import TempDirectory
33
+ from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
34
+
35
+ from ._compat import (
36
+ BasePath,
37
+ get_dist_canonical_name,
38
+ parse_name_and_version_from_info_directory,
39
+ )
40
+
41
+
42
+ class WheelDistribution(importlib.metadata.Distribution):
43
+ """An ``importlib.metadata.Distribution`` read from a wheel.
44
+
45
+ Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``,
46
+ its implementation is too "lazy" for pip's needs (we can't keep the ZipFile
47
+ handle open for the entire lifetime of the distribution object).
48
+
49
+ This implementation eagerly reads the entire metadata directory into the
50
+ memory instead, and operates from that.
51
+ """
52
+
53
+ def __init__(
54
+ self,
55
+ files: Mapping[pathlib.PurePosixPath, bytes],
56
+ info_location: pathlib.PurePosixPath,
57
+ ) -> None:
58
+ self._files = files
59
+ self.info_location = info_location
60
+
61
+ @classmethod
62
+ def from_zipfile(
63
+ cls,
64
+ zf: zipfile.ZipFile,
65
+ name: str,
66
+ location: str,
67
+ ) -> "WheelDistribution":
68
+ info_dir, _ = parse_wheel(zf, name)
69
+ paths = (
70
+ (name, pathlib.PurePosixPath(name.split("/", 1)[-1]))
71
+ for name in zf.namelist()
72
+ if name.startswith(f"{info_dir}/")
73
+ )
74
+ files = {
75
+ relpath: read_wheel_metadata_file(zf, fullpath)
76
+ for fullpath, relpath in paths
77
+ }
78
+ info_location = pathlib.PurePosixPath(location, info_dir)
79
+ return cls(files, info_location)
80
+
81
+ def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]:
82
+ # Only allow iterating through the metadata directory.
83
+ if pathlib.PurePosixPath(str(path)) in self._files:
84
+ return iter(self._files)
85
+ raise FileNotFoundError(path)
86
+
87
+ def read_text(self, filename: str) -> Optional[str]:
88
+ try:
89
+ data = self._files[pathlib.PurePosixPath(filename)]
90
+ except KeyError:
91
+ return None
92
+ try:
93
+ text = data.decode("utf-8")
94
+ except UnicodeDecodeError as e:
95
+ wheel = self.info_location.parent
96
+ error = f"Error decoding metadata for {wheel}: {e} in {filename} file"
97
+ raise UnsupportedWheel(error)
98
+ return text
99
+
100
+ def locate_file(self, path: Union[str, "PathLike[str]"]) -> pathlib.Path:
101
+ # This method doesn't make sense for our in-memory wheel, but the API
102
+ # requires us to define it.
103
+ raise NotImplementedError
104
+
105
+
106
+ class Distribution(BaseDistribution):
107
+ def __init__(
108
+ self,
109
+ dist: importlib.metadata.Distribution,
110
+ info_location: Optional[BasePath],
111
+ installed_location: Optional[BasePath],
112
+ ) -> None:
113
+ self._dist = dist
114
+ self._info_location = info_location
115
+ self._installed_location = installed_location
116
+
117
+ @classmethod
118
+ def from_directory(cls, directory: str) -> BaseDistribution:
119
+ info_location = pathlib.Path(directory)
120
+ dist = importlib.metadata.Distribution.at(info_location)
121
+ return cls(dist, info_location, info_location.parent)
122
+
123
+ @classmethod
124
+ def from_metadata_file_contents(
125
+ cls,
126
+ metadata_contents: bytes,
127
+ filename: str,
128
+ project_name: str,
129
+ ) -> BaseDistribution:
130
+ # Generate temp dir to contain the metadata file, and write the file contents.
131
+ temp_dir = pathlib.Path(
132
+ TempDirectory(kind="metadata", globally_managed=True).path
133
+ )
134
+ metadata_path = temp_dir / "METADATA"
135
+ metadata_path.write_bytes(metadata_contents)
136
+ # Construct dist pointing to the newly created directory.
137
+ dist = importlib.metadata.Distribution.at(metadata_path.parent)
138
+ return cls(dist, metadata_path.parent, None)
139
+
140
+ @classmethod
141
+ def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
142
+ try:
143
+ with wheel.as_zipfile() as zf:
144
+ dist = WheelDistribution.from_zipfile(zf, name, wheel.location)
145
+ except zipfile.BadZipFile as e:
146
+ raise InvalidWheel(wheel.location, name) from e
147
+ return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location))
148
+
149
+ @property
150
+ def location(self) -> Optional[str]:
151
+ if self._info_location is None:
152
+ return None
153
+ return str(self._info_location.parent)
154
+
155
+ @property
156
+ def info_location(self) -> Optional[str]:
157
+ if self._info_location is None:
158
+ return None
159
+ return str(self._info_location)
160
+
161
+ @property
162
+ def installed_location(self) -> Optional[str]:
163
+ if self._installed_location is None:
164
+ return None
165
+ return normalize_path(str(self._installed_location))
166
+
167
+ @property
168
+ def canonical_name(self) -> NormalizedName:
169
+ return get_dist_canonical_name(self._dist)
170
+
171
+ @property
172
+ def version(self) -> Version:
173
+ if version := parse_name_and_version_from_info_directory(self._dist)[1]:
174
+ return parse_version(version)
175
+ return parse_version(self._dist.version)
176
+
177
+ @property
178
+ def raw_version(self) -> str:
179
+ return self._dist.version
180
+
181
+ def is_file(self, path: InfoPath) -> bool:
182
+ return self._dist.read_text(str(path)) is not None
183
+
184
+ def iter_distutils_script_names(self) -> Iterator[str]:
185
+ # A distutils installation is always "flat" (not in e.g. egg form), so
186
+ # if this distribution's info location is NOT a pathlib.Path (but e.g.
187
+ # zipfile.Path), it can never contain any distutils scripts.
188
+ if not isinstance(self._info_location, pathlib.Path):
189
+ return
190
+ for child in self._info_location.joinpath("scripts").iterdir():
191
+ yield child.name
192
+
193
+ def read_text(self, path: InfoPath) -> str:
194
+ content = self._dist.read_text(str(path))
195
+ if content is None:
196
+ raise FileNotFoundError(path)
197
+ return content
198
+
199
+ def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
200
+ # importlib.metadata's EntryPoint structure satisfies BaseEntryPoint.
201
+ return self._dist.entry_points
202
+
203
+ def _metadata_impl(self) -> email.message.Message:
204
+ # From Python 3.10+, importlib.metadata declares PackageMetadata as the
205
+ # return type. This protocol is unfortunately a disaster now and misses
206
+ # a ton of fields that we need, including get() and get_payload(). We
207
+ # rely on the implementation that the object is actually a Message now,
208
+ # until upstream can improve the protocol. (python/cpython#94952)
209
+ return cast(email.message.Message, self._dist.metadata)
210
+
211
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
212
+ return [
213
+ canonicalize_name(extra)
214
+ for extra in self.metadata.get_all("Provides-Extra", [])
215
+ ]
216
+
217
+ def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
218
+ contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras]
219
+ for req_string in self.metadata.get_all("Requires-Dist", []):
220
+ # strip() because email.message.Message.get_all() may return a leading \n
221
+ # in case a long header was wrapped.
222
+ req = get_requirement(req_string.strip())
223
+ if not req.marker:
224
+ yield req
225
+ elif not extras and req.marker.evaluate({"extra": ""}):
226
+ yield req
227
+ elif any(req.marker.evaluate(context) for context in contexts):
228
+ yield req
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_envs.py ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib.metadata
2
+ import logging
3
+ import os
4
+ import pathlib
5
+ import sys
6
+ import zipfile
7
+ from typing import Iterator, List, Optional, Sequence, Set, Tuple
8
+
9
+ from pip._vendor.packaging.utils import (
10
+ InvalidWheelFilename,
11
+ NormalizedName,
12
+ canonicalize_name,
13
+ parse_wheel_filename,
14
+ )
15
+
16
+ from pip._internal.metadata.base import BaseDistribution, BaseEnvironment
17
+ from pip._internal.utils.filetypes import WHEEL_EXTENSION
18
+
19
+ from ._compat import BadMetadata, BasePath, get_dist_canonical_name, get_info_location
20
+ from ._dists import Distribution
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ def _looks_like_wheel(location: str) -> bool:
26
+ if not location.endswith(WHEEL_EXTENSION):
27
+ return False
28
+ if not os.path.isfile(location):
29
+ return False
30
+ try:
31
+ parse_wheel_filename(os.path.basename(location))
32
+ except InvalidWheelFilename:
33
+ return False
34
+ return zipfile.is_zipfile(location)
35
+
36
+
37
+ class _DistributionFinder:
38
+ """Finder to locate distributions.
39
+
40
+ The main purpose of this class is to memoize found distributions' names, so
41
+ only one distribution is returned for each package name. At lot of pip code
42
+ assumes this (because it is setuptools's behavior), and not doing the same
43
+ can potentially cause a distribution in lower precedence path to override a
44
+ higher precedence one if the caller is not careful.
45
+
46
+ Eventually we probably want to make it possible to see lower precedence
47
+ installations as well. It's useful feature, after all.
48
+ """
49
+
50
+ FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]]
51
+
52
+ def __init__(self) -> None:
53
+ self._found_names: Set[NormalizedName] = set()
54
+
55
+ def _find_impl(self, location: str) -> Iterator[FoundResult]:
56
+ """Find distributions in a location."""
57
+ # Skip looking inside a wheel. Since a package inside a wheel is not
58
+ # always valid (due to .data directories etc.), its .dist-info entry
59
+ # should not be considered an installed distribution.
60
+ if _looks_like_wheel(location):
61
+ return
62
+ # To know exactly where we find a distribution, we have to feed in the
63
+ # paths one by one, instead of dumping the list to importlib.metadata.
64
+ for dist in importlib.metadata.distributions(path=[location]):
65
+ info_location = get_info_location(dist)
66
+ try:
67
+ name = get_dist_canonical_name(dist)
68
+ except BadMetadata as e:
69
+ logger.warning("Skipping %s due to %s", info_location, e.reason)
70
+ continue
71
+ if name in self._found_names:
72
+ continue
73
+ self._found_names.add(name)
74
+ yield dist, info_location
75
+
76
+ def find(self, location: str) -> Iterator[BaseDistribution]:
77
+ """Find distributions in a location.
78
+
79
+ The path can be either a directory, or a ZIP archive.
80
+ """
81
+ for dist, info_location in self._find_impl(location):
82
+ if info_location is None:
83
+ installed_location: Optional[BasePath] = None
84
+ else:
85
+ installed_location = info_location.parent
86
+ yield Distribution(dist, info_location, installed_location)
87
+
88
+ def find_legacy_editables(self, location: str) -> Iterator[BaseDistribution]:
89
+ """Read location in egg-link files and return distributions in there.
90
+
91
+ The path should be a directory; otherwise this returns nothing. This
92
+ follows how setuptools does this for compatibility. The first non-empty
93
+ line in the egg-link is read as a path (resolved against the egg-link's
94
+ containing directory if relative). Distributions found at that linked
95
+ location are returned.
96
+ """
97
+ path = pathlib.Path(location)
98
+ if not path.is_dir():
99
+ return
100
+ for child in path.iterdir():
101
+ if child.suffix != ".egg-link":
102
+ continue
103
+ with child.open() as f:
104
+ lines = (line.strip() for line in f)
105
+ target_rel = next((line for line in lines if line), "")
106
+ if not target_rel:
107
+ continue
108
+ target_location = str(path.joinpath(target_rel))
109
+ for dist, info_location in self._find_impl(target_location):
110
+ yield Distribution(dist, info_location, path)
111
+
112
+
113
+ class Environment(BaseEnvironment):
114
+ def __init__(self, paths: Sequence[str]) -> None:
115
+ self._paths = paths
116
+
117
+ @classmethod
118
+ def default(cls) -> BaseEnvironment:
119
+ return cls(sys.path)
120
+
121
+ @classmethod
122
+ def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment:
123
+ if paths is None:
124
+ return cls(sys.path)
125
+ return cls(paths)
126
+
127
+ def _iter_distributions(self) -> Iterator[BaseDistribution]:
128
+ finder = _DistributionFinder()
129
+ for location in self._paths:
130
+ yield from finder.find(location)
131
+ yield from finder.find_legacy_editables(location)
132
+
133
+ def get_distribution(self, name: str) -> Optional[BaseDistribution]:
134
+ canonical_name = canonicalize_name(name)
135
+ matches = (
136
+ distribution
137
+ for distribution in self.iter_all_distributions()
138
+ if distribution.canonical_name == canonical_name
139
+ )
140
+ return next(matches, None)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py ADDED
@@ -0,0 +1,301 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import email.message
2
+ import email.parser
3
+ import logging
4
+ import os
5
+ import zipfile
6
+ from typing import (
7
+ Collection,
8
+ Iterable,
9
+ Iterator,
10
+ List,
11
+ Mapping,
12
+ NamedTuple,
13
+ Optional,
14
+ )
15
+
16
+ from pip._vendor import pkg_resources
17
+ from pip._vendor.packaging.requirements import Requirement
18
+ from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
19
+ from pip._vendor.packaging.version import Version
20
+ from pip._vendor.packaging.version import parse as parse_version
21
+
22
+ from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel
23
+ from pip._internal.utils.egg_link import egg_link_path_from_location
24
+ from pip._internal.utils.misc import display_path, normalize_path
25
+ from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
26
+
27
+ from .base import (
28
+ BaseDistribution,
29
+ BaseEntryPoint,
30
+ BaseEnvironment,
31
+ InfoPath,
32
+ Wheel,
33
+ )
34
+
35
+ __all__ = ["NAME", "Distribution", "Environment"]
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+ NAME = "pkg_resources"
40
+
41
+
42
+ class EntryPoint(NamedTuple):
43
+ name: str
44
+ value: str
45
+ group: str
46
+
47
+
48
+ class InMemoryMetadata:
49
+ """IMetadataProvider that reads metadata files from a dictionary.
50
+
51
+ This also maps metadata decoding exceptions to our internal exception type.
52
+ """
53
+
54
+ def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> None:
55
+ self._metadata = metadata
56
+ self._wheel_name = wheel_name
57
+
58
+ def has_metadata(self, name: str) -> bool:
59
+ return name in self._metadata
60
+
61
+ def get_metadata(self, name: str) -> str:
62
+ try:
63
+ return self._metadata[name].decode()
64
+ except UnicodeDecodeError as e:
65
+ # Augment the default error with the origin of the file.
66
+ raise UnsupportedWheel(
67
+ f"Error decoding metadata for {self._wheel_name}: {e} in {name} file"
68
+ )
69
+
70
+ def get_metadata_lines(self, name: str) -> Iterable[str]:
71
+ return pkg_resources.yield_lines(self.get_metadata(name))
72
+
73
+ def metadata_isdir(self, name: str) -> bool:
74
+ return False
75
+
76
+ def metadata_listdir(self, name: str) -> List[str]:
77
+ return []
78
+
79
+ def run_script(self, script_name: str, namespace: str) -> None:
80
+ pass
81
+
82
+
83
+ class Distribution(BaseDistribution):
84
+ def __init__(self, dist: pkg_resources.Distribution) -> None:
85
+ self._dist = dist
86
+ # This is populated lazily, to avoid loading metadata for all possible
87
+ # distributions eagerly.
88
+ self.__extra_mapping: Optional[Mapping[NormalizedName, str]] = None
89
+
90
+ @property
91
+ def _extra_mapping(self) -> Mapping[NormalizedName, str]:
92
+ if self.__extra_mapping is None:
93
+ self.__extra_mapping = {
94
+ canonicalize_name(extra): extra for extra in self._dist.extras
95
+ }
96
+
97
+ return self.__extra_mapping
98
+
99
+ @classmethod
100
+ def from_directory(cls, directory: str) -> BaseDistribution:
101
+ dist_dir = directory.rstrip(os.sep)
102
+
103
+ # Build a PathMetadata object, from path to metadata. :wink:
104
+ base_dir, dist_dir_name = os.path.split(dist_dir)
105
+ metadata = pkg_resources.PathMetadata(base_dir, dist_dir)
106
+
107
+ # Determine the correct Distribution object type.
108
+ if dist_dir.endswith(".egg-info"):
109
+ dist_cls = pkg_resources.Distribution
110
+ dist_name = os.path.splitext(dist_dir_name)[0]
111
+ else:
112
+ assert dist_dir.endswith(".dist-info")
113
+ dist_cls = pkg_resources.DistInfoDistribution
114
+ dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0]
115
+
116
+ dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata)
117
+ return cls(dist)
118
+
119
+ @classmethod
120
+ def from_metadata_file_contents(
121
+ cls,
122
+ metadata_contents: bytes,
123
+ filename: str,
124
+ project_name: str,
125
+ ) -> BaseDistribution:
126
+ metadata_dict = {
127
+ "METADATA": metadata_contents,
128
+ }
129
+ dist = pkg_resources.DistInfoDistribution(
130
+ location=filename,
131
+ metadata=InMemoryMetadata(metadata_dict, filename),
132
+ project_name=project_name,
133
+ )
134
+ return cls(dist)
135
+
136
+ @classmethod
137
+ def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
138
+ try:
139
+ with wheel.as_zipfile() as zf:
140
+ info_dir, _ = parse_wheel(zf, name)
141
+ metadata_dict = {
142
+ path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path)
143
+ for path in zf.namelist()
144
+ if path.startswith(f"{info_dir}/")
145
+ }
146
+ except zipfile.BadZipFile as e:
147
+ raise InvalidWheel(wheel.location, name) from e
148
+ except UnsupportedWheel as e:
149
+ raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
150
+ dist = pkg_resources.DistInfoDistribution(
151
+ location=wheel.location,
152
+ metadata=InMemoryMetadata(metadata_dict, wheel.location),
153
+ project_name=name,
154
+ )
155
+ return cls(dist)
156
+
157
+ @property
158
+ def location(self) -> Optional[str]:
159
+ return self._dist.location
160
+
161
+ @property
162
+ def installed_location(self) -> Optional[str]:
163
+ egg_link = egg_link_path_from_location(self.raw_name)
164
+ if egg_link:
165
+ location = egg_link
166
+ elif self.location:
167
+ location = self.location
168
+ else:
169
+ return None
170
+ return normalize_path(location)
171
+
172
+ @property
173
+ def info_location(self) -> Optional[str]:
174
+ return self._dist.egg_info
175
+
176
+ @property
177
+ def installed_by_distutils(self) -> bool:
178
+ # A distutils-installed distribution is provided by FileMetadata. This
179
+ # provider has a "path" attribute not present anywhere else. Not the
180
+ # best introspection logic, but pip has been doing this for a long time.
181
+ try:
182
+ return bool(self._dist._provider.path)
183
+ except AttributeError:
184
+ return False
185
+
186
+ @property
187
+ def canonical_name(self) -> NormalizedName:
188
+ return canonicalize_name(self._dist.project_name)
189
+
190
+ @property
191
+ def version(self) -> Version:
192
+ return parse_version(self._dist.version)
193
+
194
+ @property
195
+ def raw_version(self) -> str:
196
+ return self._dist.version
197
+
198
+ def is_file(self, path: InfoPath) -> bool:
199
+ return self._dist.has_metadata(str(path))
200
+
201
+ def iter_distutils_script_names(self) -> Iterator[str]:
202
+ yield from self._dist.metadata_listdir("scripts")
203
+
204
+ def read_text(self, path: InfoPath) -> str:
205
+ name = str(path)
206
+ if not self._dist.has_metadata(name):
207
+ raise FileNotFoundError(name)
208
+ content = self._dist.get_metadata(name)
209
+ if content is None:
210
+ raise NoneMetadataError(self, name)
211
+ return content
212
+
213
+ def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
214
+ for group, entries in self._dist.get_entry_map().items():
215
+ for name, entry_point in entries.items():
216
+ name, _, value = str(entry_point).partition("=")
217
+ yield EntryPoint(name=name.strip(), value=value.strip(), group=group)
218
+
219
+ def _metadata_impl(self) -> email.message.Message:
220
+ """
221
+ :raises NoneMetadataError: if the distribution reports `has_metadata()`
222
+ True but `get_metadata()` returns None.
223
+ """
224
+ if isinstance(self._dist, pkg_resources.DistInfoDistribution):
225
+ metadata_name = "METADATA"
226
+ else:
227
+ metadata_name = "PKG-INFO"
228
+ try:
229
+ metadata = self.read_text(metadata_name)
230
+ except FileNotFoundError:
231
+ if self.location:
232
+ displaying_path = display_path(self.location)
233
+ else:
234
+ displaying_path = repr(self.location)
235
+ logger.warning("No metadata found in %s", displaying_path)
236
+ metadata = ""
237
+ feed_parser = email.parser.FeedParser()
238
+ feed_parser.feed(metadata)
239
+ return feed_parser.close()
240
+
241
+ def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
242
+ if extras:
243
+ relevant_extras = set(self._extra_mapping) & set(
244
+ map(canonicalize_name, extras)
245
+ )
246
+ extras = [self._extra_mapping[extra] for extra in relevant_extras]
247
+ return self._dist.requires(extras)
248
+
249
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
250
+ return self._extra_mapping.keys()
251
+
252
+
253
+ class Environment(BaseEnvironment):
254
+ def __init__(self, ws: pkg_resources.WorkingSet) -> None:
255
+ self._ws = ws
256
+
257
+ @classmethod
258
+ def default(cls) -> BaseEnvironment:
259
+ return cls(pkg_resources.working_set)
260
+
261
+ @classmethod
262
+ def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment:
263
+ return cls(pkg_resources.WorkingSet(paths))
264
+
265
+ def _iter_distributions(self) -> Iterator[BaseDistribution]:
266
+ for dist in self._ws:
267
+ yield Distribution(dist)
268
+
269
+ def _search_distribution(self, name: str) -> Optional[BaseDistribution]:
270
+ """Find a distribution matching the ``name`` in the environment.
271
+
272
+ This searches from *all* distributions available in the environment, to
273
+ match the behavior of ``pkg_resources.get_distribution()``.
274
+ """
275
+ canonical_name = canonicalize_name(name)
276
+ for dist in self.iter_all_distributions():
277
+ if dist.canonical_name == canonical_name:
278
+ return dist
279
+ return None
280
+
281
+ def get_distribution(self, name: str) -> Optional[BaseDistribution]:
282
+ # Search the distribution by looking through the working set.
283
+ dist = self._search_distribution(name)
284
+ if dist:
285
+ return dist
286
+
287
+ # If distribution could not be found, call working_set.require to
288
+ # update the working set, and try to find the distribution again.
289
+ # This might happen for e.g. when you install a package twice, once
290
+ # using setup.py develop and again using setup.py install. Now when
291
+ # running pip uninstall twice, the package gets removed from the
292
+ # working set in the first uninstall, so we have to populate the
293
+ # working set again so that pip knows about it and the packages gets
294
+ # picked up and is successfully uninstalled the second time too.
295
+ try:
296
+ # We didn't pass in any version specifiers, so this can never
297
+ # raise pkg_resources.VersionConflict.
298
+ self._ws.require(name)
299
+ except pkg_resources.DistributionNotFound:
300
+ return None
301
+ return self._search_distribution(name)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/pyproject.py ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib.util
2
+ import os
3
+ import sys
4
+ from collections import namedtuple
5
+ from typing import Any, List, Optional
6
+
7
+ if sys.version_info >= (3, 11):
8
+ import tomllib
9
+ else:
10
+ from pip._vendor import tomli as tomllib
11
+
12
+ from pip._vendor.packaging.requirements import InvalidRequirement
13
+
14
+ from pip._internal.exceptions import (
15
+ InstallationError,
16
+ InvalidPyProjectBuildRequires,
17
+ MissingPyProjectBuildRequires,
18
+ )
19
+ from pip._internal.utils.packaging import get_requirement
20
+
21
+
22
+ def _is_list_of_str(obj: Any) -> bool:
23
+ return isinstance(obj, list) and all(isinstance(item, str) for item in obj)
24
+
25
+
26
+ def make_pyproject_path(unpacked_source_directory: str) -> str:
27
+ return os.path.join(unpacked_source_directory, "pyproject.toml")
28
+
29
+
30
+ BuildSystemDetails = namedtuple(
31
+ "BuildSystemDetails", ["requires", "backend", "check", "backend_path"]
32
+ )
33
+
34
+
35
+ def load_pyproject_toml(
36
+ use_pep517: Optional[bool], pyproject_toml: str, setup_py: str, req_name: str
37
+ ) -> Optional[BuildSystemDetails]:
38
+ """Load the pyproject.toml file.
39
+
40
+ Parameters:
41
+ use_pep517 - Has the user requested PEP 517 processing? None
42
+ means the user hasn't explicitly specified.
43
+ pyproject_toml - Location of the project's pyproject.toml file
44
+ setup_py - Location of the project's setup.py file
45
+ req_name - The name of the requirement we're processing (for
46
+ error reporting)
47
+
48
+ Returns:
49
+ None if we should use the legacy code path, otherwise a tuple
50
+ (
51
+ requirements from pyproject.toml,
52
+ name of PEP 517 backend,
53
+ requirements we should check are installed after setting
54
+ up the build environment
55
+ directory paths to import the backend from (backend-path),
56
+ relative to the project root.
57
+ )
58
+ """
59
+ has_pyproject = os.path.isfile(pyproject_toml)
60
+ has_setup = os.path.isfile(setup_py)
61
+
62
+ if not has_pyproject and not has_setup:
63
+ raise InstallationError(
64
+ f"{req_name} does not appear to be a Python project: "
65
+ f"neither 'setup.py' nor 'pyproject.toml' found."
66
+ )
67
+
68
+ if has_pyproject:
69
+ with open(pyproject_toml, encoding="utf-8") as f:
70
+ pp_toml = tomllib.loads(f.read())
71
+ build_system = pp_toml.get("build-system")
72
+ else:
73
+ build_system = None
74
+
75
+ # The following cases must use PEP 517
76
+ # We check for use_pep517 being non-None and falsy because that means
77
+ # the user explicitly requested --no-use-pep517. The value 0 as
78
+ # opposed to False can occur when the value is provided via an
79
+ # environment variable or config file option (due to the quirk of
80
+ # strtobool() returning an integer in pip's configuration code).
81
+ if has_pyproject and not has_setup:
82
+ if use_pep517 is not None and not use_pep517:
83
+ raise InstallationError(
84
+ "Disabling PEP 517 processing is invalid: "
85
+ "project does not have a setup.py"
86
+ )
87
+ use_pep517 = True
88
+ elif build_system and "build-backend" in build_system:
89
+ if use_pep517 is not None and not use_pep517:
90
+ raise InstallationError(
91
+ "Disabling PEP 517 processing is invalid: "
92
+ "project specifies a build backend of {} "
93
+ "in pyproject.toml".format(build_system["build-backend"])
94
+ )
95
+ use_pep517 = True
96
+
97
+ # If we haven't worked out whether to use PEP 517 yet,
98
+ # and the user hasn't explicitly stated a preference,
99
+ # we do so if the project has a pyproject.toml file
100
+ # or if we cannot import setuptools or wheels.
101
+
102
+ # We fallback to PEP 517 when without setuptools or without the wheel package,
103
+ # so setuptools can be installed as a default build backend.
104
+ # For more info see:
105
+ # https://discuss.python.org/t/pip-without-setuptools-could-the-experience-be-improved/11810/9
106
+ # https://github.com/pypa/pip/issues/8559
107
+ elif use_pep517 is None:
108
+ use_pep517 = (
109
+ has_pyproject
110
+ or not importlib.util.find_spec("setuptools")
111
+ or not importlib.util.find_spec("wheel")
112
+ )
113
+
114
+ # At this point, we know whether we're going to use PEP 517.
115
+ assert use_pep517 is not None
116
+
117
+ # If we're using the legacy code path, there is nothing further
118
+ # for us to do here.
119
+ if not use_pep517:
120
+ return None
121
+
122
+ if build_system is None:
123
+ # Either the user has a pyproject.toml with no build-system
124
+ # section, or the user has no pyproject.toml, but has opted in
125
+ # explicitly via --use-pep517.
126
+ # In the absence of any explicit backend specification, we
127
+ # assume the setuptools backend that most closely emulates the
128
+ # traditional direct setup.py execution, and require wheel and
129
+ # a version of setuptools that supports that backend.
130
+
131
+ build_system = {
132
+ "requires": ["setuptools>=40.8.0"],
133
+ "build-backend": "setuptools.build_meta:__legacy__",
134
+ }
135
+
136
+ # If we're using PEP 517, we have build system information (either
137
+ # from pyproject.toml, or defaulted by the code above).
138
+ # Note that at this point, we do not know if the user has actually
139
+ # specified a backend, though.
140
+ assert build_system is not None
141
+
142
+ # Ensure that the build-system section in pyproject.toml conforms
143
+ # to PEP 518.
144
+
145
+ # Specifying the build-system table but not the requires key is invalid
146
+ if "requires" not in build_system:
147
+ raise MissingPyProjectBuildRequires(package=req_name)
148
+
149
+ # Error out if requires is not a list of strings
150
+ requires = build_system["requires"]
151
+ if not _is_list_of_str(requires):
152
+ raise InvalidPyProjectBuildRequires(
153
+ package=req_name,
154
+ reason="It is not a list of strings.",
155
+ )
156
+
157
+ # Each requirement must be valid as per PEP 508
158
+ for requirement in requires:
159
+ try:
160
+ get_requirement(requirement)
161
+ except InvalidRequirement as error:
162
+ raise InvalidPyProjectBuildRequires(
163
+ package=req_name,
164
+ reason=f"It contains an invalid requirement: {requirement!r}",
165
+ ) from error
166
+
167
+ backend = build_system.get("build-backend")
168
+ backend_path = build_system.get("backend-path", [])
169
+ check: List[str] = []
170
+ if backend is None:
171
+ # If the user didn't specify a backend, we assume they want to use
172
+ # the setuptools backend. But we can't be sure they have included
173
+ # a version of setuptools which supplies the backend. So we
174
+ # make a note to check that this requirement is present once
175
+ # we have set up the environment.
176
+ # This is quite a lot of work to check for a very specific case. But
177
+ # the problem is, that case is potentially quite common - projects that
178
+ # adopted PEP 518 early for the ability to specify requirements to
179
+ # execute setup.py, but never considered needing to mention the build
180
+ # tools themselves. The original PEP 518 code had a similar check (but
181
+ # implemented in a different way).
182
+ backend = "setuptools.build_meta:__legacy__"
183
+ check = ["setuptools>=40.8.0"]
184
+
185
+ return BuildSystemDetails(requires, backend, check, backend_path)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import datetime
2
+ import functools
3
+ import hashlib
4
+ import json
5
+ import logging
6
+ import optparse
7
+ import os.path
8
+ import sys
9
+ from dataclasses import dataclass
10
+ from typing import Any, Callable, Dict, Optional
11
+
12
+ from pip._vendor.packaging.version import Version
13
+ from pip._vendor.packaging.version import parse as parse_version
14
+ from pip._vendor.rich.console import Group
15
+ from pip._vendor.rich.markup import escape
16
+ from pip._vendor.rich.text import Text
17
+
18
+ from pip._internal.index.collector import LinkCollector
19
+ from pip._internal.index.package_finder import PackageFinder
20
+ from pip._internal.metadata import get_default_environment
21
+ from pip._internal.models.selection_prefs import SelectionPreferences
22
+ from pip._internal.network.session import PipSession
23
+ from pip._internal.utils.compat import WINDOWS
24
+ from pip._internal.utils.entrypoints import (
25
+ get_best_invocation_for_this_pip,
26
+ get_best_invocation_for_this_python,
27
+ )
28
+ from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace
29
+ from pip._internal.utils.misc import (
30
+ ExternallyManagedEnvironment,
31
+ check_externally_managed,
32
+ ensure_dir,
33
+ )
34
+
35
+ _WEEK = datetime.timedelta(days=7)
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+ def _get_statefile_name(key: str) -> str:
41
+ key_bytes = key.encode()
42
+ name = hashlib.sha224(key_bytes).hexdigest()
43
+ return name
44
+
45
+
46
+ def _convert_date(isodate: str) -> datetime.datetime:
47
+ """Convert an ISO format string to a date.
48
+
49
+ Handles the format 2020-01-22T14:24:01Z (trailing Z)
50
+ which is not supported by older versions of fromisoformat.
51
+ """
52
+ return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00"))
53
+
54
+
55
+ class SelfCheckState:
56
+ def __init__(self, cache_dir: str) -> None:
57
+ self._state: Dict[str, Any] = {}
58
+ self._statefile_path = None
59
+
60
+ # Try to load the existing state
61
+ if cache_dir:
62
+ self._statefile_path = os.path.join(
63
+ cache_dir, "selfcheck", _get_statefile_name(self.key)
64
+ )
65
+ try:
66
+ with open(self._statefile_path, encoding="utf-8") as statefile:
67
+ self._state = json.load(statefile)
68
+ except (OSError, ValueError, KeyError):
69
+ # Explicitly suppressing exceptions, since we don't want to
70
+ # error out if the cache file is invalid.
71
+ pass
72
+
73
+ @property
74
+ def key(self) -> str:
75
+ return sys.prefix
76
+
77
+ def get(self, current_time: datetime.datetime) -> Optional[str]:
78
+ """Check if we have a not-outdated version loaded already."""
79
+ if not self._state:
80
+ return None
81
+
82
+ if "last_check" not in self._state:
83
+ return None
84
+
85
+ if "pypi_version" not in self._state:
86
+ return None
87
+
88
+ # Determine if we need to refresh the state
89
+ last_check = _convert_date(self._state["last_check"])
90
+ time_since_last_check = current_time - last_check
91
+ if time_since_last_check > _WEEK:
92
+ return None
93
+
94
+ return self._state["pypi_version"]
95
+
96
+ def set(self, pypi_version: str, current_time: datetime.datetime) -> None:
97
+ # If we do not have a path to cache in, don't bother saving.
98
+ if not self._statefile_path:
99
+ return
100
+
101
+ # Check to make sure that we own the directory
102
+ if not check_path_owner(os.path.dirname(self._statefile_path)):
103
+ return
104
+
105
+ # Now that we've ensured the directory is owned by this user, we'll go
106
+ # ahead and make sure that all our directories are created.
107
+ ensure_dir(os.path.dirname(self._statefile_path))
108
+
109
+ state = {
110
+ # Include the key so it's easy to tell which pip wrote the
111
+ # file.
112
+ "key": self.key,
113
+ "last_check": current_time.isoformat(),
114
+ "pypi_version": pypi_version,
115
+ }
116
+
117
+ text = json.dumps(state, sort_keys=True, separators=(",", ":"))
118
+
119
+ with adjacent_tmp_file(self._statefile_path) as f:
120
+ f.write(text.encode())
121
+
122
+ try:
123
+ # Since we have a prefix-specific state file, we can just
124
+ # overwrite whatever is there, no need to check.
125
+ replace(f.name, self._statefile_path)
126
+ except OSError:
127
+ # Best effort.
128
+ pass
129
+
130
+
131
+ @dataclass
132
+ class UpgradePrompt:
133
+ old: str
134
+ new: str
135
+
136
+ def __rich__(self) -> Group:
137
+ if WINDOWS:
138
+ pip_cmd = f"{get_best_invocation_for_this_python()} -m pip"
139
+ else:
140
+ pip_cmd = get_best_invocation_for_this_pip()
141
+
142
+ notice = "[bold][[reset][blue]notice[reset][bold]][reset]"
143
+ return Group(
144
+ Text(),
145
+ Text.from_markup(
146
+ f"{notice} A new release of pip is available: "
147
+ f"[red]{self.old}[reset] -> [green]{self.new}[reset]"
148
+ ),
149
+ Text.from_markup(
150
+ f"{notice} To update, run: "
151
+ f"[green]{escape(pip_cmd)} install --upgrade pip"
152
+ ),
153
+ )
154
+
155
+
156
+ def was_installed_by_pip(pkg: str) -> bool:
157
+ """Checks whether pkg was installed by pip
158
+
159
+ This is used not to display the upgrade message when pip is in fact
160
+ installed by system package manager, such as dnf on Fedora.
161
+ """
162
+ dist = get_default_environment().get_distribution(pkg)
163
+ return dist is not None and "pip" == dist.installer
164
+
165
+
166
+ def _get_current_remote_pip_version(
167
+ session: PipSession, options: optparse.Values
168
+ ) -> Optional[str]:
169
+ # Lets use PackageFinder to see what the latest pip version is
170
+ link_collector = LinkCollector.create(
171
+ session,
172
+ options=options,
173
+ suppress_no_index=True,
174
+ )
175
+
176
+ # Pass allow_yanked=False so we don't suggest upgrading to a
177
+ # yanked version.
178
+ selection_prefs = SelectionPreferences(
179
+ allow_yanked=False,
180
+ allow_all_prereleases=False, # Explicitly set to False
181
+ )
182
+
183
+ finder = PackageFinder.create(
184
+ link_collector=link_collector,
185
+ selection_prefs=selection_prefs,
186
+ )
187
+ best_candidate = finder.find_best_candidate("pip").best_candidate
188
+ if best_candidate is None:
189
+ return None
190
+
191
+ return str(best_candidate.version)
192
+
193
+
194
+ def _self_version_check_logic(
195
+ *,
196
+ state: SelfCheckState,
197
+ current_time: datetime.datetime,
198
+ local_version: Version,
199
+ get_remote_version: Callable[[], Optional[str]],
200
+ ) -> Optional[UpgradePrompt]:
201
+ remote_version_str = state.get(current_time)
202
+ if remote_version_str is None:
203
+ remote_version_str = get_remote_version()
204
+ if remote_version_str is None:
205
+ logger.debug("No remote pip version found")
206
+ return None
207
+ state.set(remote_version_str, current_time)
208
+
209
+ remote_version = parse_version(remote_version_str)
210
+ logger.debug("Remote version of pip: %s", remote_version)
211
+ logger.debug("Local version of pip: %s", local_version)
212
+
213
+ pip_installed_by_pip = was_installed_by_pip("pip")
214
+ logger.debug("Was pip installed by pip? %s", pip_installed_by_pip)
215
+ if not pip_installed_by_pip:
216
+ return None # Only suggest upgrade if pip is installed by pip.
217
+
218
+ local_version_is_older = (
219
+ local_version < remote_version
220
+ and local_version.base_version != remote_version.base_version
221
+ )
222
+ if local_version_is_older:
223
+ return UpgradePrompt(old=str(local_version), new=remote_version_str)
224
+
225
+ return None
226
+
227
+
228
+ def pip_self_version_check(session: PipSession, options: optparse.Values) -> None:
229
+ """Check for an update for pip.
230
+
231
+ Limit the frequency of checks to once per week. State is stored either in
232
+ the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
233
+ of the pip script path.
234
+ """
235
+ installed_dist = get_default_environment().get_distribution("pip")
236
+ if not installed_dist:
237
+ return
238
+ try:
239
+ check_externally_managed()
240
+ except ExternallyManagedEnvironment:
241
+ return
242
+
243
+ upgrade_prompt = _self_version_check_logic(
244
+ state=SelfCheckState(cache_dir=options.cache_dir),
245
+ current_time=datetime.datetime.now(datetime.timezone.utc),
246
+ local_version=installed_dist.version,
247
+ get_remote_version=functools.partial(
248
+ _get_current_remote_pip_version, session, options
249
+ ),
250
+ )
251
+ if upgrade_prompt is not None:
252
+ logger.warning("%s", upgrade_prompt, extra={"rich": True})
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/vcs/git.py ADDED
@@ -0,0 +1,536 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os.path
3
+ import pathlib
4
+ import re
5
+ import urllib.parse
6
+ import urllib.request
7
+ from dataclasses import replace
8
+ from typing import Any, List, Optional, Tuple
9
+
10
+ from pip._internal.exceptions import BadCommand, InstallationError
11
+ from pip._internal.utils.misc import HiddenText, display_path, hide_url
12
+ from pip._internal.utils.subprocess import make_command
13
+ from pip._internal.vcs.versioncontrol import (
14
+ AuthInfo,
15
+ RemoteNotFoundError,
16
+ RemoteNotValidError,
17
+ RevOptions,
18
+ VersionControl,
19
+ find_path_to_project_root_from_repo_root,
20
+ vcs,
21
+ )
22
+
23
+ urlsplit = urllib.parse.urlsplit
24
+ urlunsplit = urllib.parse.urlunsplit
25
+
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ GIT_VERSION_REGEX = re.compile(
31
+ r"^git version " # Prefix.
32
+ r"(\d+)" # Major.
33
+ r"\.(\d+)" # Dot, minor.
34
+ r"(?:\.(\d+))?" # Optional dot, patch.
35
+ r".*$" # Suffix, including any pre- and post-release segments we don't care about.
36
+ )
37
+
38
+ HASH_REGEX = re.compile("^[a-fA-F0-9]{40}$")
39
+
40
+ # SCP (Secure copy protocol) shorthand. e.g. 'git@example.com:foo/bar.git'
41
+ SCP_REGEX = re.compile(
42
+ r"""^
43
+ # Optional user, e.g. 'git@'
44
+ (\w+@)?
45
+ # Server, e.g. 'github.com'.
46
+ ([^/:]+):
47
+ # The server-side path. e.g. 'user/project.git'. Must start with an
48
+ # alphanumeric character so as not to be confusable with a Windows paths
49
+ # like 'C:/foo/bar' or 'C:\foo\bar'.
50
+ (\w[^:]*)
51
+ $""",
52
+ re.VERBOSE,
53
+ )
54
+
55
+
56
+ def looks_like_hash(sha: str) -> bool:
57
+ return bool(HASH_REGEX.match(sha))
58
+
59
+
60
+ class Git(VersionControl):
61
+ name = "git"
62
+ dirname = ".git"
63
+ repo_name = "clone"
64
+ schemes = (
65
+ "git+http",
66
+ "git+https",
67
+ "git+ssh",
68
+ "git+git",
69
+ "git+file",
70
+ )
71
+ # Prevent the user's environment variables from interfering with pip:
72
+ # https://github.com/pypa/pip/issues/1130
73
+ unset_environ = ("GIT_DIR", "GIT_WORK_TREE")
74
+ default_arg_rev = "HEAD"
75
+
76
+ @staticmethod
77
+ def get_base_rev_args(rev: str) -> List[str]:
78
+ return [rev]
79
+
80
+ @classmethod
81
+ def run_command(cls, *args: Any, **kwargs: Any) -> str:
82
+ if os.environ.get("PIP_NO_INPUT"):
83
+ extra_environ = kwargs.get("extra_environ", {})
84
+ extra_environ["GIT_TERMINAL_PROMPT"] = "0"
85
+ extra_environ["GIT_SSH_COMMAND"] = "ssh -oBatchMode=yes"
86
+ kwargs["extra_environ"] = extra_environ
87
+ return super().run_command(*args, **kwargs)
88
+
89
+ def is_immutable_rev_checkout(self, url: str, dest: str) -> bool:
90
+ _, rev_options = self.get_url_rev_options(hide_url(url))
91
+ if not rev_options.rev:
92
+ return False
93
+ if not self.is_commit_id_equal(dest, rev_options.rev):
94
+ # the current commit is different from rev,
95
+ # which means rev was something else than a commit hash
96
+ return False
97
+ # return False in the rare case rev is both a commit hash
98
+ # and a tag or a branch; we don't want to cache in that case
99
+ # because that branch/tag could point to something else in the future
100
+ is_tag_or_branch = bool(self.get_revision_sha(dest, rev_options.rev)[0])
101
+ return not is_tag_or_branch
102
+
103
+ def get_git_version(self) -> Tuple[int, ...]:
104
+ version = self.run_command(
105
+ ["version"],
106
+ command_desc="git version",
107
+ show_stdout=False,
108
+ stdout_only=True,
109
+ )
110
+ match = GIT_VERSION_REGEX.match(version)
111
+ if not match:
112
+ logger.warning("Can't parse git version: %s", version)
113
+ return ()
114
+ return (int(match.group(1)), int(match.group(2)))
115
+
116
+ @classmethod
117
+ def get_current_branch(cls, location: str) -> Optional[str]:
118
+ """
119
+ Return the current branch, or None if HEAD isn't at a branch
120
+ (e.g. detached HEAD).
121
+ """
122
+ # git-symbolic-ref exits with empty stdout if "HEAD" is a detached
123
+ # HEAD rather than a symbolic ref. In addition, the -q causes the
124
+ # command to exit with status code 1 instead of 128 in this case
125
+ # and to suppress the message to stderr.
126
+ args = ["symbolic-ref", "-q", "HEAD"]
127
+ output = cls.run_command(
128
+ args,
129
+ extra_ok_returncodes=(1,),
130
+ show_stdout=False,
131
+ stdout_only=True,
132
+ cwd=location,
133
+ )
134
+ ref = output.strip()
135
+
136
+ if ref.startswith("refs/heads/"):
137
+ return ref[len("refs/heads/") :]
138
+
139
+ return None
140
+
141
+ @classmethod
142
+ def get_revision_sha(cls, dest: str, rev: str) -> Tuple[Optional[str], bool]:
143
+ """
144
+ Return (sha_or_none, is_branch), where sha_or_none is a commit hash
145
+ if the revision names a remote branch or tag, otherwise None.
146
+
147
+ Args:
148
+ dest: the repository directory.
149
+ rev: the revision name.
150
+ """
151
+ # Pass rev to pre-filter the list.
152
+ output = cls.run_command(
153
+ ["show-ref", rev],
154
+ cwd=dest,
155
+ show_stdout=False,
156
+ stdout_only=True,
157
+ on_returncode="ignore",
158
+ )
159
+ refs = {}
160
+ # NOTE: We do not use splitlines here since that would split on other
161
+ # unicode separators, which can be maliciously used to install a
162
+ # different revision.
163
+ for line in output.strip().split("\n"):
164
+ line = line.rstrip("\r")
165
+ if not line:
166
+ continue
167
+ try:
168
+ ref_sha, ref_name = line.split(" ", maxsplit=2)
169
+ except ValueError:
170
+ # Include the offending line to simplify troubleshooting if
171
+ # this error ever occurs.
172
+ raise ValueError(f"unexpected show-ref line: {line!r}")
173
+
174
+ refs[ref_name] = ref_sha
175
+
176
+ branch_ref = f"refs/remotes/origin/{rev}"
177
+ tag_ref = f"refs/tags/{rev}"
178
+
179
+ sha = refs.get(branch_ref)
180
+ if sha is not None:
181
+ return (sha, True)
182
+
183
+ sha = refs.get(tag_ref)
184
+
185
+ return (sha, False)
186
+
187
+ @classmethod
188
+ def _should_fetch(cls, dest: str, rev: str) -> bool:
189
+ """
190
+ Return true if rev is a ref or is a commit that we don't have locally.
191
+
192
+ Branches and tags are not considered in this method because they are
193
+ assumed to be always available locally (which is a normal outcome of
194
+ ``git clone`` and ``git fetch --tags``).
195
+ """
196
+ if rev.startswith("refs/"):
197
+ # Always fetch remote refs.
198
+ return True
199
+
200
+ if not looks_like_hash(rev):
201
+ # Git fetch would fail with abbreviated commits.
202
+ return False
203
+
204
+ if cls.has_commit(dest, rev):
205
+ # Don't fetch if we have the commit locally.
206
+ return False
207
+
208
+ return True
209
+
210
+ @classmethod
211
+ def resolve_revision(
212
+ cls, dest: str, url: HiddenText, rev_options: RevOptions
213
+ ) -> RevOptions:
214
+ """
215
+ Resolve a revision to a new RevOptions object with the SHA1 of the
216
+ branch, tag, or ref if found.
217
+
218
+ Args:
219
+ rev_options: a RevOptions object.
220
+ """
221
+ rev = rev_options.arg_rev
222
+ # The arg_rev property's implementation for Git ensures that the
223
+ # rev return value is always non-None.
224
+ assert rev is not None
225
+
226
+ sha, is_branch = cls.get_revision_sha(dest, rev)
227
+
228
+ if sha is not None:
229
+ rev_options = rev_options.make_new(sha)
230
+ rev_options = replace(rev_options, branch_name=(rev if is_branch else None))
231
+
232
+ return rev_options
233
+
234
+ # Do not show a warning for the common case of something that has
235
+ # the form of a Git commit hash.
236
+ if not looks_like_hash(rev):
237
+ logger.warning(
238
+ "Did not find branch or tag '%s', assuming revision or ref.",
239
+ rev,
240
+ )
241
+
242
+ if not cls._should_fetch(dest, rev):
243
+ return rev_options
244
+
245
+ # fetch the requested revision
246
+ cls.run_command(
247
+ make_command("fetch", "-q", url, rev_options.to_args()),
248
+ cwd=dest,
249
+ )
250
+ # Change the revision to the SHA of the ref we fetched
251
+ sha = cls.get_revision(dest, rev="FETCH_HEAD")
252
+ rev_options = rev_options.make_new(sha)
253
+
254
+ return rev_options
255
+
256
+ @classmethod
257
+ def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
258
+ """
259
+ Return whether the current commit hash equals the given name.
260
+
261
+ Args:
262
+ dest: the repository directory.
263
+ name: a string name.
264
+ """
265
+ if not name:
266
+ # Then avoid an unnecessary subprocess call.
267
+ return False
268
+
269
+ return cls.get_revision(dest) == name
270
+
271
+ def fetch_new(
272
+ self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int
273
+ ) -> None:
274
+ rev_display = rev_options.to_display()
275
+ logger.info("Cloning %s%s to %s", url, rev_display, display_path(dest))
276
+ if verbosity <= 0:
277
+ flags: Tuple[str, ...] = ("--quiet",)
278
+ elif verbosity == 1:
279
+ flags = ()
280
+ else:
281
+ flags = ("--verbose", "--progress")
282
+ if self.get_git_version() >= (2, 17):
283
+ # Git added support for partial clone in 2.17
284
+ # https://git-scm.com/docs/partial-clone
285
+ # Speeds up cloning by functioning without a complete copy of repository
286
+ self.run_command(
287
+ make_command(
288
+ "clone",
289
+ "--filter=blob:none",
290
+ *flags,
291
+ url,
292
+ dest,
293
+ )
294
+ )
295
+ else:
296
+ self.run_command(make_command("clone", *flags, url, dest))
297
+
298
+ if rev_options.rev:
299
+ # Then a specific revision was requested.
300
+ rev_options = self.resolve_revision(dest, url, rev_options)
301
+ branch_name = getattr(rev_options, "branch_name", None)
302
+ logger.debug("Rev options %s, branch_name %s", rev_options, branch_name)
303
+ if branch_name is None:
304
+ # Only do a checkout if the current commit id doesn't match
305
+ # the requested revision.
306
+ if not self.is_commit_id_equal(dest, rev_options.rev):
307
+ cmd_args = make_command(
308
+ "checkout",
309
+ "-q",
310
+ rev_options.to_args(),
311
+ )
312
+ self.run_command(cmd_args, cwd=dest)
313
+ elif self.get_current_branch(dest) != branch_name:
314
+ # Then a specific branch was requested, and that branch
315
+ # is not yet checked out.
316
+ track_branch = f"origin/{branch_name}"
317
+ cmd_args = [
318
+ "checkout",
319
+ "-b",
320
+ branch_name,
321
+ "--track",
322
+ track_branch,
323
+ ]
324
+ self.run_command(cmd_args, cwd=dest)
325
+ else:
326
+ sha = self.get_revision(dest)
327
+ rev_options = rev_options.make_new(sha)
328
+
329
+ logger.info("Resolved %s to commit %s", url, rev_options.rev)
330
+
331
+ #: repo may contain submodules
332
+ self.update_submodules(dest)
333
+
334
+ def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
335
+ self.run_command(
336
+ make_command("config", "remote.origin.url", url),
337
+ cwd=dest,
338
+ )
339
+ cmd_args = make_command("checkout", "-q", rev_options.to_args())
340
+ self.run_command(cmd_args, cwd=dest)
341
+
342
+ self.update_submodules(dest)
343
+
344
+ def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
345
+ # First fetch changes from the default remote
346
+ if self.get_git_version() >= (1, 9):
347
+ # fetch tags in addition to everything else
348
+ self.run_command(["fetch", "-q", "--tags"], cwd=dest)
349
+ else:
350
+ self.run_command(["fetch", "-q"], cwd=dest)
351
+ # Then reset to wanted revision (maybe even origin/master)
352
+ rev_options = self.resolve_revision(dest, url, rev_options)
353
+ cmd_args = make_command("reset", "--hard", "-q", rev_options.to_args())
354
+ self.run_command(cmd_args, cwd=dest)
355
+ #: update submodules
356
+ self.update_submodules(dest)
357
+
358
+ @classmethod
359
+ def get_remote_url(cls, location: str) -> str:
360
+ """
361
+ Return URL of the first remote encountered.
362
+
363
+ Raises RemoteNotFoundError if the repository does not have a remote
364
+ url configured.
365
+ """
366
+ # We need to pass 1 for extra_ok_returncodes since the command
367
+ # exits with return code 1 if there are no matching lines.
368
+ stdout = cls.run_command(
369
+ ["config", "--get-regexp", r"remote\..*\.url"],
370
+ extra_ok_returncodes=(1,),
371
+ show_stdout=False,
372
+ stdout_only=True,
373
+ cwd=location,
374
+ )
375
+ remotes = stdout.splitlines()
376
+ try:
377
+ found_remote = remotes[0]
378
+ except IndexError:
379
+ raise RemoteNotFoundError
380
+
381
+ for remote in remotes:
382
+ if remote.startswith("remote.origin.url "):
383
+ found_remote = remote
384
+ break
385
+ url = found_remote.split(" ")[1]
386
+ return cls._git_remote_to_pip_url(url.strip())
387
+
388
+ @staticmethod
389
+ def _git_remote_to_pip_url(url: str) -> str:
390
+ """
391
+ Convert a remote url from what git uses to what pip accepts.
392
+
393
+ There are 3 legal forms **url** may take:
394
+
395
+ 1. A fully qualified url: ssh://git@example.com/foo/bar.git
396
+ 2. A local project.git folder: /path/to/bare/repository.git
397
+ 3. SCP shorthand for form 1: git@example.com:foo/bar.git
398
+
399
+ Form 1 is output as-is. Form 2 must be converted to URI and form 3 must
400
+ be converted to form 1.
401
+
402
+ See the corresponding test test_git_remote_url_to_pip() for examples of
403
+ sample inputs/outputs.
404
+ """
405
+ if re.match(r"\w+://", url):
406
+ # This is already valid. Pass it though as-is.
407
+ return url
408
+ if os.path.exists(url):
409
+ # A local bare remote (git clone --mirror).
410
+ # Needs a file:// prefix.
411
+ return pathlib.PurePath(url).as_uri()
412
+ scp_match = SCP_REGEX.match(url)
413
+ if scp_match:
414
+ # Add an ssh:// prefix and replace the ':' with a '/'.
415
+ return scp_match.expand(r"ssh://\1\2/\3")
416
+ # Otherwise, bail out.
417
+ raise RemoteNotValidError(url)
418
+
419
+ @classmethod
420
+ def has_commit(cls, location: str, rev: str) -> bool:
421
+ """
422
+ Check if rev is a commit that is available in the local repository.
423
+ """
424
+ try:
425
+ cls.run_command(
426
+ ["rev-parse", "-q", "--verify", "sha^" + rev],
427
+ cwd=location,
428
+ log_failed_cmd=False,
429
+ )
430
+ except InstallationError:
431
+ return False
432
+ else:
433
+ return True
434
+
435
+ @classmethod
436
+ def get_revision(cls, location: str, rev: Optional[str] = None) -> str:
437
+ if rev is None:
438
+ rev = "HEAD"
439
+ current_rev = cls.run_command(
440
+ ["rev-parse", rev],
441
+ show_stdout=False,
442
+ stdout_only=True,
443
+ cwd=location,
444
+ )
445
+ return current_rev.strip()
446
+
447
+ @classmethod
448
+ def get_subdirectory(cls, location: str) -> Optional[str]:
449
+ """
450
+ Return the path to Python project root, relative to the repo root.
451
+ Return None if the project root is in the repo root.
452
+ """
453
+ # find the repo root
454
+ git_dir = cls.run_command(
455
+ ["rev-parse", "--git-dir"],
456
+ show_stdout=False,
457
+ stdout_only=True,
458
+ cwd=location,
459
+ ).strip()
460
+ if not os.path.isabs(git_dir):
461
+ git_dir = os.path.join(location, git_dir)
462
+ repo_root = os.path.abspath(os.path.join(git_dir, ".."))
463
+ return find_path_to_project_root_from_repo_root(location, repo_root)
464
+
465
+ @classmethod
466
+ def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
467
+ """
468
+ Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
469
+ That's required because although they use SSH they sometimes don't
470
+ work with a ssh:// scheme (e.g. GitHub). But we need a scheme for
471
+ parsing. Hence we remove it again afterwards and return it as a stub.
472
+ """
473
+ # Works around an apparent Git bug
474
+ # (see https://article.gmane.org/gmane.comp.version-control.git/146500)
475
+ scheme, netloc, path, query, fragment = urlsplit(url)
476
+ if scheme.endswith("file"):
477
+ initial_slashes = path[: -len(path.lstrip("/"))]
478
+ newpath = initial_slashes + urllib.request.url2pathname(path).replace(
479
+ "\\", "/"
480
+ ).lstrip("/")
481
+ after_plus = scheme.find("+") + 1
482
+ url = scheme[:after_plus] + urlunsplit(
483
+ (scheme[after_plus:], netloc, newpath, query, fragment),
484
+ )
485
+
486
+ if "://" not in url:
487
+ assert "file:" not in url
488
+ url = url.replace("git+", "git+ssh://")
489
+ url, rev, user_pass = super().get_url_rev_and_auth(url)
490
+ url = url.replace("ssh://", "")
491
+ else:
492
+ url, rev, user_pass = super().get_url_rev_and_auth(url)
493
+
494
+ return url, rev, user_pass
495
+
496
+ @classmethod
497
+ def update_submodules(cls, location: str) -> None:
498
+ if not os.path.exists(os.path.join(location, ".gitmodules")):
499
+ return
500
+ cls.run_command(
501
+ ["submodule", "update", "--init", "--recursive", "-q"],
502
+ cwd=location,
503
+ )
504
+
505
+ @classmethod
506
+ def get_repository_root(cls, location: str) -> Optional[str]:
507
+ loc = super().get_repository_root(location)
508
+ if loc:
509
+ return loc
510
+ try:
511
+ r = cls.run_command(
512
+ ["rev-parse", "--show-toplevel"],
513
+ cwd=location,
514
+ show_stdout=False,
515
+ stdout_only=True,
516
+ on_returncode="raise",
517
+ log_failed_cmd=False,
518
+ )
519
+ except BadCommand:
520
+ logger.debug(
521
+ "could not determine if %s is under git control "
522
+ "because git is not available",
523
+ location,
524
+ )
525
+ return None
526
+ except InstallationError:
527
+ return None
528
+ return os.path.normpath(r.rstrip("\r\n"))
529
+
530
+ @staticmethod
531
+ def should_add_vcs_url_prefix(repo_url: str) -> bool:
532
+ """In either https or ssh form, requirements must be prefixed with git+."""
533
+ return True
534
+
535
+
536
+ vcs.register(Git)
ACE_plus/flashenv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Orchestrator for building wheels from InstallRequirements."""
2
+
3
+ import logging
4
+ import os.path
5
+ import re
6
+ import shutil
7
+ from typing import Iterable, List, Optional, Tuple
8
+
9
+ from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version
10
+ from pip._vendor.packaging.version import InvalidVersion, Version
11
+
12
+ from pip._internal.cache import WheelCache
13
+ from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel
14
+ from pip._internal.metadata import FilesystemWheel, get_wheel_distribution
15
+ from pip._internal.models.link import Link
16
+ from pip._internal.models.wheel import Wheel
17
+ from pip._internal.operations.build.wheel import build_wheel_pep517
18
+ from pip._internal.operations.build.wheel_editable import build_wheel_editable
19
+ from pip._internal.operations.build.wheel_legacy import build_wheel_legacy
20
+ from pip._internal.req.req_install import InstallRequirement
21
+ from pip._internal.utils.logging import indent_log
22
+ from pip._internal.utils.misc import ensure_dir, hash_file
23
+ from pip._internal.utils.setuptools_build import make_setuptools_clean_args
24
+ from pip._internal.utils.subprocess import call_subprocess
25
+ from pip._internal.utils.temp_dir import TempDirectory
26
+ from pip._internal.utils.urls import path_to_url
27
+ from pip._internal.vcs import vcs
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+ _egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE)
32
+
33
+ BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]]
34
+
35
+
36
+ def _contains_egg_info(s: str) -> bool:
37
+ """Determine whether the string looks like an egg_info.
38
+
39
+ :param s: The string to parse. E.g. foo-2.1
40
+ """
41
+ return bool(_egg_info_re.search(s))
42
+
43
+
44
+ def _should_build(
45
+ req: InstallRequirement,
46
+ ) -> bool:
47
+ """Return whether an InstallRequirement should be built into a wheel."""
48
+ assert not req.constraint
49
+
50
+ if req.is_wheel:
51
+ return False
52
+
53
+ assert req.source_dir
54
+
55
+ if req.editable:
56
+ # we only build PEP 660 editable requirements
57
+ return req.supports_pyproject_editable
58
+
59
+ return True
60
+
61
+
62
+ def should_build_for_install_command(
63
+ req: InstallRequirement,
64
+ ) -> bool:
65
+ return _should_build(req)
66
+
67
+
68
+ def _should_cache(
69
+ req: InstallRequirement,
70
+ ) -> Optional[bool]:
71
+ """
72
+ Return whether a built InstallRequirement can be stored in the persistent
73
+ wheel cache, assuming the wheel cache is available, and _should_build()
74
+ has determined a wheel needs to be built.
75
+ """
76
+ if req.editable or not req.source_dir:
77
+ # never cache editable requirements
78
+ return False
79
+
80
+ if req.link and req.link.is_vcs:
81
+ # VCS checkout. Do not cache
82
+ # unless it points to an immutable commit hash.
83
+ assert not req.editable
84
+ assert req.source_dir
85
+ vcs_backend = vcs.get_backend_for_scheme(req.link.scheme)
86
+ assert vcs_backend
87
+ if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir):
88
+ return True
89
+ return False
90
+
91
+ assert req.link
92
+ base, ext = req.link.splitext()
93
+ if _contains_egg_info(base):
94
+ return True
95
+
96
+ # Otherwise, do not cache.
97
+ return False
98
+
99
+
100
+ def _get_cache_dir(
101
+ req: InstallRequirement,
102
+ wheel_cache: WheelCache,
103
+ ) -> str:
104
+ """Return the persistent or temporary cache directory where the built
105
+ wheel need to be stored.
106
+ """
107
+ cache_available = bool(wheel_cache.cache_dir)
108
+ assert req.link
109
+ if cache_available and _should_cache(req):
110
+ cache_dir = wheel_cache.get_path_for_link(req.link)
111
+ else:
112
+ cache_dir = wheel_cache.get_ephem_path_for_link(req.link)
113
+ return cache_dir
114
+
115
+
116
+ def _verify_one(req: InstallRequirement, wheel_path: str) -> None:
117
+ canonical_name = canonicalize_name(req.name or "")
118
+ w = Wheel(os.path.basename(wheel_path))
119
+ if canonicalize_name(w.name) != canonical_name:
120
+ raise InvalidWheelFilename(
121
+ f"Wheel has unexpected file name: expected {canonical_name!r}, "
122
+ f"got {w.name!r}",
123
+ )
124
+ dist = get_wheel_distribution(FilesystemWheel(wheel_path), canonical_name)
125
+ dist_verstr = str(dist.version)
126
+ if canonicalize_version(dist_verstr) != canonicalize_version(w.version):
127
+ raise InvalidWheelFilename(
128
+ f"Wheel has unexpected file name: expected {dist_verstr!r}, "
129
+ f"got {w.version!r}",
130
+ )
131
+ metadata_version_value = dist.metadata_version
132
+ if metadata_version_value is None:
133
+ raise UnsupportedWheel("Missing Metadata-Version")
134
+ try:
135
+ metadata_version = Version(metadata_version_value)
136
+ except InvalidVersion:
137
+ msg = f"Invalid Metadata-Version: {metadata_version_value}"
138
+ raise UnsupportedWheel(msg)
139
+ if metadata_version >= Version("1.2") and not isinstance(dist.version, Version):
140
+ raise UnsupportedWheel(
141
+ f"Metadata 1.2 mandates PEP 440 version, but {dist_verstr!r} is not"
142
+ )
143
+
144
+
145
+ def _build_one(
146
+ req: InstallRequirement,
147
+ output_dir: str,
148
+ verify: bool,
149
+ build_options: List[str],
150
+ global_options: List[str],
151
+ editable: bool,
152
+ ) -> Optional[str]:
153
+ """Build one wheel.
154
+
155
+ :return: The filename of the built wheel, or None if the build failed.
156
+ """
157
+ artifact = "editable" if editable else "wheel"
158
+ try:
159
+ ensure_dir(output_dir)
160
+ except OSError as e:
161
+ logger.warning(
162
+ "Building %s for %s failed: %s",
163
+ artifact,
164
+ req.name,
165
+ e,
166
+ )
167
+ return None
168
+
169
+ # Install build deps into temporary directory (PEP 518)
170
+ with req.build_env:
171
+ wheel_path = _build_one_inside_env(
172
+ req, output_dir, build_options, global_options, editable
173
+ )
174
+ if wheel_path and verify:
175
+ try:
176
+ _verify_one(req, wheel_path)
177
+ except (InvalidWheelFilename, UnsupportedWheel) as e:
178
+ logger.warning("Built %s for %s is invalid: %s", artifact, req.name, e)
179
+ return None
180
+ return wheel_path
181
+
182
+
183
+ def _build_one_inside_env(
184
+ req: InstallRequirement,
185
+ output_dir: str,
186
+ build_options: List[str],
187
+ global_options: List[str],
188
+ editable: bool,
189
+ ) -> Optional[str]:
190
+ with TempDirectory(kind="wheel") as temp_dir:
191
+ assert req.name
192
+ if req.use_pep517:
193
+ assert req.metadata_directory
194
+ assert req.pep517_backend
195
+ if global_options:
196
+ logger.warning(
197
+ "Ignoring --global-option when building %s using PEP 517", req.name
198
+ )
199
+ if build_options:
200
+ logger.warning(
201
+ "Ignoring --build-option when building %s using PEP 517", req.name
202
+ )
203
+ if editable:
204
+ wheel_path = build_wheel_editable(
205
+ name=req.name,
206
+ backend=req.pep517_backend,
207
+ metadata_directory=req.metadata_directory,
208
+ tempd=temp_dir.path,
209
+ )
210
+ else:
211
+ wheel_path = build_wheel_pep517(
212
+ name=req.name,
213
+ backend=req.pep517_backend,
214
+ metadata_directory=req.metadata_directory,
215
+ tempd=temp_dir.path,
216
+ )
217
+ else:
218
+ wheel_path = build_wheel_legacy(
219
+ name=req.name,
220
+ setup_py_path=req.setup_py_path,
221
+ source_dir=req.unpacked_source_directory,
222
+ global_options=global_options,
223
+ build_options=build_options,
224
+ tempd=temp_dir.path,
225
+ )
226
+
227
+ if wheel_path is not None:
228
+ wheel_name = os.path.basename(wheel_path)
229
+ dest_path = os.path.join(output_dir, wheel_name)
230
+ try:
231
+ wheel_hash, length = hash_file(wheel_path)
232
+ shutil.move(wheel_path, dest_path)
233
+ logger.info(
234
+ "Created wheel for %s: filename=%s size=%d sha256=%s",
235
+ req.name,
236
+ wheel_name,
237
+ length,
238
+ wheel_hash.hexdigest(),
239
+ )
240
+ logger.info("Stored in directory: %s", output_dir)
241
+ return dest_path
242
+ except Exception as e:
243
+ logger.warning(
244
+ "Building wheel for %s failed: %s",
245
+ req.name,
246
+ e,
247
+ )
248
+ # Ignore return, we can't do anything else useful.
249
+ if not req.use_pep517:
250
+ _clean_one_legacy(req, global_options)
251
+ return None
252
+
253
+
254
+ def _clean_one_legacy(req: InstallRequirement, global_options: List[str]) -> bool:
255
+ clean_args = make_setuptools_clean_args(
256
+ req.setup_py_path,
257
+ global_options=global_options,
258
+ )
259
+
260
+ logger.info("Running setup.py clean for %s", req.name)
261
+ try:
262
+ call_subprocess(
263
+ clean_args, command_desc="python setup.py clean", cwd=req.source_dir
264
+ )
265
+ return True
266
+ except Exception:
267
+ logger.error("Failed cleaning build dir for %s", req.name)
268
+ return False
269
+
270
+
271
+ def build(
272
+ requirements: Iterable[InstallRequirement],
273
+ wheel_cache: WheelCache,
274
+ verify: bool,
275
+ build_options: List[str],
276
+ global_options: List[str],
277
+ ) -> BuildResult:
278
+ """Build wheels.
279
+
280
+ :return: The list of InstallRequirement that succeeded to build and
281
+ the list of InstallRequirement that failed to build.
282
+ """
283
+ if not requirements:
284
+ return [], []
285
+
286
+ # Build the wheels.
287
+ logger.info(
288
+ "Building wheels for collected packages: %s",
289
+ ", ".join(req.name for req in requirements), # type: ignore
290
+ )
291
+
292
+ with indent_log():
293
+ build_successes, build_failures = [], []
294
+ for req in requirements:
295
+ assert req.name
296
+ cache_dir = _get_cache_dir(req, wheel_cache)
297
+ wheel_file = _build_one(
298
+ req,
299
+ cache_dir,
300
+ verify,
301
+ build_options,
302
+ global_options,
303
+ req.editable and req.permit_editable_wheels,
304
+ )
305
+ if wheel_file:
306
+ # Record the download origin in the cache
307
+ if req.download_info is not None:
308
+ # download_info is guaranteed to be set because when we build an
309
+ # InstallRequirement it has been through the preparer before, but
310
+ # let's be cautious.
311
+ wheel_cache.record_download_origin(cache_dir, req.download_info)
312
+ # Update the link for this.
313
+ req.link = Link(path_to_url(wheel_file))
314
+ req.local_file_path = req.link.file_path
315
+ assert req.link.is_wheel
316
+ build_successes.append(req)
317
+ else:
318
+ build_failures.append(req)
319
+
320
+ # notify success/failure
321
+ if build_successes:
322
+ logger.info(
323
+ "Successfully built %s",
324
+ " ".join([req.name for req in build_successes]), # type: ignore
325
+ )
326
+ if build_failures:
327
+ logger.info(
328
+ "Failed to build %s",
329
+ " ".join([req.name for req in build_failures]), # type: ignore
330
+ )
331
+ # Return a list of requirements that failed to build
332
+ return build_successes, build_failures
ACE_plus/flashenv/lib/python3.10/site-packages/pip/py.typed ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ pip is a command line program. While it is implemented in Python, and so is
2
+ available for import, you must not use pip's internal APIs in this way. Typing
3
+ information is provided as a convenience only and is not a guarantee. Expect
4
+ unannounced changes to the API and types in releases.
ACE_plus/flashenv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
ACE_plus/flashenv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright Jason R. Coombs
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ IN THE SOFTWARE.
ACE_plus/flashenv/lib/python3.10/site-packages/setuptools-65.5.0.dist-info/METADATA ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: setuptools
3
+ Version: 65.5.0
4
+ Summary: Easily download, build, install, upgrade, and uninstall Python packages
5
+ Home-page: https://github.com/pypa/setuptools
6
+ Author: Python Packaging Authority
7
+ Author-email: distutils-sig@python.org
8
+ Project-URL: Documentation, https://setuptools.pypa.io/
9
+ Project-URL: Changelog, https://setuptools.pypa.io/en/stable/history.html
10
+ Keywords: CPAN PyPI distutils eggs package management
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
+ Classifier: Topic :: System :: Archiving :: Packaging
18
+ Classifier: Topic :: System :: Systems Administration
19
+ Classifier: Topic :: Utilities
20
+ Requires-Python: >=3.7
21
+ License-File: LICENSE
22
+ Provides-Extra: certs
23
+ Provides-Extra: docs
24
+ Requires-Dist: sphinx (>=3.5) ; extra == 'docs'
25
+ Requires-Dist: jaraco.packaging (>=9) ; extra == 'docs'
26
+ Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
27
+ Requires-Dist: furo ; extra == 'docs'
28
+ Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs'
29
+ Requires-Dist: pygments-github-lexers (==0.0.5) ; extra == 'docs'
30
+ Requires-Dist: sphinx-favicon ; extra == 'docs'
31
+ Requires-Dist: sphinx-inline-tabs ; extra == 'docs'
32
+ Requires-Dist: sphinx-reredirects ; extra == 'docs'
33
+ Requires-Dist: sphinxcontrib-towncrier ; extra == 'docs'
34
+ Requires-Dist: sphinx-notfound-page (==0.8.3) ; extra == 'docs'
35
+ Requires-Dist: sphinx-hoverxref (<2) ; extra == 'docs'
36
+ Provides-Extra: ssl
37
+ Provides-Extra: testing
38
+ Requires-Dist: pytest (>=6) ; extra == 'testing'
39
+ Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing'
40
+ Requires-Dist: pytest-flake8 ; extra == 'testing'
41
+ Requires-Dist: flake8 (<5) ; extra == 'testing'
42
+ Requires-Dist: pytest-enabler (>=1.3) ; extra == 'testing'
43
+ Requires-Dist: pytest-perf ; extra == 'testing'
44
+ Requires-Dist: mock ; extra == 'testing'
45
+ Requires-Dist: flake8-2020 ; extra == 'testing'
46
+ Requires-Dist: virtualenv (>=13.0.0) ; extra == 'testing'
47
+ Requires-Dist: wheel ; extra == 'testing'
48
+ Requires-Dist: pip (>=19.1) ; extra == 'testing'
49
+ Requires-Dist: jaraco.envs (>=2.2) ; extra == 'testing'
50
+ Requires-Dist: pytest-xdist ; extra == 'testing'
51
+ Requires-Dist: jaraco.path (>=3.2.0) ; extra == 'testing'
52
+ Requires-Dist: build[virtualenv] ; extra == 'testing'
53
+ Requires-Dist: filelock (>=3.4.0) ; extra == 'testing'
54
+ Requires-Dist: pip-run (>=8.8) ; extra == 'testing'
55
+ Requires-Dist: ini2toml[lite] (>=0.9) ; extra == 'testing'
56
+ Requires-Dist: tomli-w (>=1.0.0) ; extra == 'testing'
57
+ Provides-Extra: testing-integration
58
+ Requires-Dist: pytest ; extra == 'testing-integration'
59
+ Requires-Dist: pytest-xdist ; extra == 'testing-integration'
60
+ Requires-Dist: pytest-enabler ; extra == 'testing-integration'
61
+ Requires-Dist: virtualenv (>=13.0.0) ; extra == 'testing-integration'
62
+ Requires-Dist: tomli ; extra == 'testing-integration'
63
+ Requires-Dist: wheel ; extra == 'testing-integration'
64
+ Requires-Dist: jaraco.path (>=3.2.0) ; extra == 'testing-integration'
65
+ Requires-Dist: jaraco.envs (>=2.2) ; extra == 'testing-integration'
66
+ Requires-Dist: build[virtualenv] ; extra == 'testing-integration'
67
+ Requires-Dist: filelock (>=3.4.0) ; extra == 'testing-integration'
68
+ Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
69
+ Requires-Dist: pytest-cov ; (platform_python_implementation != "PyPy") and extra == 'testing'
70
+ Requires-Dist: pytest-mypy (>=0.9.1) ; (platform_python_implementation != "PyPy") and extra == 'testing'
71
+
72
+ .. image:: https://raw.githubusercontent.com/pypa/setuptools/main/docs/images/banner-640x320.svg
73
+ :align: center
74
+
75
+ |
76
+
77
+ .. image:: https://img.shields.io/pypi/v/setuptools.svg
78
+ :target: `PyPI link`_
79
+
80
+ .. image:: https://img.shields.io/pypi/pyversions/setuptools.svg
81
+ :target: `PyPI link`_
82
+
83
+ .. _PyPI link: https://pypi.org/project/setuptools
84
+
85
+ .. image:: https://github.com/pypa/setuptools/workflows/tests/badge.svg
86
+ :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22
87
+ :alt: tests
88
+
89
+ .. image:: https://img.shields.io/badge/code%20style-black-000000.svg
90
+ :target: https://github.com/psf/black
91
+ :alt: Code style: Black
92
+
93
+ .. image:: https://img.shields.io/readthedocs/setuptools/latest.svg
94
+ :target: https://setuptools.pypa.io
95
+
96
+ .. image:: https://img.shields.io/badge/skeleton-2022-informational
97
+ :target: https://blog.jaraco.com/skeleton
98
+
99
+ .. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
100
+ :target: https://codecov.io/gh/pypa/setuptools
101
+
102
+ .. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat
103
+ :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme
104
+
105
+ .. image:: https://img.shields.io/discord/803025117553754132
106
+ :target: https://discord.com/channels/803025117553754132/815945031150993468
107
+ :alt: Discord
108
+
109
+ See the `Installation Instructions
110
+ <https://packaging.python.org/installing/>`_ in the Python Packaging
111
+ User's Guide for instructions on installing, upgrading, and uninstalling
112
+ Setuptools.
113
+
114
+ Questions and comments should be directed to `GitHub Discussions
115
+ <https://github.com/pypa/setuptools/discussions>`_.
116
+ Bug reports and especially tested patches may be
117
+ submitted directly to the `bug tracker
118
+ <https://github.com/pypa/setuptools/issues>`_.
119
+
120
+
121
+ Code of Conduct
122
+ ===============
123
+
124
+ Everyone interacting in the setuptools project's codebases, issue trackers,
125
+ chat rooms, and fora is expected to follow the
126
+ `PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.
127
+
128
+
129
+ For Enterprise
130
+ ==============
131
+
132
+ Available as part of the Tidelift Subscription.
133
+
134
+ Setuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
135
+
136
+ `Learn more <https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=referral&utm_campaign=github>`_.
137
+
138
+
139
+ Security Contact
140
+ ================
141
+
142
+ To report a security vulnerability, please use the
143
+ `Tidelift security contact <https://tidelift.com/security>`_.
144
+ Tidelift will coordinate the fix and disclosure.