diff --git a/.gitignore b/.gitignore index f1c7688..aa4cf5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,23 @@ -build -dist -test* -tmp* -*.log -*.zip -*.txt +# Build artifacts +build/ +dist/ +*.egg-info/ + +# Python cache +__pycache__/ *.pyc -*.pkl -*.txt -__pycache__ -data -*.csv -notebooks -*.egg-info -2024-05-09 + +# Runtime and temporary files +tmp*/ +*.log + +# BMRB data and pipeline output (large, local-only) +data/ + +# Local working directories +docs/ +notebooks/ + +# Test scripts (local integration tests, not part of package) +test/ + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..522d369 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,92 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "trizod" +version = "0.0.1" +description = "Modern disorder scores for BMRB data" +readme = "README.md" +requires-python = ">=3.9" +license = {text = "AGPL-3.0"} +authors = [ + {name = "Markus Haak", email = "markus.haak@tum.de"}, + {name = "Tobias Senoner", email = "tobias.senoner@tum.de"} +] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU Affero General Public License v3", + "Operating System :: OS Independent", + "Topic :: Scientific/Engineering :: Bio-Informatics", + "Intended Audience :: Science/Research", +] +dependencies = [ + "pandas", + "numpy", + "matplotlib", + "tqdm", + "pandarallel", + "pynmrstar", + "scipy", +] + +[project.urls] +Repository = "https://github.com/MarkusHaak/trizod" + +[project.scripts] +trizod = "trizod.trizod:main" + +[tool.hatch.build.targets.wheel] +packages = ["trizod"] + +[tool.hatch.build.targets.wheel.force-include] +"trizod/potenci/data" = "trizod/potenci/data" + +[dependency-groups] +dev = [ + "ruff", +] + +[tool.ruff] +line-length = 100 +indent-width = 4 + +# Exclude legacy code and generated files +exclude = [ + "trizod/potenci/legacy", + "test", + "__pycache__", + "*.pyc", + ".git", + ".venv", + "build", + "dist", +] + +[tool.ruff.lint] +# Enable recommended rules for scientific Python code +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # Pyflakes + "I", # isort + "N", # pep8-naming + "UP", # pyupgrade + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "SIM", # flake8-simplify +] + +# Ignore specific rules that are too strict for scientific code +ignore = [ + "E501", # Line too long (handled by formatter) + "N803", # Argument name should be lowercase (scientific conventions) + "N806", # Variable in function should be lowercase (scientific conventions) +] + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = false +line-ending = "auto" + diff --git a/setup.py b/setup.py deleted file mode 100644 index 74c8bed..0000000 --- a/setup.py +++ /dev/null @@ -1,41 +0,0 @@ -import setuptools - -with open("README.md", "r") as f: - long_description = f.read() - -from trizod import META_DATA, __version__ -VERSION = __version__ - -setuptools.setup( - name=META_DATA['package_name'].lower(), - version=VERSION, - author=META_DATA['author'], - author_email=META_DATA['author_email'], - description=META_DATA['description'], - long_description=long_description, - long_description_content_type="text/markdown", - url=META_DATA['github_url'], - packages=setuptools.find_packages(), - include_package_data=True, - package_data={'': ['potenci/data_tables/*.csv']}, - install_requires=[ - 'pandas', - 'numpy', - 'matplotlib', - 'tqdm', - 'pandarallel', - 'pynmrstar', - 'scipy' - ], - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: GNU AFFERO GENERAL PUBLIC LICENSE Version 3", - "Operating System :: OS Independent", - "Topic :: Scientific/Engineering :: Bio-Informatics", - "Intended Audience :: Science/Research" - ], - entry_points={ - 'console_scripts': [ - 'trizod=trizod.trizod:main', - ]}, -) \ No newline at end of file diff --git a/test/test_cache_equality.py b/test/test_cache_equality.py index 9988efa..16fcb70 100644 --- a/test/test_cache_equality.py +++ b/test/test_cache_equality.py @@ -1,49 +1,88 @@ -import os,sys +import argparse import logging +import os + import numpy as np import pandas as pd -import argparse + from trizod.constants import BBATNS + def parse_args(): - parser = argparse.ArgumentParser(description='') + parser = argparse.ArgumentParser(description="") - parser.add_argument('cache_dir', - help='Cache directory that shall be tested.') - parser.add_argument('cache_comp', - help='Cache directory to compare against.') + parser.add_argument("cache_dir", help="Cache directory that shall be tested.") + parser.add_argument("cache_comp", help="Cache directory to compare against.") args = parser.parse_args() return args + def main(): - cache_files = {f for f in os.listdir(os.path.join(args.cache_dir, 'wSCS')) if os.path.isfile(os.path.join(args.cache_dir, 'wSCS', f)) and f.endswith('.npz')} - comp_files = {f for f in os.listdir(os.path.join(args.cache_comp, 'wSCS')) if os.path.isfile(os.path.join(args.cache_comp, 'wSCS', f)) and f.endswith('.npz')} + cache_files = { + f + for f in os.listdir(os.path.join(args.cache_dir, "wSCS")) + if os.path.isfile(os.path.join(args.cache_dir, "wSCS", f)) and f.endswith(".npz") + } + comp_files = { + f + for f in os.listdir(os.path.join(args.cache_comp, "wSCS")) + if os.path.isfile(os.path.join(args.cache_comp, "wSCS", f)) and f.endswith(".npz") + } common_files = list(cache_files & comp_files) common_files.sort() print(len(common_files)) res = [] for fn in common_files: - with open(os.path.join(args.cache_dir, 'wSCS', fn), 'rb') as f1, open(os.path.join(args.cache_comp, 'wSCS', fn), 'rb') as f2: + with open(os.path.join(args.cache_dir, "wSCS", fn), "rb") as f1, open( + os.path.join(args.cache_comp, "wSCS", fn), "rb" + ) as f2: z = np.load(f1) - shw, ashwi, cmp_mask, olf, offf, shw0, ashwi0, ol0, off0 = z['shw'], z['ashwi'], z['cmp_mask'], z['olf'], z['offf'], z['shw0'], z['ashwi0'], z['ol0'], z['off0'] - offf, off0 = {at:off for at,off in zip(BBATNS, offf)}, {at:off for at,off in zip(BBATNS, off0)} - - z = np.load(f2) - shw_, ashwi_, cmp_mask_, olf_, offf_, shw0_, ashwi0_, ol0_, off0_ = z['shw'], z['ashwi'], z['cmp_mask'], z['olf'], z['offf'], z['shw0'], z['ashwi0'], z['ol0'], z['off0'] - offf_, off0_ = {at:off for at,off in zip(BBATNS, offf_)}, {at:off for at,off in zip(BBATNS, off0_)} + shw, ashwi, cmp_mask, olf, offf, shw0, ashwi0, ol0, off0 = ( + z["shw"], + z["ashwi"], + z["cmp_mask"], + z["olf"], + z["offf"], + z["shw0"], + z["ashwi0"], + z["ol0"], + z["off0"], + ) + offf, off0 = ( + {at: off for at, off in zip(BBATNS, offf)}, + {at: off for at, off in zip(BBATNS, off0)}, + ) + + z = np.load(f2) + shw_, ashwi_, cmp_mask_, olf_, offf_, shw0_, ashwi0_, ol0_, off0_ = ( + z["shw"], + z["ashwi"], + z["cmp_mask"], + z["olf"], + z["offf"], + z["shw0"], + z["ashwi0"], + z["ol0"], + z["off0"], + ) + offf_, off0_ = ( + {at: off for at, off in zip(BBATNS, offf_)}, + {at: off for at, off in zip(BBATNS, off0_)}, + ) if ashwi.shape != ashwi_.shape: res.append("shape mismatch") continue if not np.allclose(ashwi, ashwi_): - res.append('not close') + res.append("not close") continue - res.append('close') - df = pd.DataFrame(res, columns=['result'], index=common_files) + res.append("close") + df = pd.DataFrame(res, columns=["result"], index=common_files) breakpoint() -if __name__ == '__main__': + +if __name__ == "__main__": level = logging.INFO - logging.basicConfig(level=level, format=f'%(levelname)s : %(message)s') + logging.basicConfig(level=level, format=f"%(levelname)s : %(message)s") args = parse_args() - main() \ No newline at end of file + main() diff --git a/trizod/bmrb/__init__.py b/trizod/bmrb/__init__.py index 1f77395..e935d7d 100644 --- a/trizod/bmrb/__init__.py +++ b/trizod/bmrb/__init__.py @@ -1 +1,3 @@ -from .bmrb import BmrbEntry, get_valid_bbshifts \ No newline at end of file +from .bmrb import BmrbEntry, get_valid_bbshifts + +__all__ = ["BmrbEntry", "get_valid_bbshifts"] diff --git a/trizod/bmrb/bmrb.py b/trizod/bmrb/bmrb.py index 7950b80..346c1b4 100644 --- a/trizod/bmrb/bmrb.py +++ b/trizod/bmrb/bmrb.py @@ -1,278 +1,326 @@ -import os import logging -import pynmrstar +import os + import numpy as np import pandas as pd +import pynmrstar + from trizod.constants import AA3TO1, BBATNS -def get_tag_vals(sf, tag, warn=None, default=None, strip_str=False, indices=None, empty_val_str='.'): + +def get_tag_vals( + sf, tag, warn=None, default=None, strip_str=False, indices=None, empty_val_str="." +): try: vals = sf.get_tag(tag) if strip_str: vals = [v.strip() for v in vals] if empty_val_str: - vals = [v if v != empty_val_str else '' for v in vals] + vals = [v if v != empty_val_str else "" for v in vals] if indices is not None: - if type(indices) == list: - vals = [vals[i] for i in indices] - else: - vals = vals[indices] + vals = [vals[i] for i in indices] if isinstance(indices, list) else vals[indices] return vals - except: + except Exception as e: if warn: - logging.getLogger('trizod.bmrb').warning(warn) - logging.getLogger('trizod.bmrb').debug(f'failed to retrieve tag {tag}') + logging.getLogger("trizod.bmrb").warning(warn) + logging.getLogger("trizod.bmrb").debug(f"failed to retrieve tag {tag}: {e}") return default -class Entity(object): + +class Entity: def __init__(self, sf): - super(Entity, self).__init__() - self.id = get_tag_vals(sf, '_Entity.ID', indices=0) - self.name = get_tag_vals(sf, '_Entity.Name', indices=0) - self.details = get_tag_vals(sf, '_Entity.Details', indices=0) - self.type = get_tag_vals(sf, '_Entity.Type', indices=0) - self.polymer_type = get_tag_vals(sf, '_Entity.Polymer_type', indices=0) - self.polymer_type_details = get_tag_vals(sf, '_Entity.Polymer_type_details', indices=0) - self.polymer_author_seq_details = get_tag_vals(sf, '_Entity.Polymer_author_seq_details', indices=0) - self.seq = get_tag_vals(sf, '_Entity.Polymer_seq_one_letter_code', indices=0) - if self.seq is not None and self.seq not in ['', '.']: - self.seq = self.seq.replace('\n', '').strip().upper() + super().__init__() + self.id = get_tag_vals(sf, "_Entity.ID", indices=0) + self.name = get_tag_vals(sf, "_Entity.Name", indices=0) + self.details = get_tag_vals(sf, "_Entity.Details", indices=0) + self.type = get_tag_vals(sf, "_Entity.Type", indices=0) + self.polymer_type = get_tag_vals(sf, "_Entity.Polymer_type", indices=0) + self.polymer_type_details = get_tag_vals(sf, "_Entity.Polymer_type_details", indices=0) + self.polymer_author_seq_details = get_tag_vals( + sf, "_Entity.Polymer_author_seq_details", indices=0 + ) + self.seq = get_tag_vals(sf, "_Entity.Polymer_seq_one_letter_code", indices=0) + if self.seq is not None and self.seq not in ["", "."]: + self.seq = self.seq.replace("\n", "").strip().upper() else: self.seq = None - self.fragment = get_tag_vals(sf, '_Entity.Fragment') - self.weight = get_tag_vals(sf, '_Entity.Formula_weight') - self.db_links = list(zip( - get_tag_vals(sf, '_Entity_db_link.Database_code', default=[]), - get_tag_vals(sf, '_Entity_db_link.Accession_code', default=[]), - get_tag_vals(sf, '_Entity_db_link.Entry_mol_code', default=[]), - get_tag_vals(sf, '_Entity_db_link.Seq_query_to_submitted_percent', default=[]), - get_tag_vals(sf, '_Entity_db_link.Seq_identity', default=[]) - )) - + self.fragment = get_tag_vals(sf, "_Entity.Fragment") + self.weight = get_tag_vals(sf, "_Entity.Formula_weight") + self.db_links = list( + zip( + get_tag_vals(sf, "_Entity_db_link.Database_code", default=[]), + get_tag_vals(sf, "_Entity_db_link.Accession_code", default=[]), + get_tag_vals(sf, "_Entity_db_link.Entry_mol_code", default=[]), + get_tag_vals(sf, "_Entity_db_link.Seq_query_to_submitted_percent", default=[]), + get_tag_vals(sf, "_Entity_db_link.Seq_identity", default=[]), + ) + ) + def __str__(self): if self.seq is not None: - seq_str = f', seq="{self.seq[:10] + "..." if type(self.seq) == str and len(self.seq) > 13 else self.seq}"' + seq_str = f', seq="{self.seq[:10] + "..." if isinstance(self.seq, str) and len(self.seq) > 13 else self.seq}"' else: seq_str = "" return f'(Entity {self.id}: name="{self.name}", type="{self.type}"{seq_str})' - + def __repr__(self): return f"" -class Assembly(object): + +class Assembly: def __init__(self, sf): - super(Assembly, self).__init__() - self.name = get_tag_vals(sf, '_Assembly.Name', indices=0) - self.id = get_tag_vals(sf, '_Assembly.ID', indices=0) - self.details = get_tag_vals(sf, '_Assembly.Details', indices=0) - self.n_components = get_tag_vals(sf, '_Assembly.Number_of_components', indices=0) - self.organic_ligands = get_tag_vals(sf, '_Assembly.Organic_ligands', indices=0) - self.metal_ions = get_tag_vals(sf, '_Assembly.Metal_ions', indices=0) - self.molecules_in_chemical_exchange = get_tag_vals(sf, '_Assembly.Molecules_in_chemical_exchange', indices=0) - self.entities = list(zip( - get_tag_vals(sf, '_Entity_assembly.ID', default=[]), - get_tag_vals(sf, '_Entity_assembly.Entity_ID', default=[]), - get_tag_vals(sf, '_Entity_assembly.Entity_label', default=[]), - get_tag_vals(sf, '_Entity_assembly.Physical_state', default=[]) - )) - + super().__init__() + self.name = get_tag_vals(sf, "_Assembly.Name", indices=0) + self.id = get_tag_vals(sf, "_Assembly.ID", indices=0) + self.details = get_tag_vals(sf, "_Assembly.Details", indices=0) + self.n_components = get_tag_vals(sf, "_Assembly.Number_of_components", indices=0) + self.organic_ligands = get_tag_vals(sf, "_Assembly.Organic_ligands", indices=0) + self.metal_ions = get_tag_vals(sf, "_Assembly.Metal_ions", indices=0) + self.molecules_in_chemical_exchange = get_tag_vals( + sf, "_Assembly.Molecules_in_chemical_exchange", indices=0 + ) + self.entities = list( + zip( + get_tag_vals(sf, "_Entity_assembly.ID", default=[]), + get_tag_vals(sf, "_Entity_assembly.Entity_ID", default=[]), + get_tag_vals(sf, "_Entity_assembly.Entity_label", default=[]), + get_tag_vals(sf, "_Entity_assembly.Physical_state", default=[]), + ) + ) + def __str__(self): - return f'(Assembly {self.id}: entities {[(e[0], e[1]) for e in self.entities]}, {self.n_components} components)' - + return f"(Assembly {self.id}: entities {[(e[0], e[1]) for e in self.entities]}, {self.n_components} components)" + def __repr__(self): return f"" -class SampleConditions(object): + +class SampleConditions: def __init__(self, sf): - super(SampleConditions, self).__init__() - self.id = get_tag_vals(sf, '_Sample_condition_list.ID', indices=0) + super().__init__() + self.id = get_tag_vals(sf, "_Sample_condition_list.ID", indices=0) self.ionic_strength = (None, None) self.pH = (None, None) self.pressure = (None, None) self.temperature = (None, None) - info = list(zip( - get_tag_vals(sf, '_Sample_condition_variable.Type', default=[]), - get_tag_vals(sf, '_Sample_condition_variable.Val', default=[]), - get_tag_vals(sf, '_Sample_condition_variable.Val_units', default=[]) - )) - for t,val,unit in info: - if 'ionic strength' in t.lower(): + info = list( + zip( + get_tag_vals(sf, "_Sample_condition_variable.Type", default=[]), + get_tag_vals(sf, "_Sample_condition_variable.Val", default=[]), + get_tag_vals(sf, "_Sample_condition_variable.Val_units", default=[]), + ) + ) + for t, val, unit in info: + if "ionic strength" in t.lower(): self.ionic_strength = (val, unit) - elif t.lower() == 'ph': + elif t.lower() == "ph": self.pH = (val, unit) - elif t.lower() == 'pressure': + elif t.lower() == "pressure": self.pressure = (val, unit) - elif 'temp' in t.lower(): + elif "temp" in t.lower(): self.temperature = (val, unit) else: - logging.getLogger('trizod.bmrb').debug(f'Skipping sample condition {t} = {val} {unit}') + logging.getLogger("trizod.bmrb").debug( + f"Skipping sample condition {t} = {val} {unit}" + ) def convert_val(self, val): try: val = float(val) - except: - logging.getLogger('trizod.bmrb').debug(f'failed to convert value {val}') + except (ValueError, TypeError) as e: + logging.getLogger("trizod.bmrb").debug(f"failed to convert value {val}: {e}") val = np.nan return val - def get_pH(self, return_default=True): + def get_ph(self, return_default=True): val = self.convert_val(self.pH[0]) if np.isnan(val) and return_default: - logging.getLogger('trizod.bmrb').info(f'No information on pH for sample condition {self.id}, assuming 7.0') + logging.getLogger("trizod.bmrb").info( + f"No information on pH for sample condition {self.id}, assuming 7.0" + ) return 7.0 return val - + def get_temperature(self, return_default=True, assume_si=True, fix_outliers=True): val = self.convert_val(self.temperature[0]) if np.isnan(val): if return_default: - logging.getLogger('trizod.bmrb').info(f'No information on temperature for sample condition {self.id}, assuming 298 K') - return 298. + logging.getLogger("trizod.bmrb").info( + f"No information on temperature for sample condition {self.id}, assuming 298 K" + ) + return 298.0 else: return np.nan - if 'C' in self.temperature[1]: - const0, const1, factor = 0., 273.15, 1. - elif 'F' in self.temperature[1]: - const0, const1, factor = -32., 273.15, 1.8 - elif self.temperature[1] == 'K': - const0, const1, factor = 0., 0., 1. + if "C" in self.temperature[1]: + const0, const1, factor = 0.0, 273.15, 1.0 + elif "F" in self.temperature[1]: + const0, const1, factor = -32.0, 273.15, 1.8 + elif self.temperature[1] == "K": + const0, const1, factor = 0.0, 0.0, 1.0 elif assume_si: - const0, const1, factor = 0., 0., 1. - logging.getLogger('trizod.bmrb').info(f'Temperature unit unknown: {self.temperature[1]}, assuming K') + const0, const1, factor = 0.0, 0.0, 1.0 + logging.getLogger("trizod.bmrb").info( + f"Temperature unit unknown: {self.temperature[1]}, assuming K" + ) else: return None - if fix_outliers and const1 == 0.: # not explicitly °C or °F + if fix_outliers and const1 == 0.0: # not explicitly °C or °F if 15 <= val < 50: - logging.getLogger('trizod.bmrb').info(f'Very low temperature: {val}, assuming unit should be °C') - const0, const1, factor = 0., 273.15, 1. + logging.getLogger("trizod.bmrb").info( + f"Very low temperature: {val}, assuming unit should be °C" + ) + const0, const1, factor = 0.0, 273.15, 1.0 elif 50 <= val <= 100: - const0, const1, factor = -32., 273.15, 1.8 - logging.getLogger('trizod.bmrb').info(f'Low temperature: {val}, assuming unit should be °F') + const0, const1, factor = -32.0, 273.15, 1.8 + logging.getLogger("trizod.bmrb").info( + f"Low temperature: {val}, assuming unit should be °F" + ) return (val + const0) * factor + const1 - + def get_pressure(self): # TODO: implement return - + def get_ionic_strength(self, return_default=True, assume_si=True, fix_outliers=True): val = self.convert_val(self.ionic_strength[0]) if np.isnan(val): if return_default: - logging.getLogger('trizod.bmrb').info(f'No information on ionic strength for sample condition {self.id}, assuming 0.1 M') + logging.getLogger("trizod.bmrb").info( + f"No information on ionic strength for sample condition {self.id}, assuming 0.1 M" + ) return 0.1 else: return None - if self.ionic_strength[1] == 'M': - const1, factor = 0., 1. - elif self.ionic_strength[1] == 'mM': - const1, factor = 0., 0.001 - elif self.ionic_strength[1] == 'mu': - const1, factor = 0., 0.000001 + if self.ionic_strength[1] == "M": + const1, factor = 0.0, 1.0 + elif self.ionic_strength[1] == "mM": + const1, factor = 0.0, 0.001 + elif self.ionic_strength[1] == "mu": + const1, factor = 0.0, 0.000001 elif assume_si: - const1, factor = 0., 1. - logging.getLogger('trizod.bmrb').info(f'Ionic strength unit unknown: {self.ionic_strength[1]}, assuming K') + const1, factor = 0.0, 1.0 + logging.getLogger("trizod.bmrb").info( + f"Ionic strength unit unknown: {self.ionic_strength[1]}, assuming K" + ) else: return np.nan - if fix_outliers and factor == 1.: - if val > 5: - logging.getLogger('trizod.bmrb').info(f'High ionic strength: {val}, assuming unit should be mM') - factor = 0.001 + if fix_outliers and factor == 1.0 and val > 5: + logging.getLogger("trizod.bmrb").info( + f"High ionic strength: {val}, assuming unit should be mM" + ) + factor = 0.001 return val * factor + const1 def __str__(self): - return f'(Conditions {self.id}: pH {self.get_pH()}, {self.get_temperature()} K, {self.get_ionic_strength()} M)' - + return f"(Conditions {self.id}: pH {self.get_ph()}, {self.get_temperature()} K, {self.get_ionic_strength()} M)" + def __repr__(self): return f"" -class Sample(object): + +class Sample: def __init__(self, sf): - super(Sample, self).__init__() - self.id = get_tag_vals(sf, '_Sample.ID', indices=0) - self.name = get_tag_vals(sf, '_Sample.Name', indices=0) - self.framecode = get_tag_vals(sf, '_Sample.Sf_framecode', indices=0) - self.details = get_tag_vals(sf, '_Sample.Details', indices=0) - self.type = get_tag_vals(sf, '_Sample.Type', indices=0) - self.sub_type = get_tag_vals(sf, '_Sample.Sub_type', indices=0) - self.components = list(zip( - get_tag_vals(sf, '_Sample_component.ID', default=[]), - get_tag_vals(sf, '_Sample_component.Assembly_ID', default=[]), - get_tag_vals(sf, '_Sample_component.Entity_ID', default=[]), - get_tag_vals(sf, '_Sample_component.Mol_common_name', default=[]), - get_tag_vals(sf, '_Sample_component.Concentration_val', default=[]), - get_tag_vals(sf, '_Sample_component.Concentration_val_units', default=[]) - )) - + super().__init__() + self.id = get_tag_vals(sf, "_Sample.ID", indices=0) + self.name = get_tag_vals(sf, "_Sample.Name", indices=0) + self.framecode = get_tag_vals(sf, "_Sample.Sf_framecode", indices=0) + self.details = get_tag_vals(sf, "_Sample.Details", indices=0) + self.type = get_tag_vals(sf, "_Sample.Type", indices=0) + self.sub_type = get_tag_vals(sf, "_Sample.Sub_type", indices=0) + self.components = list( + zip( + get_tag_vals(sf, "_Sample_component.ID", default=[]), + get_tag_vals(sf, "_Sample_component.Assembly_ID", default=[]), + get_tag_vals(sf, "_Sample_component.Entity_ID", default=[]), + get_tag_vals(sf, "_Sample_component.Mol_common_name", default=[]), + get_tag_vals(sf, "_Sample_component.Concentration_val", default=[]), + get_tag_vals(sf, "_Sample_component.Concentration_val_units", default=[]), + ) + ) + def __str__(self): - return f'(Sample {self.id}: type {self.type}, components: {[(c[0],c[1],c[2]) for c in self.components]})' - + return f"(Sample {self.id}: type {self.type}, components: {[(c[0], c[1], c[2]) for c in self.components]})" + def __repr__(self): return f"" -class ExperimentList(object): + +class ExperimentList: def __init__(self, sf): - super(ExperimentList, self).__init__() - self.id = get_tag_vals(sf, '_Experiment_list.ID', indices=0) - self.details = get_tag_vals(sf, '_Experiment_list.Details', indices=0) - self.experiments = list(zip( - get_tag_vals(sf, '_Experiment.ID', default=[]), - get_tag_vals(sf, '_Experiment.Name', default=[]), - get_tag_vals(sf, '_Experiment.Raw_data_flag', default=[]), - get_tag_vals(sf, '_Experiment.Sample_ID', default=[]), - get_tag_vals(sf, '_Experiment.Sample_label', default=[]), - get_tag_vals(sf, '_Experiment.Sample_state', default=[]), - get_tag_vals(sf, '_Experiment.Sample_condition_list_ID', default=[]), - get_tag_vals(sf, '_Experiment.Sample_condition_list_label', default=[]), - get_tag_vals(sf, '_Experiment.Mass_spectrometer_ID', default=[]), - get_tag_vals(sf, '_Experiment.Mass_spectrometer_label', default=[]), - )) - + super().__init__() + self.id = get_tag_vals(sf, "_Experiment_list.ID", indices=0) + self.details = get_tag_vals(sf, "_Experiment_list.Details", indices=0) + self.experiments = list( + zip( + get_tag_vals(sf, "_Experiment.ID", default=[]), + get_tag_vals(sf, "_Experiment.Name", default=[]), + get_tag_vals(sf, "_Experiment.Raw_data_flag", default=[]), + get_tag_vals(sf, "_Experiment.Sample_ID", default=[]), + get_tag_vals(sf, "_Experiment.Sample_label", default=[]), + get_tag_vals(sf, "_Experiment.Sample_state", default=[]), + get_tag_vals(sf, "_Experiment.Sample_condition_list_ID", default=[]), + get_tag_vals(sf, "_Experiment.Sample_condition_list_label", default=[]), + get_tag_vals(sf, "_Experiment.Mass_spectrometer_ID", default=[]), + get_tag_vals(sf, "_Experiment.Mass_spectrometer_label", default=[]), + ) + ) + def __str__(self): - return f'(ExperimentList {self.id}: experiments: {[(c[0],c[1]) for c in self.experiments]})' - + return ( + f"(ExperimentList {self.id}: experiments: {[(c[0], c[1]) for c in self.experiments]})" + ) + def __repr__(self): return f"" -class ShiftTable(object): + +class ShiftTable: def __init__(self, sf): - super(ShiftTable, self).__init__() - self.id = get_tag_vals(sf, '_Assigned_chem_shift_list.ID', indices=0) - self.conditions = get_tag_vals(sf, '_Assigned_chem_shift_list.Sample_condition_list_ID', indices=0) - self.experiments = list(zip( - get_tag_vals(sf, '_Chem_shift_experiment.Experiment_ID', default=[]), - get_tag_vals(sf, '_Chem_shift_experiment.Experiment_name', default=[]), - get_tag_vals(sf, '_Chem_shift_experiment.Sample_ID', default=[]), - get_tag_vals(sf, '_Chem_shift_experiment.Sample_state', default=[]) - )) - self.shifts = list(zip( - get_tag_vals(sf, '_Atom_chem_shift.Entity_assembly_ID', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Entity_ID', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Seq_ID', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Comp_ID', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Atom_ID', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Atom_type', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Val', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Val_err', default=[]), - get_tag_vals(sf, '_Atom_chem_shift.Ambiguity_code', default=[]) - )) + super().__init__() + self.id = get_tag_vals(sf, "_Assigned_chem_shift_list.ID", indices=0) + self.conditions = get_tag_vals( + sf, "_Assigned_chem_shift_list.Sample_condition_list_ID", indices=0 + ) + self.experiments = list( + zip( + get_tag_vals(sf, "_Chem_shift_experiment.Experiment_ID", default=[]), + get_tag_vals(sf, "_Chem_shift_experiment.Experiment_name", default=[]), + get_tag_vals(sf, "_Chem_shift_experiment.Sample_ID", default=[]), + get_tag_vals(sf, "_Chem_shift_experiment.Sample_state", default=[]), + ) + ) + self.shifts = list( + zip( + get_tag_vals(sf, "_Atom_chem_shift.Entity_assembly_ID", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Entity_ID", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Seq_ID", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Comp_ID", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Atom_ID", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Atom_type", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Val", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Val_err", default=[]), + get_tag_vals(sf, "_Atom_chem_shift.Ambiguity_code", default=[]), + ) + ) shifts = {} for s in self.shifts: if (s[0], s[1]) not in shifts: shifts[(s[0], s[1])] = [] shifts[(s[0], s[1])].append(s) self.shifts = shifts - + def __str__(self): - return f'(ShiftTable {self.id}: conditions {self.conditions}, shifts: {[(key, len(vals)) for key,vals in self.shifts.items()]})' - + return f"(ShiftTable {self.id}: conditions {self.conditions}, shifts: {[(key, len(vals)) for key, vals in self.shifts.items()]})" + def __repr__(self): return f"" -class BmrbEntry(object): + +class BmrbEntry: def __init__(self, id_, bmrb_dir): - super(BmrbEntry, self).__init__() + super().__init__() self.source = None - + self.id = id_ self.type = None self.title = None @@ -292,121 +340,163 @@ def __init__(self, id_, bmrb_dir): self.db_links = [] self.n_components = None self.n_entities = None - self.entities = {} # Physical_state, Name, Type, [(Database_code, Accession_code), ...] + self.entities = {} # Physical_state, Name, Type, [(Database_code, Accession_code), ...] self.conditions = {} self.shift_tables = {} - + self.entry_path = os.path.join(bmrb_dir, f"bmr{id_}") fn3 = os.path.join(self.entry_path, f"bmr{id_}_3.str") if not os.path.exists(fn3): - logging.getLogger('trizod.bmrb').debug(f'Bio-Star file for BMRB entry {id_} not found in directory {self.entry_path}') + logging.getLogger("trizod.bmrb").debug( + f"Bio-Star file for BMRB entry {id_} not found in directory {self.entry_path}" + ) # try to find str file in bmrb_dir self.entry_path = bmrb_dir fn3 = os.path.join(bmrb_dir, f"bmr{id_}_3.str") if not os.path.exists(fn3): - logging.getLogger('trizod.bmrb').error(f'Bio-Star file for BMRB entry {id_} not found, file {fn3} does not exist') + logging.getLogger("trizod.bmrb").error( + f"Bio-Star file for BMRB entry {id_} not found, file {fn3} does not exist" + ) raise ValueError self.source = fn3 entry = pynmrstar.Entry.from_file(fn3) # entry info - entry_information = entry.get_saveframes_by_category('entry_information') + entry_information = entry.get_saveframes_by_category("entry_information") if entry_information: - self.type = get_tag_vals(entry_information[0], '_Entry.Type', indices=0) - self.title = get_tag_vals(entry_information[0], '_Entry.Title', indices=0) - self.details = get_tag_vals(entry_information[0], '_Entry.Title', indices=0) - self.submission_date = get_tag_vals(entry_information[0], '_Entry.Submission_date', indices=0) - self.nmr_star_version = get_tag_vals(entry_information[0], '_Entry.NMR_STAR_version', indices=0) - self.original_nmr_star_version = get_tag_vals(entry_information[0], '_Entry.Original_NMR_STAR_version', indices=0) - self.exp_method = get_tag_vals(entry_information[0], '_Entry.Experimental_method', indices=0) - self.exp_method_subtype = get_tag_vals(entry_information[0], '_Entry.Experimental_method_subtype', indices=0) - self.struct_keywords = get_tag_vals(entry_information[0], '_Struct_keywords.Keywords', default=[]) + self.type = get_tag_vals(entry_information[0], "_Entry.Type", indices=0) + self.title = get_tag_vals(entry_information[0], "_Entry.Title", indices=0) + self.details = get_tag_vals(entry_information[0], "_Entry.Title", indices=0) + self.submission_date = get_tag_vals( + entry_information[0], "_Entry.Submission_date", indices=0 + ) + self.nmr_star_version = get_tag_vals( + entry_information[0], "_Entry.NMR_STAR_version", indices=0 + ) + self.original_nmr_star_version = get_tag_vals( + entry_information[0], "_Entry.Original_NMR_STAR_version", indices=0 + ) + self.exp_method = get_tag_vals( + entry_information[0], "_Entry.Experimental_method", indices=0 + ) + self.exp_method_subtype = get_tag_vals( + entry_information[0], "_Entry.Experimental_method_subtype", indices=0 + ) + self.struct_keywords = get_tag_vals( + entry_information[0], "_Struct_keywords.Keywords", default=[] + ) # database links - self.db_links = list(zip( - get_tag_vals(entry_information[0], '_Related_entries.Database_name', default=[]), - get_tag_vals(entry_information[0], '_Related_entries.Database_accession_code', default=[]), - get_tag_vals(entry_information[0], '_Related_entries.Relationship', default=[]) - )) + self.db_links = list( + zip( + get_tag_vals( + entry_information[0], "_Related_entries.Database_name", default=[] + ), + get_tag_vals( + entry_information[0], "_Related_entries.Database_accession_code", default=[] + ), + get_tag_vals(entry_information[0], "_Related_entries.Relationship", default=[]), + ) + ) # citation info - citations = entry.get_saveframes_by_category('citations') + citations = entry.get_saveframes_by_category("citations") if citations: - self.citation_title = get_tag_vals(citations[0], '_Citation.Title', indices=0) - self.citation_journal = get_tag_vals(citations[0], '_Citation.Journal_abbrev', indices=0) - self.citation_PubMed_ID = get_tag_vals(citations[0], '_Citation.PubMed_ID', indices=0) - self.citation_DOI = get_tag_vals(citations[0], '_Citation.DOI', indices=0) - self.citation_keywords = get_tag_vals(citations[0], '_Citation_keyword.Keyword', default=[]) + self.citation_title = get_tag_vals(citations[0], "_Citation.Title", indices=0) + self.citation_journal = get_tag_vals( + citations[0], "_Citation.Journal_abbrev", indices=0 + ) + self.citation_PubMed_ID = get_tag_vals(citations[0], "_Citation.PubMed_ID", indices=0) + self.citation_DOI = get_tag_vals(citations[0], "_Citation.DOI", indices=0) + self.citation_keywords = get_tag_vals( + citations[0], "_Citation_keyword.Keyword", default=[] + ) # Assembly info - entry_assemblies = entry.get_saveframes_by_category('assembly') + entry_assemblies = entry.get_saveframes_by_category("assembly") if len(entry_assemblies) == 0: - logging.getLogger('trizod.bmrb').error(f'BMRB entry {id_} contains no assembly information') + logging.getLogger("trizod.bmrb").error( + f"BMRB entry {id_} contains no assembly information" + ) raise ValueError self.assemblies = [Assembly(sf) for sf in entry_assemblies] - if not len([a.id for a in self.assemblies]) == len({a.id for a in self.assemblies}): - logging.getLogger('trizod.bmrb').error("entry contains assemblies with non-unique ID") + if len([a.id for a in self.assemblies]) != len({a.id for a in self.assemblies}): + logging.getLogger("trizod.bmrb").error("entry contains assemblies with non-unique ID") raise ValueError - self.assemblies = {a.id:a for a in self.assemblies} - - entry_entities = entry.get_saveframes_by_category('entity') + self.assemblies = {a.id: a for a in self.assemblies} + + entry_entities = entry.get_saveframes_by_category("entity") if len(entry_entities) == 0: - logging.getLogger('trizod.bmrb').error(f'BMRB entry {id_} contains no entity information') + logging.getLogger("trizod.bmrb").error( + f"BMRB entry {id_} contains no entity information" + ) raise ValueError self.entities = [Entity(sf) for sf in entry_entities] - if not len([e.id for e in self.entities]) == len({e.id for e in self.entities}): - logging.getLogger('trizod.bmrb').error("entry contains entities with non-unique ID") + if len([e.id for e in self.entities]) != len({e.id for e in self.entities}): + logging.getLogger("trizod.bmrb").error("entry contains entities with non-unique ID") raise ValueError - self.entities = {e.id:e for e in self.entities} + self.entities = {e.id: e for e in self.entities} - entry_samples = entry.get_saveframes_by_category('sample') + entry_samples = entry.get_saveframes_by_category("sample") if len(entry_samples) == 0: - logging.getLogger('trizod.bmrb').warning(f'BMRB entry {id_} contains no sample information') + logging.getLogger("trizod.bmrb").warning( + f"BMRB entry {id_} contains no sample information" + ) else: self.samples = [Sample(sf) for sf in entry_samples] - if not len([s.id for s in self.samples]) == len({s.id for s in self.samples}): - logging.getLogger('trizod.bmrb').error("entry contains samples with non-unique ID") + if len([s.id for s in self.samples]) != len({s.id for s in self.samples}): + logging.getLogger("trizod.bmrb").error("entry contains samples with non-unique ID") raise ValueError - self.samples = {s.id:s for s in self.samples} + self.samples = {s.id: s for s in self.samples} - entry_conditions = entry.get_saveframes_by_category('sample_conditions') + entry_conditions = entry.get_saveframes_by_category("sample_conditions") if len(entry_conditions) == 0: - logging.getLogger('trizod.bmrb').warning(f'BMRB entry {id_} contains no sample condition information') + logging.getLogger("trizod.bmrb").warning( + f"BMRB entry {id_} contains no sample condition information" + ) else: self.conditions = [SampleConditions(sf) for sf in entry_conditions] - if not len([a.id for a in self.conditions]) == len({a.id for a in self.conditions}): - logging.getLogger('trizod.bmrb').error("entry contains conditions with non-unique ID") + if len([a.id for a in self.conditions]) != len({a.id for a in self.conditions}): + logging.getLogger("trizod.bmrb").error( + "entry contains conditions with non-unique ID" + ) raise ValueError - self.conditions = {a.id:a for a in self.conditions} - - entry_experiment_lists = entry.get_saveframes_by_category('experiment_list') + self.conditions = {a.id: a for a in self.conditions} + + entry_experiment_lists = entry.get_saveframes_by_category("experiment_list") if len(entry_experiment_lists) != 1: - logging.getLogger('trizod.bmrb').error(f'BMRB entry {id_} contains no or more than one experiment list, currently not supported') - raise ValueError # TODO: find a solution to include these as well + logging.getLogger("trizod.bmrb").error( + f"BMRB entry {id_} contains no or more than one experiment list, currently not supported" + ) + raise ValueError # TODO: find a solution to include these as well self.experiment_list = ExperimentList(entry_experiment_lists[0]) - self.experiment_dict = {e[0] : e for e in self.experiment_list.experiments} + self.experiment_dict = {e[0]: e for e in self.experiment_list.experiments} - entry_shift_tables = entry.get_saveframes_by_category('assigned_chemical_shifts') + entry_shift_tables = entry.get_saveframes_by_category("assigned_chemical_shifts") if len(entry_shift_tables) == 0: - logging.getLogger('trizod.bmrb').error(f'BMRB entry {id_} contains no chemical shift information') + logging.getLogger("trizod.bmrb").error( + f"BMRB entry {id_} contains no chemical shift information" + ) raise ValueError self.shift_tables = [ShiftTable(sf) for sf in entry_shift_tables] - if not len([s.id for s in self.shift_tables]) == len({s.id for s in self.shift_tables}): - logging.getLogger('trizod.bmrb').error("entry contains shift tables with non-unique ID") + if len([s.id for s in self.shift_tables]) != len({s.id for s in self.shift_tables}): + logging.getLogger("trizod.bmrb").error("entry contains shift tables with non-unique ID") raise ValueError - self.shift_tables = {s.id:s for s in self.shift_tables} - + self.shift_tables = {s.id: s for s in self.shift_tables} + def get_peptide_shifts(self): peptide_shifts = {} - for stID,st in self.shift_tables.items(): + for stID, st in self.shift_tables.items(): condID = st.conditions if condID is None or condID not in self.conditions: - logging.getLogger('trizod.bmrb').error(f'skipping shift table {stID} due to missing conditions entry: {condID}') + logging.getLogger("trizod.bmrb").error( + f"skipping shift table {stID} due to missing conditions entry: {condID}" + ) continue exp_missing = False sampleIDs = [] experimentIDs = [] - #for eID in experimentIDs: - for eID,_,sID,_ in st.experiments: + # for eID in experimentIDs: + for eID, _, sID, _ in st.experiments: if eID: if eID not in self.experiment_dict: exp_missing = True @@ -415,20 +505,24 @@ def get_peptide_shifts(self): if sID: sampleIDs.append(sID) if exp_missing: - logging.getLogger('trizod.bmrb').error(f'skipping shift table {stID} due to missing experiment entry: {eID}') + logging.getLogger("trizod.bmrb").error( + f"skipping shift table {stID} due to missing experiment entry: {eID}" + ) continue if len(sampleIDs) == 0: - logging.getLogger('trizod.bmrb').debug(f'missing sample ID references in shift table, trying to retrive from list of experiment IDs') + logging.getLogger("trizod.bmrb").debug( + "missing sample ID references in shift table, trying to retrive from list of experiment IDs" + ) sampleIDs = [self.experiment_dict[eID][3] for eID in experimentIDs] - #if len(set(sampleIDs)) != 1: + # if len(set(sampleIDs)) != 1: # #logging.getLogger('trizod.bmrb').error(f'skipping shift table {stID}, sampleIDs could not be safely determined') # #print(self.id, sampleIDs) # #continue # # TODO: double-check that all experiments share the same experiment conditions - #sampleIDs = sampleIDs[0] - #try: + # sampleIDs = sampleIDs[0] + # try: sampleIDs = set(sampleIDs) - #except: + # except: # breakpoint() sample_missing = False for sID in sampleIDs: @@ -437,72 +531,114 @@ def get_peptide_shifts(self): break if sample_missing: # conservatively reject entries with false links to non-existing samples - logging.getLogger('trizod.bmrb').error(f'skipping shift table {stID}, sample ID {sID} unknown.') + logging.getLogger("trizod.bmrb").error( + f"skipping shift table {stID}, sample ID {sID} unknown." + ) continue sampleIDs = [sID.strip() for sID in set(sampleIDs) if sID in self.samples] if not sampleIDs: # do not require link to samples - only necessary if filtered for denaturants - logging.getLogger('trizod.bmrb').warning(f'sample ID(s) unknown for shift table {stID}.') - for (entity_assemID,entityID),shifts in st.shifts.items(): + logging.getLogger("trizod.bmrb").warning( + f"sample ID(s) unknown for shift table {stID}." + ) + for (entity_assemID, entityID), shifts in st.shifts.items(): # check if there is ambiguity if the entityID tag in matching assemblies is not tested (might be empty) - assemID = [(self.assemblies[assem].id, e[1]) for assem in self.assemblies for e in self.assemblies[assem].entities if e[0] == entity_assemID and e[1] in ['', None, entityID]] + assemID = [ + (self.assemblies[assem].id, e[1]) + for assem in self.assemblies + for e in self.assemblies[assem].entities + if e[0] == entity_assemID and e[1] in ["", None, entityID] + ] if len(assemID) > 1: # if so, enforce same entityID # should be extremely rare, only few entries have multiple assemblies... - logging.getLogger('trizod.bmrb').info(f"ambiguity with respect to correct assemly, enforcing matching, non-empty entityID") - assemID = [(self.assemblies[assem].id, e[1]) for assem in self.assemblies for e in self.assemblies[assem].entities if e[0] == entity_assemID and e[1] == entityID] + logging.getLogger("trizod.bmrb").info( + "ambiguity with respect to correct assemly, enforcing matching, non-empty entityID" + ) + assemID = [ + (self.assemblies[assem].id, e[1]) + for assem in self.assemblies + for e in self.assemblies[assem].entities + if e[0] == entity_assemID and e[1] == entityID + ] if len(assemID) > 1: - logging.getLogger('trizod.bmrb').error(f'skipping shifts for entity {entityID} due to ambiguity with respect to correct assemly: {assemID}') + logging.getLogger("trizod.bmrb").error( + f"skipping shifts for entity {entityID} due to ambiguity with respect to correct assemly: {assemID}" + ) continue if len(assemID) == 0: - logging.getLogger('trizod.bmrb').error(f"skipping shift table {stID}, could not associate it with any assembly") + logging.getLogger("trizod.bmrb").error( + f"skipping shift table {stID}, could not associate it with any assembly" + ) continue assemID, entityID_ = assemID[0] if entityID_ != entityID: - logging.getLogger('trizod.bmrb').warning(f'Unambiguously using assembly {assemID} with empty entityID tag for assembly entity {entity_assemID}, assuming it is {entityID}') - - if entity_assemID is None or entity_assemID not in [e[0] for assem in self.assemblies for e in self.assemblies[assem].entities]: #self.assemblies: - logging.getLogger('trizod.bmrb').error(f'skipping shifts for entity {entityID} due to missing assembly entity entry: {entity_assemID}') + logging.getLogger("trizod.bmrb").warning( + f"Unambiguously using assembly {assemID} with empty entityID tag for assembly entity {entity_assemID}, assuming it is {entityID}" + ) + + if entity_assemID is None or entity_assemID not in [ + e[0] for assem in self.assemblies for e in self.assemblies[assem].entities + ]: # self.assemblies: + logging.getLogger("trizod.bmrb").error( + f"skipping shifts for entity {entityID} due to missing assembly entity entry: {entity_assemID}" + ) continue if entityID is None or entityID not in self.entities: - logging.getLogger('trizod.bmrb').error(f'skipping shifts for assembly {entity_assemID} due to missing entity entry: {entityID}') + logging.getLogger("trizod.bmrb").error( + f"skipping shifts for assembly {entity_assemID} due to missing entity entry: {entityID}" + ) continue entity = self.entities[entityID] if not entity.type: - logging.getLogger('trizod.bmrb').error(f'skipping shifts for assembly {entity_assemID} due to missing entity type: {entityID}') + logging.getLogger("trizod.bmrb").error( + f"skipping shifts for assembly {entity_assemID} due to missing entity type: {entityID}" + ) continue - if entity.type == 'polymer': + if entity.type == "polymer": if not entity.polymer_type: - logging.getLogger('trizod.bmrb').error(f'skipping shifts for assembly {entity_assemID} due to missing polymer type for entity: {entityID}') + logging.getLogger("trizod.bmrb").error( + f"skipping shifts for assembly {entity_assemID} due to missing polymer type for entity: {entityID}" + ) continue - if entity.polymer_type == 'polypeptide(L)': - peptide_shifts[(stID,entity_assemID,entityID)] = (shifts, condID, assemID, sampleIDs) + if entity.polymer_type == "polypeptide(L)": + peptide_shifts[(stID, entity_assemID, entityID)] = ( + shifts, + condID, + assemID, + sampleIDs, + ) return peptide_shifts - def __str__(self): - def pplist(l): - if len(l) == 0 : return "[]" - elif len(l) == 1 : return f"[{str(l[0])}]" - else: return "[\n " + "\n ".join([str(e) for e in l]) + "\n]" - - s = f"bmr{self.id}:\n" + "\n ".join([ - f"id = {self.id}", - f"citation_title = {self.citation_title}", - f"citation_journal = {self.citation_journal}", - f"citation_PubMed_ID = {self.citation_PubMed_ID}", - f"citation_DOI = {self.citation_DOI}", - f"citation_keywords = {self.citation_keywords}", - f"assemblies = {pplist(list(self.assemblies.values()))}", - f"entities = {pplist(list(self.entities.values()))}", - f"samples = {pplist(list(self.samples.values()))}", - f"conditions = {pplist(list(self.conditions.values()))}", - f"shifts = {pplist(list(self.shift_tables.values()))}", - ]) + def pplist(lst): + if len(lst) == 0: + return "[]" + elif len(lst) == 1: + return f"[{str(lst[0])}]" + else: + return "[\n " + "\n ".join([str(e) for e in lst]) + "\n]" + + s = f"bmr{self.id}:\n" + "\n ".join( + [ + f"id = {self.id}", + f"citation_title = {self.citation_title}", + f"citation_journal = {self.citation_journal}", + f"citation_PubMed_ID = {self.citation_PubMed_ID}", + f"citation_DOI = {self.citation_DOI}", + f"citation_keywords = {self.citation_keywords}", + f"assemblies = {pplist(list(self.assemblies.values()))}", + f"entities = {pplist(list(self.entities.values()))}", + f"samples = {pplist(list(self.samples.values()))}", + f"conditions = {pplist(list(self.conditions.values()))}", + f"shifts = {pplist(list(self.shift_tables.values()))}", + ] + ) return s - + def __repr__(self): - return f'' + return f"" + def get_valid_bbshifts(shifts, seq, filter_amb=True, max_err=1.3, averaging=True): bb_atm_ids = BBATNS[:] @@ -515,67 +651,94 @@ def get_valid_bbshifts(shifts, seq, filter_amb=True, max_err=1.3, averaging=True # 6: '_Atom_chem_shift.Val' # 7: '_Atom_chem_shift.Val_err' # 8: '_Atom_chem_shift.Ambiguity_code' - df = pd.DataFrame(shifts, columns=['entity_assemID','entityID','pos','aa3','atm_id','atm_type','val','err','ambc']) + df = pd.DataFrame( + shifts, + columns=[ + "entity_assemID", + "entityID", + "pos", + "aa3", + "atm_id", + "atm_type", + "val", + "err", + "ambc", + ], + ) # convert sequence index try: - df['pos'] = df['pos'].astype(int) - 1 - assert np.all(df['pos'] >= 0) + df["pos"] = df["pos"].astype(int) - 1 + assert np.all(df["pos"] >= 0) except (ValueError, AssertionError): - logging.getLogger('trizod.bmrb').error(f'conversion to integer failed for at least one position index') + logging.getLogger("trizod.bmrb").error( + "conversion to integer failed for at least one position index" + ) return - if np.any(df['pos'] >= len(seq)): - logging.getLogger('trizod.bmrb').error(f'shift array sequence longer than polymer sequence') + if np.any(df["pos"] >= len(seq)): + logging.getLogger("trizod.bmrb").error("shift array sequence longer than polymer sequence") return # only process canonical bases, check if AAs match sequence - df = df.loc[df['aa3'].isin(AA3TO1.keys())] - df['aa1'] = df['aa3'].replace(AA3TO1) - if np.any(df['aa1'] != df['pos'].replace({i:aa for i,aa in enumerate(seq)})): - logging.getLogger('trizod.bmrb').error(f'canonical amino acid mismatch between sequence and shift array') + df = df.loc[df["aa3"].isin(AA3TO1.keys())] + df["aa1"] = df["aa3"].replace(AA3TO1) + if np.any(df["aa1"] != df["pos"].replace(dict(enumerate(seq)))): + logging.getLogger("trizod.bmrb").error( + "canonical amino acid mismatch between sequence and shift array" + ) return # convert value and error try: - df['val'] = df['val'].astype(float) # will throw error on failed conversion + df["val"] = df["val"].astype(float) # will throw error on failed conversion except ValueError: - logging.getLogger('trizod.bmrb').error(f'conversion to float failed for at least one shift value') + logging.getLogger("trizod.bmrb").error( + "conversion to float failed for at least one shift value" + ) return - df['err'] = pd.to_numeric(df['err']) # will create NaN for non-numeric entries, which is intended + df["err"] = pd.to_numeric( + df["err"] + ) # will create NaN for non-numeric entries, which is intended # filter data with large measurement errors if max_err: - df = df.loc[(df['err'] <= max_err) | pd.isna(df['err'])] + df = df.loc[(df["err"] <= max_err) | pd.isna(df["err"])] # filter certain ambiguous codes - df = df.loc[df['ambc'].isin(['1', '2', '', '.'])] + df = df.loc[df["ambc"].isin(["1", "2", "", "."])] # filter non-backbone atoms # TODO: maybe move this up to fasten processing - df = df.loc[df['atm_id'].isin(bb_atm_ids + ['HA2', 'HA3' ,'HB1', 'HB2', 'HB3'])] - df['atm_id_single'] = df['atm_id'] + df = df.loc[df["atm_id"].isin(bb_atm_ids + ["HA2", "HA3", "HB1", "HB2", "HB3"])] + df["atm_id_single"] = df["atm_id"] # look for non-standard shifts - df.loc[(df['aa3'] != 'ALA') & df['atm_id'].isin(['HB2', 'HB3']), 'atm_id_single'] = 'HB' - df.loc[(df['aa3'] == 'ALA') & df['atm_id'].isin(['HB1', 'HB2', 'HB3']), 'atm_id_single'] = 'HB' - df.loc[(df['aa3'] == 'GLY') & df['atm_id'].isin(['HA2', 'HA3']), 'atm_id_single'] = 'HA' - if np.any(~df['atm_id_single'].isin(bb_atm_ids)): - logging.getLogger('trizod.bmrb').error(f'found unexpected shift for a canonical amino acid in shift table') + df.loc[(df["aa3"] != "ALA") & df["atm_id"].isin(["HB2", "HB3"]), "atm_id_single"] = "HB" + df.loc[(df["aa3"] == "ALA") & df["atm_id"].isin(["HB1", "HB2", "HB3"]), "atm_id_single"] = "HB" + df.loc[(df["aa3"] == "GLY") & df["atm_id"].isin(["HA2", "HA3"]), "atm_id_single"] = "HA" + if np.any(~df["atm_id_single"].isin(bb_atm_ids)): + logging.getLogger("trizod.bmrb").error( + "found unexpected shift for a canonical amino acid in shift table" + ) return # duplicated shifts - dupl = df[['pos', 'atm_id_single', 'atm_id', 'val', 'err']].duplicated() # identical rows + dupl = df[["pos", "atm_id_single", "atm_id", "val", "err"]].duplicated() # identical rows if np.any(dupl): - logging.getLogger('trizod.bmrb').warning(f'multiple identical shifts found for the same position and atom_id') + logging.getLogger("trizod.bmrb").warning( + "multiple identical shifts found for the same position and atom_id" + ) df = df.loc[~dupl] # conflicting data - conflicting = df[['pos', 'atm_id_single', 'atm_id']].duplicated(keep=False) + conflicting = df[["pos", "atm_id_single", "atm_id"]].duplicated(keep=False) if np.any(conflicting): - logging.getLogger('trizod.bmrb').error(f'multiple shifts found for the same position and atom_id') + logging.getLogger("trizod.bmrb").error( + "multiple shifts found for the same position and atom_id" + ) return - # averaging + # averaging if averaging: - df = df.groupby(['pos', 'atm_id_single'])[['val']].agg('mean').reset_index() + df = df.groupby(["pos", "atm_id_single"])[["val"]].agg("mean").reset_index() else: - df['atm_id_single'] = df['atm_id'] - bb_atm_ids = bb_atm_ids + ['HA2', 'HA3' ,'HB1', 'HB2', 'HB3'] + df["atm_id_single"] = df["atm_id"] + bb_atm_ids = bb_atm_ids + ["HA2", "HA3", "HB1", "HB2", "HB3"] bbshifts_arr = np.zeros(shape=(len(seq), len(bb_atm_ids))) bbshifts_mask = np.full(shape=(len(seq), len(bb_atm_ids)), fill_value=False) - for i,atm_id in enumerate(bb_atm_ids): - sel = df['atm_id_single'] == atm_id - bbshifts_arr[df.loc[sel, 'pos'], i] = df.loc[sel, 'val'] - bbshifts_mask[df.loc[sel, 'pos'], i] = True - #""" - return bbshifts_arr, bbshifts_mask \ No newline at end of file + for i, atm_id in enumerate(bb_atm_ids): + sel = df["atm_id_single"] == atm_id + bbshifts_arr[df.loc[sel, "pos"], i] = df.loc[sel, "val"] + bbshifts_mask[df.loc[sel, "pos"], i] = True + # """ + return bbshifts_arr, bbshifts_mask diff --git a/trizod/constants.py b/trizod/constants.py index 3a6d020..318c152 100644 --- a/trizod/constants.py +++ b/trizod/constants.py @@ -1,5 +1,34 @@ -BBATNS = ['C','CA','CB','HA','H','N','HB'] -REFINED_WEIGHTS = {'C':0.1846, 'CA':0.1982, 'CB':0.1544, 'HA':0.02631, 'H':0.06708, 'N':0.4722, 'HB':0.02154} -AA3TO1 = {'CYS': 'C', 'GLN': 'Q', 'ILE': 'I', 'SER': 'S', 'VAL': 'V', 'MET': 'M', 'ASN': 'N', 'PRO': 'P', 'LYS': 'K', 'THR': 'T', 'PHE': 'F', 'ALA': 'A', 'HIS': 'H', 'GLY': 'G', 'ASP': 'D', 'LEU': 'L', 'ARG': 'R', 'TRP': 'W', 'GLU': 'E', 'TYR': 'Y'} -AA1TO3 = {v:k for k,v in AA3TO1.items()} -CAN_TRANS = str.maketrans("ARNDCQEGHILKMFPSTYWVX", "#####################") \ No newline at end of file +BBATNS = ["C", "CA", "CB", "HA", "H", "N", "HB"] +REFINED_WEIGHTS = { + "C": 0.1846, + "CA": 0.1982, + "CB": 0.1544, + "HA": 0.02631, + "H": 0.06708, + "N": 0.4722, + "HB": 0.02154, +} +AA3TO1 = { + "CYS": "C", + "GLN": "Q", + "ILE": "I", + "SER": "S", + "VAL": "V", + "MET": "M", + "ASN": "N", + "PRO": "P", + "LYS": "K", + "THR": "T", + "PHE": "F", + "ALA": "A", + "HIS": "H", + "GLY": "G", + "ASP": "D", + "LEU": "L", + "ARG": "R", + "TRP": "W", + "GLU": "E", + "TYR": "Y", +} +AA1TO3 = {v: k for k, v in AA3TO1.items()} +CAN_TRANS = str.maketrans("ARNDCQEGHILKMFPSTYWVX", "#####################") diff --git a/trizod/potenci/__init__.py b/trizod/potenci/__init__.py index 829cb53..3f6471f 100644 --- a/trizod/potenci/__init__.py +++ b/trizod/potenci/__init__.py @@ -1,2 +1,27 @@ -from .potenci import getpredshifts -from .constants import R, e, a, b, cutoff, ncycles \ No newline at end of file +"""POTENCI module for predicting random coil NMR chemical shifts.""" + +from .constants import AA_STANDARD as AA_STANDARD +from .constants import PHYSICAL_CONSTANTS as PHYSICAL_CONSTANTS +from .constants import PK0 as PK0 +from .constants import PhysicalConstants as PhysicalConstants +from .constants import load_central_shifts as load_central_shifts +from .constants import load_combinatorial_deviations as load_combinatorial_deviations +from .constants import load_neighbor_corrections as load_neighbor_corrections +from .constants import load_ph_shifts as load_ph_shifts +from .constants import load_temperature_coefficients as load_temperature_coefficients +from .constants import load_terminal_corrections as load_terminal_corrections +from .potenci import getpredshifts as getpredshifts + +__all__ = [ + "AA_STANDARD", + "PHYSICAL_CONSTANTS", + "PK0", + "PhysicalConstants", + "load_central_shifts", + "load_combinatorial_deviations", + "load_neighbor_corrections", + "load_ph_shifts", + "load_temperature_coefficients", + "load_terminal_corrections", + "getpredshifts", +] diff --git a/trizod/potenci/constants.py b/trizod/potenci/constants.py index 25dcbef..4012cfc 100644 --- a/trizod/potenci/constants.py +++ b/trizod/potenci/constants.py @@ -1,10 +1,340 @@ -R = 8.314472 -e = 79.0 -a = 5.0 -b = 7.5 -cutoff = 2 -ncycles = 5 - -#titratable groups -##pK0 = {"n":7.5, "D":4.0, "E":4.4, "H":6.6, "C":8.6, "K":10.4, "R":12.0, "Y":9.6, "c":3.5} #was these values! -pK0 = {"n":8.23, "D":3.86, "E":4.34, "H":6.45, "C":8.49, "K":10.34, "R":13.9, "Y":9.76, "c":3.55} \ No newline at end of file +"""Constants and data tables for the POTENCI algorithm. + +This module contains physical constants, pKa values, and chemical shift correction tables +used in the POTENCI (Prediction Of The chemical shift ENvironment Induced) +algorithm for predicting random coil chemical shifts. + +Data is loaded from CSV files in the data/ subdirectory. The original data comes from +the POTENCI algorithm published by Frans A. A. Mulder's group. + +References: + Nielsen, J. T., & Mulder, F. A. (2018). POTENCI: prediction of temperature, + neighbor and pH-corrected chemical shifts for intrinsically disordered proteins. + Journal of Biomolecular NMR, 70(3), 141-165. +""" + +from __future__ import annotations + +import csv +import functools +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import numpy.typing as npt + +# ============================================================================ +# TYPE DEFINITIONS +# ============================================================================ + +ShiftDict = dict[str, dict[str, float | None]] +CorrectionDict = dict[str, dict[str, list[float | None]]] +CombinationDict = dict[str, dict[str, tuple[tuple[int, str, str], float]]] +TempCoeffDict = dict[str, dict[str, float]] +PKDict = dict[str, float] + + +# ============================================================================ +# PHYSICAL CONSTANTS +# ============================================================================ + + +@dataclass(frozen=True) +class PhysicalConstants: + """Physical constants for POTENCI calculations.""" + + gas_constant: float = 8.314472 # J/(mol*K) + dielectric_constant: float = 79.0 # Relative permittivity + distance_param_a: float = 5.0 # Angstroms + distance_param_b: float = 7.5 # Angstroms + cutoff: int = 2 # Number of residues for local calculations + n_cycles: int = 5 # Number of iterations for pKa calculations + + +# Global instance +PHYSICAL_CONSTANTS = PhysicalConstants() + + +# ============================================================================ +# CHEMICAL CONSTANTS +# ============================================================================ + +# Titratable groups pKa values (at 298K, ionic strength 0.1M) +PK0: PKDict = { + "n": 8.23, # N-terminus + "D": 3.86, # Aspartate + "E": 4.34, # Glutamate + "H": 6.45, # Histidine + "C": 8.49, # Cysteine + "K": 10.34, # Lysine + "R": 13.9, # Arginine + "Y": 9.76, # Tyrosine + "c": 3.55, # C-terminus +} + +# Standard amino acids (one-letter codes) +AA_STANDARD = "ACDEFGHIKLMNPQRSTVWY" + + +# ============================================================================ +# PRE-COMPUTED MATRICES +# ============================================================================ + + +def _compute_outer_matrices() -> tuple[list[npt.NDArray[np.float64]], list[npt.NDArray[np.int_]]]: + """Compute outer product matrices for efficient pKa calculations. + + Returns: + Tuple of (outer_matrices, alltuples) lists indexed by matrix size. + """ + outer_matrices_list: list[npt.NDArray[np.float64]] = [] + alltuples_list: list[npt.NDArray[np.int_]] = [] + + for small_n in range(0, 6): + alltuples = np.array( + [[int(c) for c in np.binary_repr(i, small_n)] for i in range(2**small_n)], + dtype=np.int_, + ) + outerm = np.array([np.outer(c, c) for c in alltuples], dtype=np.float64) + outer_matrices_list.append(outerm) + alltuples_list.append(alltuples) + + return outer_matrices_list, alltuples_list + + +outer_matrices, alltuples_ = _compute_outer_matrices() + + +# ============================================================================ +# DATA FILE PATHS +# ============================================================================ + +_DATA_DIR = Path(__file__).parent / "data" + + +# ============================================================================ +# DATA LOADING FUNCTIONS +# ============================================================================ + + +def _safe_float(value: str) -> float | None: + """Safely convert string to float, returning None for empty strings. + + Args: + value: String value to convert. + + Returns: + Float value or None if empty/invalid. + """ + if not value or value.lower() in ("none", "na", "nan", ""): + return None + try: + return float(value) + except ValueError: + return None + + +@functools.lru_cache(maxsize=1) +def load_central_shifts() -> ShiftDict: + """Load central residue chemical shift corrections from CSV. + + Returns: + Dictionary mapping amino acid to atom type to shift value. + Format: {aa: {atom: shift}} + """ + data: ShiftDict = {} + csv_path = _DATA_DIR / "tablecent.csv" + + with csv_path.open() as f: + reader = csv.DictReader(f) + for row in reader: + aa = row["aa"] + data[aa] = {} + for atom in ["C", "CA", "CB", "N", "H", "HA", "HB"]: + data[aa][atom] = _safe_float(row[atom]) + + return data + + +@functools.lru_cache(maxsize=1) +def load_neighbor_corrections() -> CorrectionDict: + """Load neighbor residue chemical shift corrections from CSV. + + Returns: + Dictionary mapping amino acid to atom type to list of corrections. + Format: {aa: {atom: [corr1, corr2, corr3, corr4]}} + """ + data: CorrectionDict = {} + csv_path = _DATA_DIR / "tablenei.csv" + + with csv_path.open() as f: + reader = csv.DictReader(f) + for row in reader: + atom = row["atom"] + aa = row["aa"] + + if aa not in data: + data[aa] = {} + + data[aa][atom] = [ + _safe_float(row["corr1"]), + _safe_float(row["corr2"]), + _safe_float(row["corr3"]), + _safe_float(row["corr4"]), + ] + + return data + + +@functools.lru_cache(maxsize=1) +def load_terminal_corrections() -> CorrectionDict: + """Load terminal correction values from CSV. + + Returns: + Dictionary with 'n' and 'c' terminal corrections. + Format: {'n'/'c': {atom: [None, None, None, value]}} + """ + data: CorrectionDict = {} + csv_path = _DATA_DIR / "tabletermcorrs.csv" + + with csv_path.open() as f: + reader = csv.DictReader(f) + for row in reader: + atom = row["atom"] + term = row["term"] + value = _safe_float(row["corr"]) + + if term not in data: + data[term] = {} + + if term == "n": + data["n"][atom] = [None, None, None, value] + elif term == "c": + data["c"][atom] = [value, None, None, None] + + return data + + +@functools.lru_cache(maxsize=1) +def load_temperature_coefficients() -> TempCoeffDict: + """Load temperature correction coefficients from CSV. + + Returns: + Dictionary mapping atom type to amino acid to coefficient. + Format: {atom: {aa: coeff}} + """ + data: TempCoeffDict = {} + csv_path = _DATA_DIR / "tabletempk.csv" + + with csv_path.open() as f: + reader = csv.DictReader(f) + atoms = ["CA", "CB", "C", "N", "H", "HA"] + + for atom in atoms: + data[atom] = {} + + for row in reader: + aa = row["aa"] + for atom in atoms: + value = _safe_float(row[atom]) + if value is not None: + data[atom][aa] = value + + return data + + +@functools.lru_cache(maxsize=1) +def load_combinatorial_deviations() -> CombinationDict: + """Load combinatorial deviation corrections from CSV. + + Returns: + Dictionary mapping atom type to segment to (key tuple, correction). + Format: {atom: {segment: ((position, cent_group, nei_group), value)}} + """ + data: CombinationDict = {} + csv_path = _DATA_DIR / "tablecombdevs.csv" + + with csv_path.open() as f: + reader = csv.DictReader(f) + for row in reader: + atom = row["atom"] + if atom not in data: + data[atom] = {} + + position = int(row["neipos"]) + cent_group = row["centgroup"] + nei_group = row["neigroup"] + segment = row["segment"] + correction = float(row["val1"]) # Using val1 as the correction value + + key = (position, cent_group, nei_group) + data[atom][segment] = (key, correction) + + return data + + +@functools.lru_cache(maxsize=1) +def load_ph_shifts() -> ShiftDict: + """Load pH-dependent chemical shift changes from CSV. + + Returns: + Dictionary mapping residue (with 'p'/'s' suffixes for neighbors) to atom to shift delta. + Format: {residue: {atom: delta}} + """ + data: ShiftDict = {} + csv_path = _DATA_DIR / "tablephshifts.csv" + + with csv_path.open() as f: + reader = csv.DictReader(f) + for row in reader: + residue = row["residue"] + atom = row["atom"] + # val3 is the shift delta (difference between protonated and deprotonated) + shift_delta = _safe_float(row["val3"]) + + if residue not in data: + data[residue] = {} + + data[residue][atom] = shift_delta + + # Handle neighbor data if present (val4 and val5) + neighbor_prev = _safe_float(row.get("val4", "")) + neighbor_next = _safe_float(row.get("val5", "")) + + if neighbor_prev is not None: + residue_prev = residue + "p" + if residue_prev not in data: + data[residue_prev] = {} + data[residue_prev][atom] = neighbor_prev + + if neighbor_next is not None: + residue_next = residue + "s" + if residue_next not in data: + data[residue_next] = {} + data[residue_next][atom] = neighbor_next + + return data + + +# ============================================================================ +# PUBLIC API +# ============================================================================ + +__all__ = [ + # Physical constants + "PhysicalConstants", + "PHYSICAL_CONSTANTS", + # Chemical constants + "PK0", + "AA_STANDARD", + # Pre-computed matrices + "outer_matrices", + "alltuples_", + # Data loading functions + "load_central_shifts", + "load_neighbor_corrections", + "load_terminal_corrections", + "load_temperature_coefficients", + "load_combinatorial_deviations", + "load_ph_shifts", +] diff --git a/trizod/potenci/data/README.md b/trizod/potenci/data/README.md new file mode 100644 index 0000000..02e3e0f --- /dev/null +++ b/trizod/potenci/data/README.md @@ -0,0 +1,136 @@ +# POTENCI Data Files + +This directory contains the chemical shift prediction data tables used by the POTENCI algorithm for predicting random coil NMR chemical shifts in intrinsically disordered proteins. + +## Overview + +POTENCI (Prediction Of Temperature, Neighbor and pH-corrected Chemical shifts for Intrinsically disordered proteins) is an empirical method that predicts backbone and side-chain chemical shifts based on: + +- Amino acid type and local sequence context +- Temperature effects +- pH-dependent ionization states +- Electrostatic interactions + +## File Descriptions + +### tablecent.csv + +**Central residue chemical shift values** - Base chemical shift values for each amino acid type at reference conditions. + +- **Columns**: `aa`, `C`, `CA`, `CB`, `N`, `H`, `HA`, `HB` +- **Rows**: 20 standard amino acids (one-letter codes) +- **Units**: ppm (parts per million) +- **Reference conditions**: 298K, pH 7.0, ionic strength 0.1M +- **Note**: Empty cells indicate unavailable data (e.g., Glycine lacks CB/HB atoms, Proline lacks H) + +### tablenei.csv + +**Neighbor residue corrections** - Chemical shift perturbations caused by neighboring amino acids. + +- **Columns**: `atom`, `aa`, `corr1`, `corr2`, `corr3`, `corr4` +- **Rows**: One entry per (atom type, amino acid) pair +- **Correction positions**: + - `corr1`: Effect from residue at position i-2 + - `corr2`: Effect from residue at position i-1 + - `corr3`: Effect from residue at position i+1 + - `corr4`: Effect from residue at position i+2 +- **Units**: ppm + +### tabletermcorrs.csv + +**Terminal corrections** - Additional corrections for N-terminal and C-terminal residues. + +- **Columns**: `atom`, `term`, `corr` +- **Terms**: + - `n`: N-terminus corrections + - `c`: C-terminus corrections +- **Units**: ppm +- **Application**: Added to residues at protein termini to account for charge effects + +### tabletempk.csv + +**Temperature coefficients** - Linear temperature dependence coefficients for chemical shifts. + +- **Columns**: `aa`, `CA`, `CB`, `C`, `N`, `H`, `HA` +- **Rows**: 20 standard amino acids +- **Units**: ppb/K (parts per billion per Kelvin) +- **Usage**: Δδ = coefficient × (T - 298K) / 1000 +- **Reference**: 298K (25°C) + +### tablecombdevs.csv + +**Combinatorial deviations** - Higher-order corrections for specific sequence patterns. + +- **Columns**: `atom`, `neipos`, `centgroup`, `neigroup`, `segment`, `val1`, `val2` +- **Parameters**: + - `neipos`: Neighbor position relative to center (-2, -1, 1, 2) + - `centgroup`: Central residue group classification + - `neigroup`: Neighbor residue group classification + - `segment`: 5-residue pattern identifier (e.g., "xxGPx") + - `val1`: Correction value (ppm) + - `val2`: Standard error estimate (ppm) +- **Groups**: + - `G`: Glycine + - `P`: Proline + - `r`: Aromatic (F, Y, W) + - `a`: Aliphatic (L, I, V, M, C, A) + - `+`: Positive (K, R) + - `-`: Negative (D, E) + - `p`: Polar (N, Q, S, T, H) + +### tablephshifts.csv + +**pH-dependent shifts** - Chemical shift changes upon protonation/deprotonation of titratable groups. + +- **Columns**: `residue`, `atom`, `val1`, `val2`, `val3`, `val4`, `val5` +- **Residues**: Titratable amino acids (D, E, H, C, Y, K, R) +- **Column interpretation**: + - `val1`: Shift at low pH (protonated state) + - `val2`: Shift at high pH (deprotonated state) + - `val3`: Δδ = val2 - val1 (shift difference, main value used) + - `val4`: Effect on previous residue (i-1) + - `val5`: Effect on next residue (i+1) +- **Units**: ppm +- **Note**: Not all atoms/residues have neighbor effects (val4/val5 may be empty) + +## Data Format + +All CSV files use: + +- **Delimiter**: Comma (`,`) +- **Header row**: Column names in first row +- **Missing data**: Empty cells or "na" for unavailable values +- **Encoding**: UTF-8 + +## Usage + +These data files are automatically loaded by the `trizod.potenci.constants` module: + +```python +from trizod.potenci.constants import ( + load_central_shifts, + load_neighbor_corrections, + load_temperature_coefficients, + load_combinatorial_deviations, + load_ph_shifts, +) + +# Data is cached after first load +central_shifts = load_central_shifts() +``` + +## References + +**Original POTENCI publication:** +Nielsen, J. T., & Mulder, F. A. (2018). POTENCI: prediction of temperature, neighbor and pH-corrected chemical shifts for intrinsically disordered proteins. _Journal of Biomolecular NMR_, 70(3), 141-165. +DOI: [10.1007/s10858-018-0166-5](https://doi.org/10.1007/s10858-018-0166-5) + +**Original implementation:** +https://github.com/protein-nmr/POTENCI + +**Data source:** +The data tables are derived from statistical analysis of NMR chemical shift databases and empirical fitting to experimental measurements. + +## License + +The data files maintain the licensing terms of the original POTENCI implementation. diff --git a/trizod/potenci/data/tablecent.csv b/trizod/potenci/data/tablecent.csv new file mode 100644 index 0000000..0dcff09 --- /dev/null +++ b/trizod/potenci/data/tablecent.csv @@ -0,0 +1,22 @@ +aa,C,CA,CB,N,H,HA,HB +A,177.44069,52.53002,19.21113,125.40155,8.20964,4.25629,1.31544 +C,174.33917,58.48976,28.06269,120.71212,8.29429,4.44261,2.85425 +D,176.02114,54.23920,41.18408,121.75726,8.28460,4.54836,2.60054 +E,176.19215,56.50755,30.30204,122.31578,8.35949,4.22124,1.92383 +F,175.42280,57.64849,39.55984,121.30500,8.10906,4.57507,3.00036 +G,173.83294,45.23929,,110.09074,8.32746,3.91016, +H,175.00142,56.20256,30.60335,120.69141,8.27133,4.55872,3.03080 +I,175.88231,61.04925,38.68742,122.37586,8.06407,4.10574,1.78617 +K,176.22644,56.29413,33.02478,122.71282,8.24902,4.25873,1.71982 +L,177.06101,55.17464,42.29215,123.48611,8.14330,4.28545,1.54067 +M,175.90708,55.50643,32.83806,121.54592,8.24848,4.41483,1.97585 +N,174.94152,53.22822,38.87465,119.92746,8.37189,4.64308,2.72756 +P,176.67709,63.05232,32.03750,137.40612,,4.36183,2.03318 +Q,175.63494,55.79861,29.44174,121.49225,8.30042,4.28006,1.97653 +R,175.92194,56.06785,30.81298,122.40365,8.26453,4.28372,1.73437 +S,174.31005,58.36048,63.82367,117.11419,8.25730,4.40101,3.80956 +T,174.27772,61.86928,69.80612,115.48126,8.11378,4.28923,4.15465 +V,175.80621,62.20156,32.77934,121.71912,8.06572,4.05841,1.99302 +W,175.92744,57.23836,29.56502,122.10991,7.97816,4.61061,3.18540 +Y,175.49651,57.82427,38.76184,121.43652,8.05749,4.51123,2.91782 + diff --git a/trizod/potenci/data/tablecombdevs.csv b/trizod/potenci/data/tablecombdevs.csv new file mode 100644 index 0000000..ff1ef13 --- /dev/null +++ b/trizod/potenci/data/tablecombdevs.csv @@ -0,0 +1,248 @@ +atom,neipos,centgroup,neigroup,segment,val1,val2 +C,-1,G,r,xrGxx,0.2742,1.4856 +C,-1,G,-,x-Gxx,0.0522,0.2827 +C,-1,P,P,xPPxx,-0.0822,0.4450 +C,-1,P,r,xrPxx,0.2640,1.4303 +C,-1,r,P,xPrxx,-0.1027,0.5566 +C,-1,+,P,xP+xx,0.0714,0.3866 +C,-1,-,-,x--xx,-0.0501,0.2712 +C,-1,p,r,xrpxx,0.0582,0.3151 +C,1,G,r,xxGrx,0.0730,0.3955 +C,1,P,a,xxPax,-0.0981,0.5317 +C,1,P,+,xxP+x,-0.0577,0.3128 +C,1,P,p,xxPpx,-0.0619,0.3356 +C,1,r,r,xxrrx,-0.1858,1.0064 +C,1,r,a,xxrax,-0.1888,1.0226 +C,1,r,+,xxr+x,-0.1805,0.9779 +C,1,r,-,xxr-x,-0.1756,0.9512 +C,1,r,p,xxrpx,-0.1208,0.6544 +C,1,+,P,xx+Px,-0.0533,0.2886 +C,1,-,P,xx-Px,0.1867,1.0115 +C,1,p,P,xxpPx,0.2321,1.2574 +C,-2,G,r,rxGxx,-0.1457,0.7892 +C,-2,r,p,pxrxx,0.0555,0.3008 +C,2,P,P,xxPxP,0.1007,0.5455 +C,2,P,-,xxPx-,0.0634,0.3433 +C,2,r,P,xxrxP,-0.1447,0.7841 +C,2,a,r,xxaxr,-0.1488,0.8061 +C,2,a,-,xxax-,-0.0093,0.0506 +C,2,+,G,xx+xG,-0.0394,0.2132 +C,2,+,P,xx+xP,0.1016,0.5502 +C,2,+,a,xx+xa,0.0299,0.1622 +C,2,+,+,xx+x+,0.0427,0.2312 +C,2,-,a,xx-xa,0.0611,0.3308 +C,2,p,P,xxpxP,-0.0753,0.4078 +CA,-1,G,P,xPGxx,-0.0641,0.3233 +CA,-1,G,r,xrGxx,0.2107,1.0630 +CA,-1,P,P,xPPxx,-0.2042,1.0303 +CA,-1,P,p,xpPxx,0.0444,0.2240 +CA,-1,r,G,xGrxx,0.2030,1.0241 +CA,-1,r,+,x+rxx,-0.0811,0.4093 +CA,-1,-,P,xP-xx,0.0744,0.3755 +CA,-1,-,-,x--xx,-0.0263,0.1326 +CA,-1,p,p,xppxx,-0.0094,0.0475 +CA,1,G,P,xxGPx,1.3044,6.5813 +CA,1,G,-,xxG-x,-0.0632,0.3188 +CA,1,P,G,xxPGx,0.2642,1.3329 +CA,1,P,P,xxPPx,0.3025,1.5262 +CA,1,P,r,xxPrx,0.1455,0.7343 +CA,1,P,-,xxP-x,0.1188,0.5994 +CA,1,P,p,xxPpx,0.1201,0.6062 +CA,1,r,P,xxrPx,-0.1958,0.9878 +CA,1,r,-,xxr-x,-0.0931,0.4696 +CA,1,a,P,xxaPx,-0.1428,0.7204 +CA,1,a,-,xxa-x,-0.0262,0.1324 +CA,1,a,p,xxapx,0.0392,0.1977 +CA,1,+,P,xx+Px,-0.1059,0.5344 +CA,1,+,a,xx+ax,-0.0377,0.1901 +CA,1,+,+,xx++x,-0.0595,0.3001 +CA,1,-,P,xx-Px,-0.1156,0.5831 +CA,1,-,+,xx-+x,0.0316,0.1593 +CA,1,-,p,xx-px,0.0612,0.3090 +CA,1,p,r,xxprx,-0.0511,0.2576 +CA,-2,P,-,-xPxx,-0.1028,0.5185 +CA,-2,r,r,rxrxx,0.1933,0.9752 +CA,-2,-,G,Gx-xx,0.0559,0.2818 +CA,-2,-,p,px-xx,0.0391,0.1973 +CA,-2,p,a,axpxx,-0.0293,0.1479 +CA,-2,p,+,+xpxx,-0.0173,0.0873 +CA,2,G,-,xxGx-,0.0357,0.1802 +CA,2,+,G,xx+xG,-0.0315,0.1591 +CA,2,-,P,xx-xP,0.0426,0.2150 +CA,2,-,r,xx-xr,0.0784,0.3954 +CA,2,-,a,xx-xa,0.1084,0.5467 +CA,2,-,-,xx-x-,0.0836,0.4216 +CA,2,p,P,xxpxP,0.0685,0.3456 +CA,2,p,-,xxpx-,-0.0481,0.2428 +CB,-1,P,r,xrPxx,-0.2678,1.7345 +CB,-1,P,p,xpPxx,0.0355,0.2300 +CB,-1,r,P,xPrxx,-0.1137,0.7367 +CB,-1,a,p,xpaxx,0.0249,0.1613 +CB,-1,+,-,x-+xx,-0.0762,0.4935 +CB,-1,-,P,xP-xx,-0.0889,0.5757 +CB,-1,-,r,xr-xx,-0.0533,0.3451 +CB,-1,-,-,x--xx,0.0496,0.3215 +CB,-1,-,p,xp-xx,-0.0148,0.0960 +CB,-1,p,P,xPpxx,0.0119,0.0768 +CB,-1,p,r,xrpxx,-0.0673,0.4358 +CB,1,P,G,xxPGx,-0.0522,0.3379 +CB,1,P,P,xxPPx,-0.8458,5.4779 +CB,1,P,r,xxPrx,-0.1573,1.0187 +CB,1,r,r,xxrrx,0.1634,1.0581 +CB,1,a,G,xxaGx,-0.0393,0.2544 +CB,1,a,r,xxarx,0.0274,0.1777 +CB,1,a,-,xxa-x,0.0394,0.2553 +CB,1,a,p,xxapx,0.0149,0.0968 +CB,1,+,G,xx+Gx,-0.0784,0.5076 +CB,1,+,P,xx+Px,-0.1170,0.7580 +CB,1,-,P,xx-Px,-0.0913,0.5912 +CB,1,-,-,xx--x,0.0284,0.1838 +CB,1,p,P,xxpPx,0.0880,0.5697 +CB,1,p,p,xxppx,-0.0113,0.0733 +CB,-2,P,-,-xPxx,0.0389,0.2521 +CB,-2,P,p,pxPxx,0.0365,0.2362 +CB,-2,r,+,+xrxx,0.0809,0.5242 +CB,-2,a,-,-xaxx,-0.0452,0.2927 +CB,-2,+,-,-x+xx,-0.0651,0.4218 +CB,-2,-,G,Gx-xx,-0.0883,0.5717 +CB,-2,p,G,Gxpxx,0.0378,0.2445 +CB,-2,p,p,pxpxx,0.0207,0.1341 +CB,2,r,G,xxrxG,-0.0362,0.2344 +CB,2,r,-,xxrx-,-0.0219,0.1419 +CB,2,a,-,xxax-,-0.0298,0.1929 +CB,2,+,p,xx+xp,0.0189,0.1223 +CB,2,-,-,xx-x-,-0.0525,0.3400 +N,-1,G,P,xPGxx,0.2411,0.5105 +N,-1,G,+,x+Gxx,-0.1773,0.3754 +N,-1,G,-,x-Gxx,0.1905,0.4035 +N,-1,P,P,xPPxx,-0.9177,1.9434 +N,-1,P,p,xpPxx,0.2609,0.5525 +N,-1,r,G,xGrxx,0.2417,0.5119 +N,-1,r,a,xarxx,-0.0139,0.0295 +N,-1,r,+,x+rxx,-0.4122,0.8729 +N,-1,r,p,xprxx,0.1440,0.3049 +N,-1,a,G,xGaxx,-0.5177,1.0963 +N,-1,a,r,xraxx,0.0890,0.1885 +N,-1,a,a,xaaxx,0.1393,0.2950 +N,-1,a,p,xpaxx,-0.0825,0.1747 +N,-1,+,G,xG+xx,-0.4908,1.0394 +N,-1,+,a,xa+xx,0.1709,0.3619 +N,-1,+,+,x++xx,0.1868,0.3955 +N,-1,+,-,x-+xx,-0.0951,0.2014 +N,-1,-,P,xP-xx,-0.3027,0.6410 +N,-1,-,r,xr-xx,-0.1670,0.3537 +N,-1,-,+,x+-xx,-0.3501,0.7414 +N,-1,-,-,x--xx,0.1266,0.2681 +N,-1,p,G,xGpxx,-0.1707,0.3614 +N,-1,p,-,x-pxx,0.0011,0.0023 +N,1,G,G,xxGGx,0.2555,0.5412 +N,1,G,P,xxGPx,-0.9725,2.0595 +N,1,G,r,xxGrx,0.0165,0.0349 +N,1,G,p,xxGpx,0.0703,0.1489 +N,1,r,a,xxrax,-0.0237,0.0503 +N,1,a,r,xxarx,-0.1816,0.3845 +N,1,a,-,xxa-x,-0.1050,0.2224 +N,1,a,p,xxapx,-0.1196,0.2533 +N,1,-,r,xx-rx,-0.1762,0.3731 +N,1,-,a,xx-ax,0.0006,0.0013 +N,1,p,P,xxpPx,0.2797,0.5923 +N,1,p,a,xxpax,0.0938,0.1986 +N,1,p,+,xxp+x,0.1359,0.2878 +N,-2,G,r,rxGxx,-0.5140,1.0885 +N,-2,G,-,-xGxx,-0.0639,0.1354 +N,-2,P,P,PxPxx,-0.4215,0.8927 +N,-2,r,P,Pxrxx,-0.3696,0.7828 +N,-2,r,p,pxrxx,-0.1937,0.4101 +N,-2,a,-,-xaxx,-0.0351,0.0743 +N,-2,a,p,pxaxx,-0.1031,0.2183 +N,-2,-,G,Gx-xx,-0.2152,0.4558 +N,-2,-,P,Px-xx,-0.1375,0.2912 +N,-2,-,p,px-xx,-0.1081,0.2290 +N,-2,p,P,Pxpxx,-0.1489,0.3154 +N,-2,p,-,-xpxx,0.0952,0.2015 +N,2,G,-,xxGx-,0.1160,0.2457 +N,2,r,p,xxrxp,-0.1288,0.2728 +N,2,a,P,xxaxP,0.1632,0.3456 +N,2,+,+,xx+x+,-0.0106,0.0226 +N,2,+,-,xx+x-,0.0389,0.0824 +N,2,-,a,xx-xa,-0.0815,0.1726 +N,2,p,G,xxpxG,-0.0779,0.1649 +N,2,p,p,xxpxp,-0.0683,0.1447 +H,-1,G,P,xPGxx,-0.0317,0.4730 +H,-1,G,r,xrGxx,0.0549,0.8186 +H,-1,G,+,x+Gxx,-0.0192,0.2867 +H,-1,G,-,x-Gxx,0.0138,0.2055 +H,-1,r,P,xPrxx,-0.0964,1.4367 +H,-1,r,-,x-rxx,-0.0245,0.3648 +H,-1,a,G,xGaxx,-0.0290,0.4320 +H,-1,a,a,xaaxx,0.0063,0.0944 +H,-1,+,G,xG+xx,-0.0615,0.9168 +H,-1,+,r,xr+xx,-0.0480,0.7153 +H,-1,+,-,x-+xx,-0.0203,0.3030 +H,-1,-,+,x+-xx,-0.0232,0.3455 +H,-1,p,G,xGpxx,-0.0028,0.0411 +H,-1,p,P,xPpxx,-0.0121,0.1805 +H,1,G,P,xxGPx,-0.1418,2.1144 +H,1,G,r,xxGrx,0.0236,0.3520 +H,1,G,a,xxGax,0.0173,0.2580 +H,1,a,-,xxa-x,0.0091,0.1349 +H,1,+,P,xx+Px,-0.0422,0.6290 +H,1,+,p,xx+px,0.0191,0.2842 +H,1,-,P,xx-Px,-0.0474,0.7065 +H,1,-,a,xx-ax,0.0102,0.1515 +H,-2,G,G,GxGxx,0.0169,0.2517 +H,-2,G,r,rxGxx,-0.3503,5.2220 +H,-2,a,P,Pxaxx,0.0216,0.3227 +H,-2,a,-,-xaxx,-0.0276,0.4118 +H,-2,+,-,-x+xx,-0.0260,0.3874 +H,-2,-,G,Gx-xx,0.0273,0.4073 +H,-2,-,a,ax-xx,-0.0161,0.2400 +H,-2,-,-,-x-xx,-0.0285,0.4255 +H,-2,p,P,Pxpxx,-0.0101,0.1503 +H,-2,p,a,axpxx,-0.0157,0.2343 +H,-2,p,+,+xpxx,-0.0122,0.1815 +H,-2,p,p,pxpxx,0.0107,0.1601 +H,2,G,G,xxGxG,-0.0190,0.2826 +H,2,r,G,xxrxG,0.0472,0.7036 +H,2,r,P,xxrxP,0.0337,0.5027 +H,2,a,+,xxax+,-0.0159,0.2376 +H,2,+,G,xx+xG,0.0113,0.1685 +H,2,+,r,xx+xr,-0.0307,0.4575 +H,2,-,P,xx-xP,-0.0088,0.1318 +HA,-1,P,P,xPPxx,0.0307,1.1685 +HA,-1,P,r,xrPxx,0.0621,2.3592 +HA,-1,r,G,xGrxx,-0.0371,1.4092 +HA,-1,r,+,x+rxx,0.0125,0.4733 +HA,-1,r,p,xprxx,-0.0199,0.7569 +HA,-1,a,G,xGaxx,0.0073,0.2779 +HA,-1,a,a,xaaxx,0.0044,0.1683 +HA,-1,-,G,xG-xx,0.0116,0.4409 +HA,-1,-,r,xr-xx,0.0228,0.8679 +HA,-1,-,p,xp-xx,0.0074,0.2828 +HA,1,G,G,xxGGx,0.0175,0.6636 +HA,1,G,-,xxG-x,0.0107,0.4081 +HA,1,P,a,xxPax,0.0089,0.3369 +HA,1,-,r,xx-rx,0.0113,0.4291 +HA,-2,G,G,GxGxx,-0.0154,0.5847 +HA,-2,P,-,-xPxx,0.0136,0.5179 +HA,-2,r,G,Gxrxx,-0.0159,0.6045 +HA,-2,+,+,+x+xx,-0.0137,0.5190 +HA,-2,p,-,-xpxx,-0.0068,0.2592 +HA,-2,p,p,pxpxx,0.0046,0.1763 +HB,-1,P,r,xrPxx,0.0460,2.1365 +HB,-1,a,-,x-axx,0.0076,0.3551 +HB,-1,+,-,x-+xx,0.0110,0.5122 +HB,-1,-,r,xr-xx,0.0233,1.0819 +HB,1,a,P,xxaPx,0.0287,1.3310 +HB,1,+,P,xx+Px,0.0324,1.5056 +HB,1,+,r,xx+rx,-0.0231,1.0709 +HB,1,p,r,xxprx,0.0077,0.3586 +HB,1,p,+,xxp+x,-0.0074,0.3426 +HB,-2,a,P,Pxaxx,-0.0026,0.1192 +HB,-2,a,r,rxaxx,-0.0098,0.4559 +HB,-2,-,-,-x-xx,0.0016,0.0751 +HB,2,P,r,xxPxr,-0.0595,2.7608 +HB,2,P,+,xxPx+,-0.0145,0.6744 +HB,2,P,-,xxPx-,0.0107,0.4976 +HB,2,a,+,xxax+,-0.0015,0.0691 +HB,2,p,r,xxpxr,0.0262,1.2178 diff --git a/trizod/potenci/data/tablenei.csv b/trizod/potenci/data/tablenei.csv new file mode 100644 index 0000000..395b1a2 --- /dev/null +++ b/trizod/potenci/data/tablenei.csv @@ -0,0 +1,142 @@ +atom,aa,corr1,corr2,corr3,corr4 +C,A,0.06131,-0.04544,0.14646,0.01305 +C,C,0.04502,0.12592,-0.03407,-0.02654 +C,D,0.08180,-0.08589,0.22948,0.10934 +C,E,0.05388,0.22264,0.06962,0.01929 +C,F,-0.06286,-0.22396,-0.34442,0.00950 +C,G,0.12772,0.72041,0.16048,0.01324 +C,H,-0.00628,-0.03355,0.13309,-0.03906 +C,I,-0.11709,0.06591,-0.06361,-0.03628 +C,K,0.03368,0.15830,0.04518,-0.01576 +C,L,-0.03877,0.11608,0.02535,0.01976 +C,M,0.04611,0.25233,-0.00747,-0.01624 +C,N,0.07068,-0.06118,0.10077,0.05547 +C,P,-0.36018,-1.90872,0.16158,-0.05286 +C,Q,0.10861,0.19878,0.01596,-0.01757 +C,R,0.01933,0.13237,0.03606,-0.02468 +C,S,0.09888,0.28691,0.07601,0.01379 +C,T,0.05658,0.41659,-0.01103,-0.00114 +C,V,-0.11591,0.09565,-0.03355,-0.03368 +C,W,-0.01954,-0.19134,-0.37965,0.01582 +C,Y,-0.08380,-0.24519,-0.32700,-0.00577 +CA,A,0.03588,0.03480,-0.00468,-0.00920 +CA,C,0.02749,0.15742,0.14376,0.03681 +CA,D,-0.00751,0.12494,0.17354,0.14157 +CA,E,0.00985,0.13936,0.03289,-0.00702 +CA,F,0.01122,0.03732,-0.19586,-0.00377 +CA,G,-0.00885,0.23403,-0.03184,-0.01144 +CA,H,-0.02102,0.04621,0.03122,-0.02826 +CA,I,-0.00656,0.05965,-0.10588,-0.04372 +CA,K,0.01817,0.11216,-0.00341,-0.02950 +CA,L,0.04507,0.07829,-0.03526,0.00858 +CA,M,0.07553,0.18840,0.04987,-0.01749 +CA,N,-0.00649,0.11842,0.18729,0.06401 +CA,P,-0.27536,-2.02189,0.01327,-0.08732 +CA,Q,0.06365,0.15281,0.04575,-0.01356 +CA,R,0.04338,0.11783,0.00345,-0.02873 +CA,S,0.02867,0.07846,0.09443,0.02061 +CA,T,-0.01625,0.10626,0.03880,-0.00126 +CA,V,-0.04935,0.04248,-0.10195,-0.03778 +CA,W,0.00434,0.16188,-0.08742,0.03983 +CA,Y,0.02782,0.02846,-0.24750,0.00759 +CB,A,-0.00953,0.05704,-0.04838,0.00755 +CB,C,-0.00164,0.00760,-0.03293,-0.05613 +CB,D,0.02064,0.09849,-0.08746,-0.06691 +CB,E,0.01283,0.05404,-0.01342,0.02238 +CB,F,0.01028,0.03363,0.18112,0.01493 +CB,G,-0.02758,0.04383,0.06071,-0.02639 +CB,H,-0.01760,-0.02367,0.00343,0.00415 +CB,I,0.02783,0.01052,0.00641,0.05090 +CB,K,0.00350,0.02852,-0.00408,0.01218 +CB,L,0.01223,-0.02940,-0.07268,0.00884 +CB,M,-0.02925,-0.03912,-0.06587,0.03490 +CB,N,-0.02242,0.03403,-0.09759,-0.08018 +CB,P,0.08431,-0.35696,-0.04680,0.05192 +CB,Q,-0.01649,-0.01016,-0.03663,0.01723 +CB,R,-0.01887,0.00618,-0.00385,0.02884 +CB,S,-0.00921,0.07096,-0.06338,-0.03707 +CB,T,0.02601,0.04904,-0.01728,0.00781 +CB,V,0.03068,0.06325,0.01928,0.05011 +CB,W,-0.07651,-0.11334,0.13806,-0.03339 +CB,Y,0.00082,0.01466,0.18107,-0.01181 +N,A,0.09963,-0.00873,-2.31666,-0.14051 +N,C,0.11905,-0.01296,1.15573,0.01820 +N,D,0.11783,-0.11817,-1.16322,-0.37601 +N,E,0.10825,-0.00605,-0.41856,0.01187 +N,F,-0.12280,-0.27542,0.34635,0.09102 +N,G,0.10365,-0.05667,-1.50346,-0.00146 +N,H,-0.04145,-0.26494,0.26356,0.18198 +N,I,-0.09249,0.12136,2.75071,0.40643 +N,K,-0.02472,0.07224,-0.07057,0.12261 +N,L,0.01542,-0.12800,-0.85172,-0.15460 +N,M,-0.11266,-0.27311,-0.33192,0.09384 +N,N,-0.00295,-0.20562,-1.00652,-0.30971 +N,P,0.03252,1.35296,-1.17173,0.06026 +N,Q,0.00900,-0.09950,-0.07389,0.08415 +N,R,-0.07819,0.00802,-0.04821,0.08524 +N,S,0.12057,0.02242,0.48924,-0.25423 +N,T,0.04631,0.09935,1.02269,0.20228 +N,V,-0.03610,0.21959,2.42228,0.39686 +N,W,-0.15643,-0.19285,0.05515,-0.53172 +N,Y,-0.10497,-0.25228,0.46023,0.01399 +H,A,0.01337,-0.00605,-0.04371,-0.02485 +H,C,0.01324,0.05107,0.12857,0.00610 +H,D,0.02859,0.02436,-0.06510,0.02085 +H,E,0.02737,0.01790,0.03740,0.01969 +H,F,-0.02633,-0.08287,-0.11364,-0.03603 +H,G,0.02753,0.05640,-0.10477,0.06876 +H,H,-0.00124,-0.02861,0.04126,0.10004 +H,I,-0.02258,-0.00929,0.07962,0.01880 +H,K,-0.00512,-0.00744,0.04443,0.03434 +H,L,-0.01088,-0.01230,-0.03640,-0.03719 +H,M,-0.01961,-0.00749,-0.00097,0.02041 +H,N,0.01134,0.02121,-0.01837,-0.00629 +H,P,-0.01246,0.02956,0.13007,-0.00810 +H,Q,0.00783,0.00751,0.05643,0.02413 +H,R,-0.00734,0.00546,0.07003,0.04051 +H,S,0.02133,0.03964,0.04978,-0.03749 +H,T,0.00976,0.06072,0.03531,0.01657 +H,V,-0.01267,0.00994,0.09630,0.03420 +H,W,-0.02348,-0.09617,-0.24207,-0.18741 +H,Y,-0.01881,-0.07345,-0.14345,-0.06721 +HA,A,0.00350,-0.02371,-0.00654,0.00652 +HA,C,0.00660,0.01073,0.01921,0.00919 +HA,D,0.01717,-0.00854,-0.00802,-0.00597 +HA,E,0.01090,-0.01091,0.00472,0.00790 +HA,F,-0.02271,-0.06316,-0.03057,-0.02350 +HA,G,0.02155,-0.00151,0.02477,0.01526 +HA,H,-0.01132,-0.05617,-0.01514,0.01264 +HA,I,0.00459,0.00571,0.02984,0.00416 +HA,K,0.00492,-0.01788,0.00555,0.01259 +HA,L,-0.00599,-0.01558,0.00358,0.00167 +HA,M,0.00100,-0.02037,0.00678,0.00930 +HA,N,0.00651,-0.01499,-0.00361,0.00203 +HA,P,0.01542,0.28350,-0.01496,0.00796 +HA,Q,0.00711,-0.02142,0.00734,0.00971 +HA,R,-0.00472,-0.01414,0.00966,0.01180 +HA,S,0.01572,0.02791,0.03762,0.00133 +HA,T,0.01714,0.06590,0.03085,0.00143 +HA,V,0.00777,0.01505,0.02525,0.00659 +HA,W,-0.06818,-0.08412,-0.09386,-0.06072 +HA,Y,-0.02701,-0.05585,-0.03243,-0.02987 +HB,A,0.01473,0.01843,0.01428,0.00451 +HB,C,0.01180,0.03340,0.03081,0.00169 +HB,D,0.01786,0.01626,0.02221,0.01030 +HB,E,0.01796,0.01820,0.00835,-0.00045 +HB,F,-0.04867,-0.09154,-0.04858,-0.00164 +HB,G,0.01718,0.03852,0.01043,0.00051 +HB,H,-0.00817,-0.04557,-0.00820,0.00855 +HB,I,0.00446,0.00111,0.00049,-0.00283 +HB,K,0.01570,0.01156,0.00771,0.00646 +HB,L,0.00700,0.01236,0.00880,0.00150 +HB,M,0.01607,0.02294,0.01385,-0.00038 +HB,N,0.01893,0.01561,0.02760,0.01215 +HB,P,-0.01199,-0.02752,0.00891,-0.00033 +HB,Q,0.01636,0.01861,0.01177,-0.00099 +HB,R,0.01324,0.01526,0.01082,0.00378 +HB,S,0.01859,0.03487,0.02890,-0.00477 +HB,T,0.01624,0.04073,0.01936,-0.00348 +HB,V,0.00380,0.00271,-0.00144,-0.00315 +HB,W,-0.09045,-0.06895,-0.10934,-0.01948 +HB,Y,-0.05069,-0.06698,-0.05666,-0.01193 + diff --git a/trizod/potenci/data/tablephshifts.csv b/trizod/potenci/data/tablephshifts.csv new file mode 100644 index 0000000..cd2a608 --- /dev/null +++ b/trizod/potenci/data/tablephshifts.csv @@ -0,0 +1,85 @@ +residue,atom,val1,val2,val3,val4,val5 +D,H,8.55,8.38,-0.17,0.02,-0.03 +D,HA,4.78,4.61,-0.17,0.01,-0.01 +D,HB,2.93,2.70,-0.23,, +D,CA,52.9,54.3,1.4,0.0,0.1 +D,CB,38.0,41.1,3.0,, +D,CG,177.1,180.3,3.2,, +D,C,175.8,176.9,1.1,-0.2,0.4 +D,N,118.7,120.2,1.5,0.3,0.1 +D,Np,na,na,0.1,, +E,H,8.45,8.57,0.12,0.00,0.02 +E,HA,4.39,4.29,-0.10,0.01,0.00 +E,HB,2.08,2.02,-0.06,, +E,HG,2.49,2.27,-0.22,, +E,CA,56.0,56.9,1.0,0.0,0.0 +E,CB,28.5,30.0,1.5,, +E,CG,32.7,36.1,3.5,, +E,CD,179.7,183.8,4.1,, +E,C,176.5,177.0,0.6,0.1,0.1 +E,N,119.9,120.9,1.0,0.2,0.1 +E,Np,na,na,0.1,, +H,H,8.55,8.35,-0.2,-0.01,0.0 +H,HA,4.75,4.59,-0.2,-0.01,-0.06 +H,HB,3.25,3.08,-0.17,, +H,HD2,7.30,6.97,-0.33,, +H,HE1,8.60,7.68,-0.92,, +H,CA,55.1,56.7,1.6,-0.1,0.1 +H,CB,28.9,31.3,2.4,, +H,CG,131.0,135.3,4.2,, +H,CD2,120.3,120.0,-0.3,, +H,CE1,136.6,139.2,2.6,, +H,C,174.8,176.2,1.5,0.0,0.6 +H,N,117.9,119.7,1.8,0.3,0.5 +H,Np,na,na,0.5,, +H,ND1,175.8,231.3,56,, +H,NE2,173.1,181.1,8,, +C,H,8.49,8.49,0.0,, +C,HA,4.56,4.28,-0.28,-0.01,-0.01 +C,HB,2.97,2.88,-0.09,, +C,CA,58.5,60.6,2.1,0.0,0.1 +C,CB,28.0,29.7,1.7,, +C,C,175.0,176.9,1.9,-0.4,0.5 +C,N,118.7,122.2,3.6,0.4,0.6 +C,Np,na,na,0.6,, +Y,H,8.16,8.16,0.0,, +Y,HA,4.55,4.49,-0.06,, +Y,HB,3.02,2.94,-0.08,, +Y,HD,7.14,6.97,-0.17,, +Y,HE,6.85,6.57,-0.28,, +Y,CA,58.0,58.2,0.3,, +Y,CB,38.6,38.7,0.1,, +Y,CG,130.5,123.8,-6.7,, +Y,CD,133.3,133.2,-0.1,, +Y,CE,118.4,121.7,3.3,, +Y,CZ,157.0,167.4,10.4,, +Y,C,176.3,176.7,0.4,, +Y,N,120.1,120.7,0.6,, +K,H,8.4,8.4,0.0,, +K,HA,4.34,4.30,-0.04,, +K,HB,1.82,1.78,-0.04,, +K,HG,1.44,1.36,-0.08,, +K,HD,1.68,1.44,-0.24,, +K,HE,3.00,2.60,-0.40,, +K,CA,56.4,56.9,0.4,, +K,CB,32.8,33.2,0.3,, +K,CG,24.7,25.0,0.4,, +K,CD,28.9,33.9,5.0,, +K,CE,42.1,43.1,1.0,, +K,C,177.0,177.5,0.5,, +K,N,121.0,121.7,0.7,, +K,Np,na,na,0.1,, +R,H,7.81,7.81,0.0,, +R,HA,3.26,3.19,-0.07,, +R,HB,1.60,1.55,0.05,, +R,HG,1.60,1.55,0.05,, +R,HD,3.19,3.00,-0.19,, +R,CA,58.4,58.6,0.2,, +R,CB,34.4,35.2,0.9,, +R,CG,27.2,28.1,1.0,, +R,CD,43.8,44.3,0.5,, +R,CZ,159.6,163.5,4.0,, +R,C,185.8,186.1,0.2,, +R,N,122.4,122.8,0.4,, +R,NE,85.6,91.5,5.9,, +R,NG,71.2,93.2,22,, diff --git a/trizod/potenci/data/tabletempk.csv b/trizod/potenci/data/tabletempk.csv new file mode 100644 index 0000000..657d0b6 --- /dev/null +++ b/trizod/potenci/data/tabletempk.csv @@ -0,0 +1,22 @@ +aa,CA,CB,C,N,H,HA +A,-2.2,4.7,-7.1,-5.3,-9.0,0.7 +C,-0.9,1.3,-2.6,-8.2,-7.0,0.0 +D,2.8,6.5,-4.8,-3.9,-6.2,-0.1 +E,0.9,4.6,-4.9,-3.7,-6.5,0.3 +F,-4.7,2.4,-6.9,-11.2,-7.5,0.4 +G,3.3,0.0,-3.2,-6.2,-9.1,0.0 +H,7.8,15.5,3.1,3.3,-7.8,0.4 +I,-2.0,4.6,-8.7,-12.7,-7.8,0.4 +K,-0.8,2.4,-7.1,-7.6,-7.5,0.4 +L,1.7,4.9,-8.2,-2.9,-7.5,0.1 +M,4.1,9.4,-8.2,-6.2,-7.1,-0.5 +N,2.8,5.1,-6.1,-3.3,-7.0,-2.9 +P,1.1,-0.2,-4.0,0.0,0.0,0.0 +Q,2.3,3.6,-5.7,-6.5,-7.2,0.3 +R,-1.4,3.5,-6.9,-5.3,-7.1,0.4 +S,-1.7,4.4,-4.7,-3.8,-7.6,0.1 +T,0.0,2.2,-5.2,-6.7,-7.3,0.0 +V,-2.8,2.5,-8.1,-14.2,-7.6,0.5 +W,-2.7,3.1,-7.9,-10.1,-7.8,0.4 +Y,-5.0,2.9,-7.7,-12.0,-7.7,0.5 + diff --git a/trizod/potenci/data/tabletermcorrs.csv b/trizod/potenci/data/tabletermcorrs.csv new file mode 100644 index 0000000..515743d --- /dev/null +++ b/trizod/potenci/data/tabletermcorrs.csv @@ -0,0 +1,16 @@ +atom,term,corr +C,n,-0.15238 +C,c,-0.90166 +CB,n,0.12064 +CB,c,0.06854 +CA,n,-0.04616 +CA,c,-0.06680 +N,n,0.347176 +N,c,0.619141 +H,n,0.156786 +H,c,0.023189 +HB,n,0.0052692 +HB,c,0.0310875 +HA,n,0.048624 +HA,c,0.042019 + diff --git a/trizod/potenci/potenci.py b/trizod/potenci/potenci.py index ea7abce..8ce2525 100644 --- a/trizod/potenci/potenci.py +++ b/trizod/potenci/potenci.py @@ -1,31 +1,61 @@ -#!/bin/bash python3 - -# version of the POTENCI script, adapted by haak@rostlab.org -# original by fmulder@chem.au.dk -# original taken from https://github.com/protein-nmr/POTENCI on 03.05.2023, commit 17dd2e6f3733c702323894697238c87e6723f934 -# original version (filename): pytenci1_3.py +#!/usr/bin/env python3 +"""POTENCI implementation for predicting random coil NMR chemical shifts. + +This is a refactored version of the POTENCI algorithm, originally developed by +Frans A. A. Mulder's group. The implementation has been modernized with: +- Type hints and dataclasses +- CSV-based data storage +- Improved code organization +- Security improvements (no eval()) + +Original author: fmulder@chem.au.dk +Adapted by: markus.haak@tum.de & tobias.senoner@tum.de +Original source: https://github.com/protein-nmr/POTENCI +Original commit: 17dd2e6f3733c702323894697238c87e6723f934 (2019-06-07) +Original filename: pytenci1_3.py + +References: + Nielsen, J. T., & Mulder, F. A. (2018). POTENCI: prediction of temperature, + neighbor and pH-corrected chemical shifts for intrinsically disordered proteins. + Journal of Biomolecular NMR, 70(3), 141-165. +""" +import logging import sys -import string -from scipy.special import erfc -from scipy.optimize import curve_fit -from scipy import sparse + import numpy as np -import pandas as pd -import os -##from matplotlib import pyplot as pl -from trizod.potenci.constants import R, e, a, b, cutoff, ncycles, pK0 -import logging -import pkgutil -from io import StringIO +from scipy.optimize import curve_fit +from scipy.special import erfc + +from trizod.potenci.constants import ( + AA_STANDARD, + PHYSICAL_CONSTANTS, + PK0, + alltuples_, + load_central_shifts, + load_combinatorial_deviations, + load_neighbor_corrections, + load_ph_shifts, + load_temperature_coefficients, + load_terminal_corrections, + outer_matrices, +) + +# Load data tables at module level (cached automatically) +CENTSHIFTS = load_central_shifts() +NEICORRS = {**load_neighbor_corrections(), **load_terminal_corrections()} +COMBCORRS = load_combinatorial_deviations() +TEMPCORRS = load_temperature_coefficients() +PHSHIFTS = load_ph_shifts() + +# Physical constants +R = PHYSICAL_CONSTANTS.gas_constant +e = PHYSICAL_CONSTANTS.dielectric_constant +a = PHYSICAL_CONSTANTS.distance_param_a +b = PHYSICAL_CONSTANTS.distance_param_b +cutoff = PHYSICAL_CONSTANTS.cutoff +ncycles = PHYSICAL_CONSTANTS.n_cycles -outer_matrices = [] -alltuples_ = [] -for smallN in range(0,6): - alltuples = np.array([[int(c) for c in np.binary_repr(i, smallN)] for i in range(2 ** (smallN))]) - outerm = np.array([np.outer(c,c) for c in alltuples]) - outer_matrices.append(outerm) - alltuples_.append(alltuples) def smallmatrixlimits(ires, cutoff, len): ileft = max(1, ires - cutoff) @@ -34,6 +64,7 @@ def smallmatrixlimits(ires, cutoff, len): ileft = max(1, iright - 2 * cutoff) return (ileft, iright) + def smallmatrixpos(ires, cutoff, len): resi = cutoff + 1 if ires < cutoff + 1: @@ -42,1043 +73,475 @@ def smallmatrixpos(ires, cutoff, len): resi = min(len, 2 * cutoff + 1) - (len - ires) return resi + def fun(pH, pK, nH): - #return (10 ** ( nH*(pK - pH) ) ) / (1. + (10 **( nH*(pK - pH) ) ) ) - return 1. - 1. / ((10 ** ( nH*(pK - pH) ) ) + 1.) # identical + # return (10 ** ( nH*(pK - pH) ) ) / (1. + (10 **( nH*(pK - pH) ) ) ) + return 1.0 - 1.0 / ((10 ** (nH * (pK - pH))) + 1.0) # identical -def log_fun(pH, pK, nH): - return -np.log10(1 + 10**(nH*(pH - pK))) -def W(r,Ion=0.1): - k = np.sqrt(Ion) / 3.08 #Ion=0.1 is default +def w(r, Ion=0.1): + k = np.sqrt(Ion) / 3.08 # Ion=0.1 is default x = k.astype(np.float64) * r.astype(np.float64) / np.sqrt(6) i1 = 332.286 * np.sqrt(6 / np.pi) i2_3 = erfc(x) i2_2 = np.sqrt(np.pi) * x - i3 = (e * r) - i4 = np.exp(((x ** 2) - np.log(i3))) # always equal to np.exp(x ** 2) / (e * r), but intermediates are smaller - i4 = np.nan_to_num(i4) # to convert inf values to the largest possible value + i3 = e * r + i4 = np.exp( + (x**2) - np.log(i3) + ) # always equal to np.exp(x ** 2) / (e * r), but intermediates are smaller + i4 = np.nan_to_num(i4) # to convert inf values to the largest possible value return i1 * ((1 / i3) - np.nan_to_num(i4 * i2_2 * i2_3)) -def w2logp(x,T=293.15): - return x * 4181.2 / (R * T * np.log(10)) + +def w2logp(x, T=293.15): + return x * 4181.2 / (R * T * np.log(10)) + def calc_pkas_from_seq(seq=None, T=293.15, Ion=0.1): - #pH range + # pH range pHs = np.arange(1.99, 10.01, 0.15) - pos = np.array([i for i in range(len(seq)) if seq[i] in pK0.keys()]) + pos = np.array([i for i in range(len(seq)) if seq[i] in PK0]) N = pos.shape[0] - I = np.diag(np.ones(N)) - sites = ''.join([seq[i] for i in pos]) - neg = np.array([i for i in range(len(sites)) if sites[i] in 'DEYc']) - l = np.array([abs(pos - pos[i]) for i in range(N)]) - d = a + np.sqrt(l) * b + identity_matrix = np.diag(np.ones(N)) + sites = "".join([seq[i] for i in pos]) + neg = np.array([i for i in range(len(sites)) if sites[i] in "DEYc"]) + lengths = np.array([abs(pos - pos[i]) for i in range(N)]) + d = a + np.sqrt(lengths) * b - tmp = W(d,Ion) - tmp[I == 1] = 0 + tmp = w(d, Ion) + tmp[identity_matrix == 1] = 0 - ww = w2logp(tmp,T) / 2 + ww = w2logp(tmp, T) / 2 chargesempty = np.zeros(pos.shape[0]) - if len(neg): chargesempty[neg] = -1 + if len(neg): + chargesempty[neg] = -1 - pK0s = np.array([pK0[c] for c in sites]) + pK0s = np.array([PK0[c] for c in sites]) nH0s = np.array([0.9 for c in sites]) - titration = np.zeros((N,len(pHs))) + titration = np.zeros((N, len(pHs))) - smallN = min(2 * cutoff + 1, len(pos)) + smallN = min(2 * cutoff + 1, len(pos)) alltuples = alltuples_[smallN] outerm = outer_matrices[smallN] gmatrix = [np.zeros((smallN, smallN)) for _ in range(len(pHs))] - #perform iterative fitting......................... + # Perform iterative fitting for pKa calculation for icycle in range(ncycles): - ##print (icycle) - if icycle == 0: - fractionhold = np.array([[fun(pHs[p], pK0s[i], nH0s[i]) for i in range(N)] for p in range(len(pHs))]) + fractionhold = np.array( + [[fun(pHs[p], pK0s[i], nH0s[i]) for i in range(N)] for p in range(len(pHs))] + ) else: fractionhold = titration.transpose() - for ires in range(1, N+1): - (ileft,iright) = smallmatrixlimits(ires, cutoff, N) + for ires in range(1, N + 1): + (ileft, iright) = smallmatrixlimits(ires, cutoff, N) resi = smallmatrixpos(ires, cutoff, N) fraction = fractionhold.copy() - fraction[:,ileft - 1:iright] = 0 + fraction[:, ileft - 1 : iright] = 0 charges = fraction + chargesempty ww0 = 2 * (ww * np.expand_dims(charges, axis=1)).sum(axis=-1) - ww0 = (np.expand_dims(ww0, 1) * I) # array of diagonal matrices - gmatrixfull = (ww + ww0 + np.expand_dims(pHs,(1,2)) * I - np.diag(pK0s)) + ww0 = np.expand_dims(ww0, 1) * identity_matrix # array of diagonal matrices + gmatrixfull = ww + ww0 + np.expand_dims(pHs, (1, 2)) * identity_matrix - np.diag(pK0s) gmatrix = gmatrixfull[:, ileft - 1 : iright, ileft - 1 : iright] - - E = (10 ** -(np.expand_dims(gmatrix, axis=1) * outerm).sum(axis=(2,3)))#.sum(axis=-1) + + E = 10 ** -(np.expand_dims(gmatrix, axis=1) * outerm).sum(axis=(2, 3)) # .sum(axis=-1) E_all = E.sum(axis=-1) - E_sel = E[:,(alltuples[:,resi-1] == 1)].sum(axis=-1) - titration[ires-1] = E_sel/E_all - sol = np.array([curve_fit(fun, pHs, titration[p], [pK0s[p], nH0s[p]], maxfev=5000)[0] for p in range(len(pK0s))]) + E_sel = E[:, (alltuples[:, resi - 1] == 1)].sum(axis=-1) + titration[ires - 1] = E_sel / E_all + sol = np.array( + [ + curve_fit(fun, pHs, titration[p], [pK0s[p], nH0s[p]], maxfev=5000)[0] + for p in range(len(pK0s)) + ] + ) (pKs, nHs) = sol.transpose() - dct={} - for p,i in enumerate(pos): - dct[i-1]=(pKs[p],nHs[p],seq[i]) - - return dct - + dct = {} + for p, i in enumerate(pos): + dct[i - 1] = (pKs[p], nHs[p], seq[i]) -##--------------- POTENCI core code and data tables from here ----------------- - -#AAstandard='ACDEFGHIKLMNPQRSTVY' -AAstandard='ACDEFGHIKLMNPQRSTVWY' - -tablecent='''aa C CA CB N H HA HB -A 177.44069 52.53002 19.21113 125.40155 8.20964 4.25629 1.31544 -C 174.33917 58.48976 28.06269 120.71212 8.29429 4.44261 2.85425 -D 176.02114 54.23920 41.18408 121.75726 8.28460 4.54836 2.60054 -E 176.19215 56.50755 30.30204 122.31578 8.35949 4.22124 1.92383 -F 175.42280 57.64849 39.55984 121.30500 8.10906 4.57507 3.00036 -G 173.83294 45.23929 None 110.09074 8.32746 3.91016 None -H 175.00142 56.20256 30.60335 120.69141 8.27133 4.55872 3.03080 -I 175.88231 61.04925 38.68742 122.37586 8.06407 4.10574 1.78617 -K 176.22644 56.29413 33.02478 122.71282 8.24902 4.25873 1.71982 -L 177.06101 55.17464 42.29215 123.48611 8.14330 4.28545 1.54067 -M 175.90708 55.50643 32.83806 121.54592 8.24848 4.41483 1.97585 -N 174.94152 53.22822 38.87465 119.92746 8.37189 4.64308 2.72756 -P 176.67709 63.05232 32.03750 137.40612 None 4.36183 2.03318 -Q 175.63494 55.79861 29.44174 121.49225 8.30042 4.28006 1.97653 -R 175.92194 56.06785 30.81298 122.40365 8.26453 4.28372 1.73437 -S 174.31005 58.36048 63.82367 117.11419 8.25730 4.40101 3.80956 -T 174.27772 61.86928 69.80612 115.48126 8.11378 4.28923 4.15465 -V 175.80621 62.20156 32.77934 121.71912 8.06572 4.05841 1.99302 -W 175.92744 57.23836 29.56502 122.10991 7.97816 4.61061 3.18540 -Y 175.49651 57.82427 38.76184 121.43652 8.05749 4.51123 2.91782''' - -def initcorcents(): - datc=tablecent.split('\n') - aas=datc[0].split()[1:] - dct={} - for i in range(20): - vals=datc[1+i].split() - aai=vals[0] - dct[aai]={} - for j in range(7): - atnj=aas[j] - dct[aai][atnj]=eval(vals[1+j]) - return dct - - -tablenei='''C A 0.06131 -0.04544 0.14646 0.01305 - C C 0.04502 0.12592 -0.03407 -0.02654 - C D 0.08180 -0.08589 0.22948 0.10934 - C E 0.05388 0.22264 0.06962 0.01929 - C F -0.06286 -0.22396 -0.34442 0.00950 - C G 0.12772 0.72041 0.16048 0.01324 - C H -0.00628 -0.03355 0.13309 -0.03906 - C I -0.11709 0.06591 -0.06361 -0.03628 - C K 0.03368 0.15830 0.04518 -0.01576 - C L -0.03877 0.11608 0.02535 0.01976 - C M 0.04611 0.25233 -0.00747 -0.01624 - C N 0.07068 -0.06118 0.10077 0.05547 - C P -0.36018 -1.90872 0.16158 -0.05286 - C Q 0.10861 0.19878 0.01596 -0.01757 - C R 0.01933 0.13237 0.03606 -0.02468 - C S 0.09888 0.28691 0.07601 0.01379 - C T 0.05658 0.41659 -0.01103 -0.00114 - C V -0.11591 0.09565 -0.03355 -0.03368 - C W -0.01954 -0.19134 -0.37965 0.01582 - C Y -0.08380 -0.24519 -0.32700 -0.00577 -CA A 0.03588 0.03480 -0.00468 -0.00920 -CA C 0.02749 0.15742 0.14376 0.03681 -CA D -0.00751 0.12494 0.17354 0.14157 -CA E 0.00985 0.13936 0.03289 -0.00702 -CA F 0.01122 0.03732 -0.19586 -0.00377 -CA G -0.00885 0.23403 -0.03184 -0.01144 -CA H -0.02102 0.04621 0.03122 -0.02826 -CA I -0.00656 0.05965 -0.10588 -0.04372 -CA K 0.01817 0.11216 -0.00341 -0.02950 -CA L 0.04507 0.07829 -0.03526 0.00858 -CA M 0.07553 0.18840 0.04987 -0.01749 -CA N -0.00649 0.11842 0.18729 0.06401 -CA P -0.27536 -2.02189 0.01327 -0.08732 -CA Q 0.06365 0.15281 0.04575 -0.01356 -CA R 0.04338 0.11783 0.00345 -0.02873 -CA S 0.02867 0.07846 0.09443 0.02061 -CA T -0.01625 0.10626 0.03880 -0.00126 -CA V -0.04935 0.04248 -0.10195 -0.03778 -CA W 0.00434 0.16188 -0.08742 0.03983 -CA Y 0.02782 0.02846 -0.24750 0.00759 -CB A -0.00953 0.05704 -0.04838 0.00755 -CB C -0.00164 0.00760 -0.03293 -0.05613 -CB D 0.02064 0.09849 -0.08746 -0.06691 -CB E 0.01283 0.05404 -0.01342 0.02238 -CB F 0.01028 0.03363 0.18112 0.01493 -CB G -0.02758 0.04383 0.06071 -0.02639 -CB H -0.01760 -0.02367 0.00343 0.00415 -CB I 0.02783 0.01052 0.00641 0.05090 -CB K 0.00350 0.02852 -0.00408 0.01218 -CB L 0.01223 -0.02940 -0.07268 0.00884 -CB M -0.02925 -0.03912 -0.06587 0.03490 -CB N -0.02242 0.03403 -0.09759 -0.08018 -CB P 0.08431 -0.35696 -0.04680 0.05192 -CB Q -0.01649 -0.01016 -0.03663 0.01723 -CB R -0.01887 0.00618 -0.00385 0.02884 -CB S -0.00921 0.07096 -0.06338 -0.03707 -CB T 0.02601 0.04904 -0.01728 0.00781 -CB V 0.03068 0.06325 0.01928 0.05011 -CB W -0.07651 -0.11334 0.13806 -0.03339 -CB Y 0.00082 0.01466 0.18107 -0.01181 - N A 0.09963 -0.00873 -2.31666 -0.14051 - N C 0.11905 -0.01296 1.15573 0.01820 - N D 0.11783 -0.11817 -1.16322 -0.37601 - N E 0.10825 -0.00605 -0.41856 0.01187 - N F -0.12280 -0.27542 0.34635 0.09102 - N G 0.10365 -0.05667 -1.50346 -0.00146 - N H -0.04145 -0.26494 0.26356 0.18198 - N I -0.09249 0.12136 2.75071 0.40643 - N K -0.02472 0.07224 -0.07057 0.12261 - N L 0.01542 -0.12800 -0.85172 -0.15460 - N M -0.11266 -0.27311 -0.33192 0.09384 - N N -0.00295 -0.20562 -1.00652 -0.30971 - N P 0.03252 1.35296 -1.17173 0.06026 - N Q 0.00900 -0.09950 -0.07389 0.08415 - N R -0.07819 0.00802 -0.04821 0.08524 - N S 0.12057 0.02242 0.48924 -0.25423 - N T 0.04631 0.09935 1.02269 0.20228 - N V -0.03610 0.21959 2.42228 0.39686 - N W -0.15643 -0.19285 0.05515 -0.53172 - N Y -0.10497 -0.25228 0.46023 0.01399 - H A 0.01337 -0.00605 -0.04371 -0.02485 - H C 0.01324 0.05107 0.12857 0.00610 - H D 0.02859 0.02436 -0.06510 0.02085 - H E 0.02737 0.01790 0.03740 0.01969 - H F -0.02633 -0.08287 -0.11364 -0.03603 - H G 0.02753 0.05640 -0.10477 0.06876 - H H -0.00124 -0.02861 0.04126 0.10004 - H I -0.02258 -0.00929 0.07962 0.01880 - H K -0.00512 -0.00744 0.04443 0.03434 - H L -0.01088 -0.01230 -0.03640 -0.03719 - H M -0.01961 -0.00749 -0.00097 0.02041 - H N 0.01134 0.02121 -0.01837 -0.00629 - H P -0.01246 0.02956 0.13007 -0.00810 - H Q 0.00783 0.00751 0.05643 0.02413 - H R -0.00734 0.00546 0.07003 0.04051 - H S 0.02133 0.03964 0.04978 -0.03749 - H T 0.00976 0.06072 0.03531 0.01657 - H V -0.01267 0.00994 0.09630 0.03420 - H W -0.02348 -0.09617 -0.24207 -0.18741 - H Y -0.01881 -0.07345 -0.14345 -0.06721 -HA A 0.00350 -0.02371 -0.00654 0.00652 -HA C 0.00660 0.01073 0.01921 0.00919 -HA D 0.01717 -0.00854 -0.00802 -0.00597 -HA E 0.01090 -0.01091 0.00472 0.00790 -HA F -0.02271 -0.06316 -0.03057 -0.02350 -HA G 0.02155 -0.00151 0.02477 0.01526 -HA H -0.01132 -0.05617 -0.01514 0.01264 -HA I 0.00459 0.00571 0.02984 0.00416 -HA K 0.00492 -0.01788 0.00555 0.01259 -HA L -0.00599 -0.01558 0.00358 0.00167 -HA M 0.00100 -0.02037 0.00678 0.00930 -HA N 0.00651 -0.01499 -0.00361 0.00203 -HA P 0.01542 0.28350 -0.01496 0.00796 -HA Q 0.00711 -0.02142 0.00734 0.00971 -HA R -0.00472 -0.01414 0.00966 0.01180 -HA S 0.01572 0.02791 0.03762 0.00133 -HA T 0.01714 0.06590 0.03085 0.00143 -HA V 0.00777 0.01505 0.02525 0.00659 -HA W -0.06818 -0.08412 -0.09386 -0.06072 -HA Y -0.02701 -0.05585 -0.03243 -0.02987 -HB A 0.01473 0.01843 0.01428 0.00451 -HB C 0.01180 0.03340 0.03081 0.00169 -HB D 0.01786 0.01626 0.02221 0.01030 -HB E 0.01796 0.01820 0.00835 -0.00045 -HB F -0.04867 -0.09154 -0.04858 -0.00164 -HB G 0.01718 0.03852 0.01043 0.00051 -HB H -0.00817 -0.04557 -0.00820 0.00855 -HB I 0.00446 0.00111 0.00049 -0.00283 -HB K 0.01570 0.01156 0.00771 0.00646 -HB L 0.00700 0.01236 0.00880 0.00150 -HB M 0.01607 0.02294 0.01385 -0.00038 -HB N 0.01893 0.01561 0.02760 0.01215 -HB P -0.01199 -0.02752 0.00891 -0.00033 -HB Q 0.01636 0.01861 0.01177 -0.00099 -HB R 0.01324 0.01526 0.01082 0.00378 -HB S 0.01859 0.03487 0.02890 -0.00477 -HB T 0.01624 0.04073 0.01936 -0.00348 -HB V 0.00380 0.00271 -0.00144 -0.00315 -HB W -0.09045 -0.06895 -0.10934 -0.01948 -HB Y -0.05069 -0.06698 -0.05666 -0.01193''' - -tabletermcorrs='''C n -0.15238 -C c -0.90166 -CB n 0.12064 -CB c 0.06854 -CA n -0.04616 -CA c -0.06680 -N n 0.347176 -N c 0.619141 -H n 0.156786 -H c 0.023189 -HB n 0.0052692 -HB c 0.0310875 -HA n 0.048624 -HA c 0.042019''' - -def initcorneis(): - datc=tablenei.split('\n') - dct={} - for i in range(20*7): - vals=datc[i].split() - atn=vals[0] - aai=vals[1] - if not aai in dct:dct[aai]={} - dct[aai][atn]=[eval(vals[2+j]) for j in range(4)] - datc=tabletermcorrs.split('\n') - for i in range(len(datc)): - vals=datc[i].split() - atn=vals[0] - term=vals[1] - if not term in dct:dct[term]={} - if term=='n': dct['n'][atn]=[None,None,None,eval(vals[-1])] - elif term=='c':dct['c'][atn]=[eval(vals[-1]),None,None,None] - return dct - - -tabletempk='''aa CA CB C N H HA -A -2.2 4.7 -7.1 -5.3 -9.0 0.7 -C -0.9 1.3 -2.6 -8.2 -7.0 0.0 -D 2.8 6.5 -4.8 -3.9 -6.2 -0.1 -E 0.9 4.6 -4.9 -3.7 -6.5 0.3 -F -4.7 2.4 -6.9 -11.2 -7.5 0.4 -G 3.3 0.0 -3.2 -6.2 -9.1 0.0 -H 7.8 15.5 3.1 3.3 -7.8 0.4 -I -2.0 4.6 -8.7 -12.7 -7.8 0.4 -K -0.8 2.4 -7.1 -7.6 -7.5 0.4 -L 1.7 4.9 -8.2 -2.9 -7.5 0.1 -M 4.1 9.4 -8.2 -6.2 -7.1 -0.5 -N 2.8 5.1 -6.1 -3.3 -7.0 -2.9 -P 1.1 -0.2 -4.0 0.0 0.0 0.0 -Q 2.3 3.6 -5.7 -6.5 -7.2 0.3 -R -1.4 3.5 -6.9 -5.3 -7.1 0.4 -S -1.7 4.4 -4.7 -3.8 -7.6 0.1 -T 0.0 2.2 -5.2 -6.7 -7.3 0.0 -V -2.8 2.5 -8.1 -14.2 -7.6 0.5 -W -2.7 3.1 -7.9 -10.1 -7.8 0.4 -Y -5.0 2.9 -7.7 -12.0 -7.7 0.5''' - -def gettempkoeff(): - datc=tabletempk.split('\n') - buf=[lin.split() for lin in datc] - headers=buf[0][1:] - dct={} - for atn in headers: - dct[atn]={} - for lin in buf[1:]: - aa=lin[0] - for j,atn in enumerate(headers): - dct[atn][aa]=eval(lin[1+j]) return dct -tablecombdevs='''C -1 G r xrGxx 0.2742 1.4856 - C -1 G - x-Gxx 0.0522 0.2827 - C -1 P P xPPxx -0.0822 0.4450 - C -1 P r xrPxx 0.2640 1.4303 - C -1 r P xPrxx -0.1027 0.5566 - C -1 + P xP+xx 0.0714 0.3866 - C -1 - - x--xx -0.0501 0.2712 - C -1 p r xrpxx 0.0582 0.3151 - C 1 G r xxGrx 0.0730 0.3955 - C 1 P a xxPax -0.0981 0.5317 - C 1 P + xxP+x -0.0577 0.3128 - C 1 P p xxPpx -0.0619 0.3356 - C 1 r r xxrrx -0.1858 1.0064 - C 1 r a xxrax -0.1888 1.0226 - C 1 r + xxr+x -0.1805 0.9779 - C 1 r - xxr-x -0.1756 0.9512 - C 1 r p xxrpx -0.1208 0.6544 - C 1 + P xx+Px -0.0533 0.2886 - C 1 - P xx-Px 0.1867 1.0115 - C 1 p P xxpPx 0.2321 1.2574 - C -2 G r rxGxx -0.1457 0.7892 - C -2 r p pxrxx 0.0555 0.3008 - C 2 P P xxPxP 0.1007 0.5455 - C 2 P - xxPx- 0.0634 0.3433 - C 2 r P xxrxP -0.1447 0.7841 - C 2 a r xxaxr -0.1488 0.8061 - C 2 a - xxax- -0.0093 0.0506 - C 2 + G xx+xG -0.0394 0.2132 - C 2 + P xx+xP 0.1016 0.5502 - C 2 + a xx+xa 0.0299 0.1622 - C 2 + + xx+x+ 0.0427 0.2312 - C 2 - a xx-xa 0.0611 0.3308 - C 2 p P xxpxP -0.0753 0.4078 -CA -1 G P xPGxx -0.0641 0.3233 -CA -1 G r xrGxx 0.2107 1.0630 -CA -1 P P xPPxx -0.2042 1.0303 -CA -1 P p xpPxx 0.0444 0.2240 -CA -1 r G xGrxx 0.2030 1.0241 -CA -1 r + x+rxx -0.0811 0.4093 -CA -1 - P xP-xx 0.0744 0.3755 -CA -1 - - x--xx -0.0263 0.1326 -CA -1 p p xppxx -0.0094 0.0475 -CA 1 G P xxGPx 1.3044 6.5813 -CA 1 G - xxG-x -0.0632 0.3188 -CA 1 P G xxPGx 0.2642 1.3329 -CA 1 P P xxPPx 0.3025 1.5262 -CA 1 P r xxPrx 0.1455 0.7343 -CA 1 P - xxP-x 0.1188 0.5994 -CA 1 P p xxPpx 0.1201 0.6062 -CA 1 r P xxrPx -0.1958 0.9878 -CA 1 r - xxr-x -0.0931 0.4696 -CA 1 a P xxaPx -0.1428 0.7204 -CA 1 a - xxa-x -0.0262 0.1324 -CA 1 a p xxapx 0.0392 0.1977 -CA 1 + P xx+Px -0.1059 0.5344 -CA 1 + a xx+ax -0.0377 0.1901 -CA 1 + + xx++x -0.0595 0.3001 -CA 1 - P xx-Px -0.1156 0.5831 -CA 1 - + xx-+x 0.0316 0.1593 -CA 1 - p xx-px 0.0612 0.3090 -CA 1 p r xxprx -0.0511 0.2576 -CA -2 P - -xPxx -0.1028 0.5185 -CA -2 r r rxrxx 0.1933 0.9752 -CA -2 - G Gx-xx 0.0559 0.2818 -CA -2 - p px-xx 0.0391 0.1973 -CA -2 p a axpxx -0.0293 0.1479 -CA -2 p + +xpxx -0.0173 0.0873 -CA 2 G - xxGx- 0.0357 0.1802 -CA 2 + G xx+xG -0.0315 0.1591 -CA 2 - P xx-xP 0.0426 0.2150 -CA 2 - r xx-xr 0.0784 0.3954 -CA 2 - a xx-xa 0.1084 0.5467 -CA 2 - - xx-x- 0.0836 0.4216 -CA 2 p P xxpxP 0.0685 0.3456 -CA 2 p - xxpx- -0.0481 0.2428 -CB -1 P r xrPxx -0.2678 1.7345 -CB -1 P p xpPxx 0.0355 0.2300 -CB -1 r P xPrxx -0.1137 0.7367 -CB -1 a p xpaxx 0.0249 0.1613 -CB -1 + - x-+xx -0.0762 0.4935 -CB -1 - P xP-xx -0.0889 0.5757 -CB -1 - r xr-xx -0.0533 0.3451 -CB -1 - - x--xx 0.0496 0.3215 -CB -1 - p xp-xx -0.0148 0.0960 -CB -1 p P xPpxx 0.0119 0.0768 -CB -1 p r xrpxx -0.0673 0.4358 -CB 1 P G xxPGx -0.0522 0.3379 -CB 1 P P xxPPx -0.8458 5.4779 -CB 1 P r xxPrx -0.1573 1.0187 -CB 1 r r xxrrx 0.1634 1.0581 -CB 1 a G xxaGx -0.0393 0.2544 -CB 1 a r xxarx 0.0274 0.1777 -CB 1 a - xxa-x 0.0394 0.2553 -CB 1 a p xxapx 0.0149 0.0968 -CB 1 + G xx+Gx -0.0784 0.5076 -CB 1 + P xx+Px -0.1170 0.7580 -CB 1 - P xx-Px -0.0913 0.5912 -CB 1 - - xx--x 0.0284 0.1838 -CB 1 p P xxpPx 0.0880 0.5697 -CB 1 p p xxppx -0.0113 0.0733 -CB -2 P - -xPxx 0.0389 0.2521 -CB -2 P p pxPxx 0.0365 0.2362 -CB -2 r + +xrxx 0.0809 0.5242 -CB -2 a - -xaxx -0.0452 0.2927 -CB -2 + - -x+xx -0.0651 0.4218 -CB -2 - G Gx-xx -0.0883 0.5717 -CB -2 p G Gxpxx 0.0378 0.2445 -CB -2 p p pxpxx 0.0207 0.1341 -CB 2 r G xxrxG -0.0362 0.2344 -CB 2 r - xxrx- -0.0219 0.1419 -CB 2 a - xxax- -0.0298 0.1929 -CB 2 + p xx+xp 0.0189 0.1223 -CB 2 - - xx-x- -0.0525 0.3400 - N -1 G P xPGxx 0.2411 0.5105 - N -1 G + x+Gxx -0.1773 0.3754 - N -1 G - x-Gxx 0.1905 0.4035 - N -1 P P xPPxx -0.9177 1.9434 - N -1 P p xpPxx 0.2609 0.5525 - N -1 r G xGrxx 0.2417 0.5119 - N -1 r a xarxx -0.0139 0.0295 - N -1 r + x+rxx -0.4122 0.8729 - N -1 r p xprxx 0.1440 0.3049 - N -1 a G xGaxx -0.5177 1.0963 - N -1 a r xraxx 0.0890 0.1885 - N -1 a a xaaxx 0.1393 0.2950 - N -1 a p xpaxx -0.0825 0.1747 - N -1 + G xG+xx -0.4908 1.0394 - N -1 + a xa+xx 0.1709 0.3619 - N -1 + + x++xx 0.1868 0.3955 - N -1 + - x-+xx -0.0951 0.2014 - N -1 - P xP-xx -0.3027 0.6410 - N -1 - r xr-xx -0.1670 0.3537 - N -1 - + x+-xx -0.3501 0.7414 - N -1 - - x--xx 0.1266 0.2681 - N -1 p G xGpxx -0.1707 0.3614 - N -1 p - x-pxx 0.0011 0.0023 - N 1 G G xxGGx 0.2555 0.5412 - N 1 G P xxGPx -0.9725 2.0595 - N 1 G r xxGrx 0.0165 0.0349 - N 1 G p xxGpx 0.0703 0.1489 - N 1 r a xxrax -0.0237 0.0503 - N 1 a r xxarx -0.1816 0.3845 - N 1 a - xxa-x -0.1050 0.2224 - N 1 a p xxapx -0.1196 0.2533 - N 1 - r xx-rx -0.1762 0.3731 - N 1 - a xx-ax 0.0006 0.0013 - N 1 p P xxpPx 0.2797 0.5923 - N 1 p a xxpax 0.0938 0.1986 - N 1 p + xxp+x 0.1359 0.2878 - N -2 G r rxGxx -0.5140 1.0885 - N -2 G - -xGxx -0.0639 0.1354 - N -2 P P PxPxx -0.4215 0.8927 - N -2 r P Pxrxx -0.3696 0.7828 - N -2 r p pxrxx -0.1937 0.4101 - N -2 a - -xaxx -0.0351 0.0743 - N -2 a p pxaxx -0.1031 0.2183 - N -2 - G Gx-xx -0.2152 0.4558 - N -2 - P Px-xx -0.1375 0.2912 - N -2 - p px-xx -0.1081 0.2290 - N -2 p P Pxpxx -0.1489 0.3154 - N -2 p - -xpxx 0.0952 0.2015 - N 2 G - xxGx- 0.1160 0.2457 - N 2 r p xxrxp -0.1288 0.2728 - N 2 a P xxaxP 0.1632 0.3456 - N 2 + + xx+x+ -0.0106 0.0226 - N 2 + - xx+x- 0.0389 0.0824 - N 2 - a xx-xa -0.0815 0.1726 - N 2 p G xxpxG -0.0779 0.1649 - N 2 p p xxpxp -0.0683 0.1447 - H -1 G P xPGxx -0.0317 0.4730 - H -1 G r xrGxx 0.0549 0.8186 - H -1 G + x+Gxx -0.0192 0.2867 - H -1 G - x-Gxx 0.0138 0.2055 - H -1 r P xPrxx -0.0964 1.4367 - H -1 r - x-rxx -0.0245 0.3648 - H -1 a G xGaxx -0.0290 0.4320 - H -1 a a xaaxx 0.0063 0.0944 - H -1 + G xG+xx -0.0615 0.9168 - H -1 + r xr+xx -0.0480 0.7153 - H -1 + - x-+xx -0.0203 0.3030 - H -1 - + x+-xx -0.0232 0.3455 - H -1 p G xGpxx -0.0028 0.0411 - H -1 p P xPpxx -0.0121 0.1805 - H 1 G P xxGPx -0.1418 2.1144 - H 1 G r xxGrx 0.0236 0.3520 - H 1 G a xxGax 0.0173 0.2580 - H 1 a - xxa-x 0.0091 0.1349 - H 1 + P xx+Px -0.0422 0.6290 - H 1 + p xx+px 0.0191 0.2842 - H 1 - P xx-Px -0.0474 0.7065 - H 1 - a xx-ax 0.0102 0.1515 - H -2 G G GxGxx 0.0169 0.2517 - H -2 G r rxGxx -0.3503 5.2220 - H -2 a P Pxaxx 0.0216 0.3227 - H -2 a - -xaxx -0.0276 0.4118 - H -2 + - -x+xx -0.0260 0.3874 - H -2 - G Gx-xx 0.0273 0.4073 - H -2 - a ax-xx -0.0161 0.2400 - H -2 - - -x-xx -0.0285 0.4255 - H -2 p P Pxpxx -0.0101 0.1503 - H -2 p a axpxx -0.0157 0.2343 - H -2 p + +xpxx -0.0122 0.1815 - H -2 p p pxpxx 0.0107 0.1601 - H 2 G G xxGxG -0.0190 0.2826 - H 2 r G xxrxG 0.0472 0.7036 - H 2 r P xxrxP 0.0337 0.5027 - H 2 a + xxax+ -0.0159 0.2376 - H 2 + G xx+xG 0.0113 0.1685 - H 2 + r xx+xr -0.0307 0.4575 - H 2 - P xx-xP -0.0088 0.1318 -HA -1 P P xPPxx 0.0307 1.1685 -HA -1 P r xrPxx 0.0621 2.3592 -HA -1 r G xGrxx -0.0371 1.4092 -HA -1 r + x+rxx 0.0125 0.4733 -HA -1 r p xprxx -0.0199 0.7569 -HA -1 a G xGaxx 0.0073 0.2779 -HA -1 a a xaaxx 0.0044 0.1683 -HA -1 - G xG-xx 0.0116 0.4409 -HA -1 - r xr-xx 0.0228 0.8679 -HA -1 - p xp-xx 0.0074 0.2828 -HA 1 G G xxGGx 0.0175 0.6636 -HA 1 G - xxG-x 0.0107 0.4081 -HA 1 P a xxPax 0.0089 0.3369 -HA 1 - r xx-rx 0.0113 0.4291 -HA -2 G G GxGxx -0.0154 0.5847 -HA -2 P - -xPxx 0.0136 0.5179 -HA -2 r G Gxrxx -0.0159 0.6045 -HA -2 + + +x+xx -0.0137 0.5190 -HA -2 p - -xpxx -0.0068 0.2592 -HA -2 p p pxpxx 0.0046 0.1763 -HB -1 P r xrPxx 0.0460 2.1365 -HB -1 a - x-axx 0.0076 0.3551 -HB -1 + - x-+xx 0.0110 0.5122 -HB -1 - r xr-xx 0.0233 1.0819 -HB 1 a P xxaPx 0.0287 1.3310 -HB 1 + P xx+Px 0.0324 1.5056 -HB 1 + r xx+rx -0.0231 1.0709 -HB 1 p r xxprx 0.0077 0.3586 -HB 1 p + xxp+x -0.0074 0.3426 -HB -2 a P Pxaxx -0.0026 0.1192 -HB -2 a r rxaxx -0.0098 0.4559 -HB -2 - - -x-xx 0.0016 0.0751 -HB 2 P r xxPxr -0.0595 2.7608 -HB 2 P + xxPx+ -0.0145 0.6744 -HB 2 P - xxPx- 0.0107 0.4976 -HB 2 a + xxax+ -0.0015 0.0691 -HB 2 p r xxpxr 0.0262 1.2178''' - -tablephshifts=''' -D (pKa 3.86) -D H 8.55 8.38 -0.17 0.02 -0.03 -D HA 4.78 4.61 -0.17 0.01 -0.01 -D HB 2.93 2.70 -0.23 -D CA 52.9 54.3 1.4 0.0 0.1 -D CB 38.0 41.1 3.0 -D CG 177.1 180.3 3.2 -D C 175.8 176.9 1.1 -0.2 0.4 -D N 118.7 120.2 1.5 0.3 0.1 -D Np na na 0.1 -E (pKa 4.34) -E H 8.45 8.57 0.12 0.00 0.02 -E HA 4.39 4.29 -0.10 0.01 0.00 -E HB 2.08 2.02 -0.06 -E HG 2.49 2.27 -0.22 -E CA 56.0 56.9 1.0 0.0 0.0 -E CB 28.5 30.0 1.5 -E CG 32.7 36.1 3.5 -E CD 179.7 183.8 4.1 -E C 176.5 177.0 0.6 0.1 0.1 -E N 119.9 120.9 1.0 0.2 0.1 -E Np na na 0.1 -H (pKa 6.45) -H H 8.55 8.35 -0.2 -0.01 0.0 -H HA 4.75 4.59 -0.2 -0.01 -0.06 -H HB 3.25 3.08 -0.17 -H HD2 7.30 6.97 -0.33 -H HE1 8.60 7.68 -0.92 -H CA 55.1 56.7 1.6 -0.1 0.1 -H CB 28.9 31.3 2.4 -H CG 131.0 135.3 4.2 -H CD2 120.3 120.0 -0.3 -H CE1 136.6 139.2 2.6 -H C 174.8 176.2 1.5 0.0 0.6 -H N 117.9 119.7 1.8 0.3 0.5 -H Np na na 0.5 -H ND1 175.8 231.3 56 -H NE2 173.1 181.1 8 -C (pKa 8.49) -C H 8.49 8.49 0.0 -C HA 4.56 4.28 -0.28 -0.01 -0.01 -C HB 2.97 2.88 -0.09 -C CA 58.5 60.6 2.1 0.0 0.1 -C CB 28.0 29.7 1.7 -C C 175.0 176.9 1.9 -0.4 0.5 -C N 118.7 122.2 3.6 0.4 0.6 -C Np na na 0.6 -Y (pKa 9.76) -Y H 8.16 8.16 0.0 -Y HA 4.55 4.49 -0.06 -Y HB 3.02 2.94 -0.08 -Y HD 7.14 6.97 -0.17 -Y HE 6.85 6.57 -0.28 -Y CA 58.0 58.2 0.3 -Y CB 38.6 38.7 0.1 -Y CG 130.5 123.8 -6.7 -Y CD 133.3 133.2 -0.1 -Y CE 118.4 121.7 3.3 -Y CZ 157.0 167.4 10.4 -Y C 176.3 176.7 0.4 -Y N 120.1 120.7 0.6 -K (pKa 10.34) -K H 8.4 8.4 0.0 -K HA 4.34 4.30 -0.04 -K HB 1.82 1.78 -0.04 -K HG 1.44 1.36 -0.08 -K HD 1.68 1.44 -0.24 -K HE 3.00 2.60 -0.40 -K CA 56.4 56.9 0.4 -K CB 32.8 33.2 0.3 -K CG 24.7 25.0 0.4 -K CD 28.9 33.9 5.0 -K CE 42.1 43.1 1.0 -K C 177.0 177.5 0.5 -K N 121.0 121.7 0.7 -K Np na na 0.1 -R (pKa 13.9) -R H 7.81 7.81 0.0 -R HA 3.26 3.19 -0.07 -R HB 1.60 1.55 0.05 -R HG 1.60 1.55 0.05 -R HD 3.19 3.00 -0.19 -R CA 58.4 58.6 0.2 -R CB 34.4 35.2 0.9 -R CG 27.2 28.1 1.0 -R CD 43.8 44.3 0.5 -R CZ 159.6 163.5 4.0 -R C 185.8 186.1 0.2 -R N 122.4 122.8 0.4 -R NE 85.6 91.5 5.9 -R NG 71.2 93.2 22''' - -def initcorrcomb(): - datc=tablecombdevs.split('\n') - buf=[lin.split() for lin in datc] - dct={} - for lin in buf: - atn=lin[0] - if not atn in dct:dct[atn]={} - neipos=int(lin[1]) - centgroup=lin[2] - neigroup= lin[3] - key=(neipos,centgroup,neigroup)#(k,l,m) - segment=lin[4] - dct[atn][segment]=key,eval(lin[-2]) - return dct - -TEMPCORRS=gettempkoeff() -CENTSHIFTS=initcorcents() -NEICORRS =initcorneis() -COMBCORRS=initcorrcomb() - -# data = pkgutil.get_data(__name__, "data_tables/phshifts2.csv") -# PHSHIFTS = pd.read_csv(StringIO(data.decode()), header=0, comment='#', index_col=['resn', 'atn']) - -def predPentShift(pent,atn): - aac=pent[2] - sh=CENTSHIFTS[aac][atn] - allneipos=[2,1,-1,-2] + +def pred_pent_shift(pent, atn): + aac = pent[2] + sh = CENTSHIFTS[aac][atn] + allneipos = [2, 1, -1, -2] for i in range(4): - aai=pent[2+allneipos[i]] + aai = pent[2 + allneipos[i]] if aai in NEICORRS: - corr=NEICORRS[aai][atn][i] - sh+=corr - groups=['G','P','FYW','LIVMCA','KR','DE']##,'NQSTHncX'] - labels='GPra+-p' #(Gly,Pro,Arom,Aliph,pos,neg,polar) - grstr='' + corr = NEICORRS[aai][atn][i] + sh += corr + groups = ["G", "P", "FYW", "LIVMCA", "KR", "DE"] # Group classifications for residues + labels = "GPra+-p" # (Gly,Pro,Arom,Aliph,pos,neg,polar) + grstr = "" for i in range(5): - aai=pent[i] - found=False - for j,gr in enumerate(groups): + aai = pent[i] + found = False + for j, gr in enumerate(groups): if aai in gr: - grstr+=labels[j] - found=True + grstr += labels[j] + found = True break - if not found:grstr+='p'#polar - centgr=grstr[2] + if not found: + grstr += "p" # polar + centgr = grstr[2] for segm in COMBCORRS[atn]: - key,combval=COMBCORRS[atn][segm] - neipos,centgroup,neigroup=key#(k,l,m) - if centgroup==centgr and grstr[2+neipos]==neigroup: - if (centgr,neigroup)!=('p','p') or pent[2] in 'ST': - #pp comb only used when center is Ser or Thr! - sh+=combval + key, combval = COMBCORRS[atn][segm] + neipos, centgroup, neigroup = key # (k,l,m) + if ( + centgroup == centgr + and grstr[2 + neipos] == neigroup + and ((centgr, neigroup) != ("p", "p") or pent[2] in "ST") + ): + # pp comb only used when center is Ser or Thr! + sh += combval return sh - -def gettempcorr(aai,atn,tempdct,temp): - return tempdct[atn][aai]/1000*(temp-298) - -def get_phshifts(): - datc=tablephshifts.split('\n') - buf=[lin.split() for lin in datc] - dct={} - na=None - for lin in buf: - if len(lin)>3: - resn=lin[0] - atn=lin[1] - sh0=eval(lin[2]) - sh1=eval(lin[3]) - shd=eval(lin[4]) - if not resn in dct:dct[resn]={} - dct[resn][atn]=shd - if len(lin)>6:#neighbor data - for n in range(2): - shdn=eval(lin[5+n]) - nresn=resn+'ps'[n] - if not nresn in dct:dct[nresn]={} - dct[nresn][atn]=shdn - return dct + + +def gettempcorr(aai, atn, tempdct, temp): + return tempdct[atn][aai] / 1000 * (temp - 298) + def initfilcsv(filename): - file=open(filename,'r') - buffer=file.readlines() - file.close() + with open(filename) as file: + buffer = file.readlines() for i in range(len(buffer)): - buffer[i]=buffer[i][:-1].split(',') + buffer[i] = buffer[i][:-1].split(",") return buffer -def write_csv_pkaoutput(pkadct,seq,temperature,ion): - seq=seq[:min(150,len(seq))] - name='outpepKalc_%s_T%6.2f_I%4.2f.csv'%(seq,temperature,ion) - out=open(name,'w') - out.write('Site,pKa value,pKa shift,Hill coefficient\n') + +def write_csv_pkaoutput(pkadct, seq, temperature, ion): + seq = seq[: min(150, len(seq))] + name = f"outpepKalc_{seq}_T{temperature:6.2f}_I{ion:4.2f}.csv" + with open(name, "w") as out: + out.write("Site,pKa value,pKa shift,Hill coefficient\n") for i in pkadct: - pKa,nH,resi=pkadct[i] - reskey=resi+str(i+1) - diff=pKa-pK0[resi] - out.write('%s,%5.3f,%5.3f,%5.3f\n'%(reskey,pKa,diff,nH)) - out.close() - -def read_csv_pkaoutput(seq,temperature,ion,name=None): - seq=seq[:min(150,len(seq))] - logging.getLogger('trizod.potenci').debug(f'reading csv {name}') - if name==None:name='outpepKalc_%s_T%6.2f_I%4.2f.csv'%(seq,temperature,ion) - try:out=open(name,'r') - except IOError:return None - buf=initfilcsv(name) - for lnum,data in enumerate(buf): - if len(data)>0 and data[0]=='Site':break - pkadct={} - for data in buf[lnum+1:]: - reskey,pKa,diff,nH=data - i=int(reskey[1:])-1 - resi=reskey[0] - pKaval=eval(pKa) - nHval=eval(nH) - pkadct[i]=pKaval,nHval,resi + pKa, nH, resi = pkadct[i] + reskey = resi + str(i + 1) + diff = pKa - PK0[resi] + out.write(f"{reskey},{pKa:5.3f},{diff:5.3f},{nH:5.3f}\n") + + +def read_csv_pkaoutput(seq, temperature, ion, name=None): + seq = seq[: min(150, len(seq))] + logging.getLogger("trizod.potenci").debug(f"reading csv {name}") + if name is None: + name = f"outpepKalc_{seq}_T{temperature:6.2f}_I{ion:4.2f}.csv" + try: + with open(name): + pass + except OSError: + return None + buf = initfilcsv(name) + for _lnum, data in enumerate(buf): + if len(data) > 0 and data[0] == "Site": + break + pkadct = {} + for data in buf[_lnum + 1 :]: + reskey, pKa, diff, nH = data + i = int(reskey[1:]) - 1 + resi = reskey[0] + pKaval = float(pKa) + nHval = float(nH) + pkadct[i] = pKaval, nHval, resi return pkadct -def getphcorrs(seq,temperature,pH,ion,pkacsvfilename=None): - bbatns=['C','CA','CB','HA','H','N','HB'] - dct=get_phshifts() - Ion=max(0.0001,ion) - if pkacsvfilename == False: - pkadct=None + +def getphcorrs(seq, temperature, pH, ion, pkacsvfilename=None): + bbatns = ["C", "CA", "CB", "HA", "H", "N", "HB"] + dct = PHSHIFTS + Ion = max(0.0001, ion) + if not pkacsvfilename: + pkadct = None else: - pkadct=read_csv_pkaoutput(seq,temperature,ion,pkacsvfilename) - if pkadct==None: - pkadct=calc_pkas_from_seq('n'+seq+'c',temperature,Ion) - if pkacsvfilename != False: - write_csv_pkaoutput(pkadct,seq,temperature,ion) - outdct={} + pkadct = read_csv_pkaoutput(seq, temperature, ion, pkacsvfilename) + if pkadct is None: + pkadct = calc_pkas_from_seq("n" + seq + "c", temperature, Ion) + if pkacsvfilename: + write_csv_pkaoutput(pkadct, seq, temperature, ion) + outdct = {} for i in pkadct: - logging.getLogger('trizod.potenci').debug('pkares: %6.3f %6.3f %1s'%pkadct[i] + str(i)) - pKa,nH,resi=pkadct[i] - frac =fun(pH,pKa,nH) - frac7=fun(7.0,pK0[resi],nH) - if resi in 'nc':jump=0.0#so far + pKa, nH, resi = pkadct[i] + logging.getLogger("trizod.potenci").debug(f"pkares: {pKa:6.3f} {nH:6.3f} {resi:1s}{i}") + frac = fun(pH, pKa, nH) + frac7 = fun(7.0, PK0[resi], nH) + if resi in "nc": + jump = 0.0 # so far else: for atn in bbatns: - if not atn in outdct:outdct[atn]={} - logging.getLogger('trizod.potenci').debug(f'data: {atn}, {pKa}, {nH}, {resi}, {i}, {atn}, {pH}') - dctresi=dct[resi] + if atn not in outdct: + outdct[atn] = {} + logging.getLogger("trizod.potenci").debug( + f"data: {atn}, {pKa}, {nH}, {resi}, {i}, {atn}, {pH}" + ) + dctresi = dct[resi] try: - delta=dctresi[atn] - # delta = PHSHIFTS.loc[(resi,atn), 'shd'] - jump =frac *delta - jump7=frac7*delta - key=(resi,atn) + delta = dctresi[atn] + jump = frac * delta + jump7 = frac7 * delta except KeyError: - ##if not (resi in 'RKCY' and atn=='H') and not (resi == 'R' and atn=='N'): - logging.getLogger('trizod.potenci').waring(f'no key: {resi}, {i}, {atn}') - delta=999;jump=999;jump7=999 - if delta<99: - jumpdelta=jump-jump7 - if not i in outdct[atn]:outdct[atn][i]=[resi,jumpdelta] + logging.getLogger("trizod.potenci").warning(f"no key: {resi}, {i}, {atn}") + delta = 999 + jump = 999 + jump7 = 999 + if delta < 99: + jumpdelta = jump - jump7 + if i not in outdct[atn]: + outdct[atn][i] = [resi, jumpdelta] else: - outdct[atn][i][0]=resi - outdct[atn][i][1]+=jumpdelta - logging.getLogger('trizod.potenci').debug('%3s %5.2f %6.4f %s %3d %5s %8.5f %8.5f %4.2f'%(atn,pKa,nH,resi,i,atn,jump,jump7,pH)) - if resi+'p' in dct and atn in dct[resi+'p']: - # if (resi+'p', atn) in PHSHIFTS.index: + outdct[atn][i][0] = resi + outdct[atn][i][1] += jumpdelta + logging.getLogger("trizod.potenci").debug( + f"{atn:3s} {pKa:5.2f} {nH:6.4f} {resi} {i:3d} {atn:5s} {jump:8.5f} {jump7:8.5f} {pH:4.2f}" + ) + if resi + "p" in dct and atn in dct[resi + "p"]: for n in range(2): - ni=i+2*n-1 - ##if ni is somewhere in seq... - nresi=resi+'ps'[n] - ndelta=dct[nresi][atn] + ni = i + 2 * n - 1 + # Apply neighbor pH corrections + nresi = resi + "ps"[n] + ndelta = dct[nresi][atn] # ndelta = PHSHIFTS.loc[(nresi,atn), 'shd'] - jump =frac *ndelta - jump7=frac7*ndelta - jumpdelta=jump-jump7 - if not ni in outdct[atn]:outdct[atn][ni]=[None,jumpdelta] - else:outdct[atn][ni][1]+=jumpdelta + jump = frac * ndelta + jump7 = frac7 * ndelta + jumpdelta = jump - jump7 + if ni not in outdct[atn]: + outdct[atn][ni] = [None, jumpdelta] + else: + outdct[atn][ni][1] += jumpdelta return outdct -def getphcorrs_arr(seq,temperature,pH,ion): - bbatns=['C','CA','CB','HA','H','N','HB'] - dct=get_phshifts() - - Ion=max(0.0001,ion) - pkadct=calc_pkas_from_seq('n'+seq+'c',temperature,Ion) - #outdct={} - residues = [[None]*7 for i in range(len(seq))] - outarr = np.zeros(shape=(len(seq), len(bbatns)), dtype=np.float) +def getphcorrs_arr(seq, temperature, pH, ion): + bbatns = ["C", "CA", "CB", "HA", "H", "N", "HB"] + dct = PHSHIFTS + + Ion = max(0.0001, ion) + + pkadct = calc_pkas_from_seq("n" + seq + "c", temperature, Ion) + # outdct={} + residues = [[None] * 7 for i in range(len(seq))] + outarr = np.zeros(shape=(len(seq), len(bbatns)), dtype=np.float64) for i in pkadct: - logging.getLogger('trizod.potenci').debug('pkares: %6.3f %6.3f %1s'%pkadct[i] + str(i)) - pKa,nH,resi=pkadct[i] - frac = fun(pH,pKa,nH) - frac7 = fun(7.0,pK0[resi],nH) - if resi in 'nc': - jump = 0.0#so far + pKa, nH, resi = pkadct[i] + logging.getLogger("trizod.potenci").debug(f"pkares: {pKa:6.3f} {nH:6.3f} {resi:1s}{i}") + frac = fun(pH, pKa, nH) + frac7 = fun(7.0, PK0[resi], nH) + if resi in "nc": + jump = 0.0 # so far else: - for col,atn in enumerate(bbatns): - #if not atn in outdct:outdct[atn]={} - logging.getLogger('trizod.potenci').debug(f'data: {atn}, {pKa}, {nH}, {resi}, {i}, {atn}, {pH}') + for col, atn in enumerate(bbatns): + # if not atn in outdct:outdct[atn]={} + logging.getLogger("trizod.potenci").debug( + f"data: {atn}, {pKa}, {nH}, {resi}, {i}, {atn}, {pH}" + ) dctresi = dct[resi] try: delta = dctresi[atn] - jump = frac *delta - jump7 = frac7*delta - #key=(resi,atn) + jump = frac * delta + jump7 = frac7 * delta except KeyError: - ##if not (resi in 'RKCY' and atn=='H') and not (resi == 'R' and atn=='N'): - logging.getLogger('trizod.potenci').waring(f'no key: {resi}, {i}, {atn}') - delta=999;jump=999;jump7=999 - if delta<99: + logging.getLogger("trizod.potenci").warning(f"no key: {resi}, {i}, {atn}") + delta = 999 + jump = 999 + jump7 = 999 + if delta < 99: jumpdelta = jump - jump7 - #if not i in outdct[atn]:outdct[atn][i]=[resi,jumpdelta] - #else: + # if not i in outdct[atn]:outdct[atn][i]=[resi,jumpdelta] + # else: # outdct[atn][i][0]=resi # outdct[atn][i][1]+=jumpdelta residues[i][col] = resi outarr[i][col] += jumpdelta - logging.getLogger('trizod.potenci').debug('%3s %5.2f %6.4f %s %3d %5s %8.5f %8.5f %4.2f'%(atn,pKa,nH,resi,i,atn,jump,jump7,pH)) - if resi+'p' in dct and atn in dct[resi+'p']: + logging.getLogger("trizod.potenci").debug( + f"{atn:3s} {pKa:5.2f} {nH:6.4f} {resi} {i:3d} {atn:5s} {jump:8.5f} {jump7:8.5f} {pH:4.2f}" + ) + if resi + "p" in dct and atn in dct[resi + "p"]: for n in range(2): - ni=i+2*n-1 - ##if ni is somewhere in seq... - nresi=resi+'ps'[n] - ndelta=dct[nresi][atn] - jump = frac * ndelta - jump7= frac7 * ndelta + ni = i + 2 * n - 1 + # Apply neighbor pH corrections + nresi = resi + "ps"[n] + ndelta = dct[nresi][atn] + jump = frac * ndelta + jump7 = frac7 * ndelta jumpdelta = jump - jump7 - #if not ni in outdct[atn]:outdct[atn][ni]=[None,jumpdelta] - #else:outdct[atn][ni][1]+=jumpdelta residues[i][col] = None outarr[ni][col] += jumpdelta return outarr -def getpredshifts(seq,temperature,pH,ion,usephcor=True,pkacsvfile=None,identifier=''): - tempdct=gettempkoeff() - bbatns = ['C','CA','CB','HA','H','N','HB'] - if usephcor: - phcorrs=getphcorrs(seq,temperature,pH,ion,pkacsvfile) - else: - phcorrs={} - shiftdct={} - for i in range(1,len(seq)-1): - if seq[i] in AAstandard:#else: do nothing - res=str(i+1) - trip=seq[i-1]+seq[i]+seq[i+1] - phcorr=None - shiftdct[(i+1,seq[i])]={} + +def getpredshifts(seq, temperature, pH, ion, usephcor=True, pkacsvfile=None, identifier=""): + tempdct = TEMPCORRS + bbatns = ["C", "CA", "CB", "HA", "H", "N", "HB"] + phcorrs = getphcorrs(seq, temperature, pH, ion, pkacsvfile) if usephcor else {} + shiftdct = {} + for i in range(1, len(seq) - 1): + if seq[i] in AA_STANDARD: # else: do nothing + trip = seq[i - 1] + seq[i] + seq[i + 1] + phcorr = None + shiftdct[(i + 1, seq[i])] = {} for at in bbatns: - if not (trip[1],at) in [('G','CB'),('G','HB'),('P','H')]: + if (trip[1], at) not in [("G", "CB"), ("G", "HB"), ("P", "H")]: if i == 1: - pent = 'n' + trip + seq[i+2] - elif i==len(seq)-2: - pent = seq[i-2] + trip + 'c' + pent = "n" + trip + seq[i + 2] + elif i == len(seq) - 2: + pent = seq[i - 2] + trip + "c" else: - pent = seq[i-2] + trip + seq[i+2] - shp=predPentShift(pent,at) - if shp!=None: - if at!='HB':shp+=gettempcorr(trip[1],at,tempdct,temperature) + pent = seq[i - 2] + trip + seq[i + 2] + shp = pred_pent_shift(pent, at) + if shp is not None: + if at != "HB": + shp += gettempcorr(trip[1], at, tempdct, temperature) if at in phcorrs and i in phcorrs[at]: - phdata=phcorrs[at][i] - resi=phdata[0] - ##assert resi==seq[i] - if seq[i] in 'CDEHRKY' and resi != seq[i]: - logging.getLogger('trizod.potenci').warning(f'residue mismatch: {resi},{seq[i]},{i},{phdata},{at}') - phcorr=phdata[1] - if abs(phcorr)<9.9: - shp-=phcorr - shiftdct[(i+1,seq[i])][at]=shp - logging.getLogger('trizod.potenci').debug('predictedshift: %5s %3d %1s %2s %8.4f'%(identifier,i,seq[i],at,shp) + ' ' + str(phcorr)) + phdata = phcorrs[at][i] + resi = phdata[0] + # Verify residue identity matches + if seq[i] in "CDEHRKY" and resi != seq[i]: + logging.getLogger("trizod.potenci").warning( + f"residue mismatch: {resi},{seq[i]},{i},{phdata},{at}" + ) + phcorr = phdata[1] + if abs(phcorr) < 9.9: + shp -= phcorr + shiftdct[(i + 1, seq[i])][at] = shp + logging.getLogger("trizod.potenci").debug( + f"predictedshift: {identifier:5s} {i:3d} {seq[i]:1s} {at:2s} {shp:8.4f} {phcorr}" + ) return shiftdct -def getpredshifts_arr(seq,temperature,pH,ion,usephcor=True,pkacsvfile=None,identifier=''): - tempdct=gettempkoeff() - bbatns = ['C','CA','CB','HA','H','N','HB'] - if usephcor: - phcorrs=getphcorrs_arr(seq,temperature,pH,ion,pkacsvfile) - else: - phcorrs={} - shiftdct={} - for i in range(1,len(seq)-1): - if seq[i] in AAstandard:#else: do nothing - res=str(i+1) - trip=seq[i-1]+seq[i]+seq[i+1] - phcorr=None - shiftdct[(i+1,seq[i])]={} + +def getpredshifts_arr(seq, temperature, pH, ion, usephcor=True, pkacsvfile=None, identifier=""): + tempdct = TEMPCORRS + bbatns = ["C", "CA", "CB", "HA", "H", "N", "HB"] + phcorrs = getphcorrs_arr(seq, temperature, pH, ion) if usephcor else {} + shiftdct = {} + for i in range(1, len(seq) - 1): + if seq[i] in AA_STANDARD: # else: do nothing + trip = seq[i - 1] + seq[i] + seq[i + 1] + phcorr = None + shiftdct[(i + 1, seq[i])] = {} for at in bbatns: - if not (trip[1],at) in [('G','CB'),('G','HB'),('P','H')]: + if (trip[1], at) not in [("G", "CB"), ("G", "HB"), ("P", "H")]: if i == 1: - pent = 'n' + trip + seq[i+2] - elif i==len(seq)-2: - pent = seq[i-2] + trip + 'c' + pent = "n" + trip + seq[i + 2] + elif i == len(seq) - 2: + pent = seq[i - 2] + trip + "c" else: - pent = seq[i-2] + trip + seq[i+2] - shp=predPentShift(pent,at) - if shp!=None: - if at!='HB':shp+=gettempcorr(trip[1],at,tempdct,temperature) + pent = seq[i - 2] + trip + seq[i + 2] + shp = pred_pent_shift(pent, at) + if shp is not None: + if at != "HB": + shp += gettempcorr(trip[1], at, tempdct, temperature) if at in phcorrs and i in phcorrs[at]: - phdata=phcorrs[at][i] - resi=phdata[0] - ##assert resi==seq[i] - if seq[i] in 'CDEHRKY' and resi!=seq[i]: - logging.getLogger('trizod.potenci').warning(f'residue mismatch: {resi},{seq[i]},{i},{phdata},{at}') - phcorr=phdata[1] - if abs(phcorr)<9.9: - shp-=phcorr - shiftdct[(i+1,seq[i])][at]=shp - logging.getLogger('trizod.potenci').debug('predictedshift: %5s %3d %1s %2s %8.4f'%(identifier,i,seq[i],at,shp) + ' ' + str(phcorr)) + phdata = phcorrs[at][i] + resi = phdata[0] + # Verify residue identity matches + if seq[i] in "CDEHRKY" and resi != seq[i]: + logging.getLogger("trizod.potenci").warning( + f"residue mismatch: {resi},{seq[i]},{i},{phdata},{at}" + ) + phcorr = phdata[1] + if abs(phcorr) < 9.9: + shp -= phcorr + shiftdct[(i + 1, seq[i])][at] = shp + logging.getLogger("trizod.potenci").debug( + f"predictedshift: {identifier:5s} {i:3d} {seq[i]:1s} {at:2s} {shp:8.4f} {phcorr}" + ) return shiftdct -def writeOutput(name,dct): - out=open(name,'w') - bbatns =['N','C','CA','CB','H','HA','HB'] - out.write('#NUM AA N ') - out.write(' %7s %7s %7s %7s %7s %7s\n'%tuple(bbatns[1:])) - reskeys=list(dct.keys()) - reskeys.sort() - for resnum,resn in reskeys: - shdct=dct[(resnum,resn)] - if len(shdct)>0: - out.write('%-4d %1s '%(resnum,resn)) - for at in bbatns: - shp=0.0 - if at in shdct:shp=shdct[at] - out.write(' %7.3f'%shp) - out.write('\n') - out.close() + +def write_output(name, dct): + with open(name, "w") as out: + bbatns = ["N", "C", "CA", "CB", "H", "HA", "HB"] + out.write("#NUM AA N ") + out.write( + f" {bbatns[1]:>7s} {bbatns[2]:>7s} {bbatns[3]:>7s} {bbatns[4]:>7s} {bbatns[5]:>7s} {bbatns[6]:>7s}\n" + ) + reskeys = list(dct.keys()) + reskeys.sort() + for resnum, resn in reskeys: + shdct = dct[(resnum, resn)] + if len(shdct) > 0: + out.write(f"{resnum:<4d} {resn:1s} ") + for at in bbatns: + shp = 0.0 + if at in shdct: + shp = shdct[at] + out.write(f" {shp:7.3f}") + out.write("\n") + def main(): - ##README##...... - #requires: python2.x with numpy and scipy - #usage: potenci1_2.py seqstring pH temperature ionicstrength [pkacsvfile] > logfile - #optional filename in csv format contained predicted pKa values and Hill parameters, - #the format of the pkacsvfile must be the same as the output for pepKalc, - #only lines after "Site" is read. If this is not found no pH corrections are applied. - #Output: Table textfile in SHIFTY format (space separated) - #average of methylene protons are provided for Gly HA2/HA3 and HB2/HB3. - #NOTE:pH corrections is applied if pH is not 7.0 - #NOTE:pKa predictions are stored locally and reloaded if the seq, temp and ion is the same. - #NOTE:at least 5 residues are required. Chemical shift predictions are not given for terminal residues. - args=sys.argv[1:]#first is scriptname - if len(args)<4: - logging.getLogger('trizod.potenci').error('FAILED: please provide 4 arguments (exiting)') - logging.getLogger('trizod.potenci').info('usage: potenci1_2.py seqstring pH temperature ionicstrength [pkacsvfile] > logfile') + """Command-line interface for POTENCI chemical shift prediction. + + Usage: + python -m trizod.potenci.potenci [pkacsvfile] + + Arguments: + sequence: Protein sequence (one-letter amino acid codes) + pH: pH value (e.g., 7.0) + temperature: Temperature in Kelvin (e.g., 298.0) + ionic_strength: Ionic strength in M (e.g., 0.1) + pkacsvfile: Optional CSV file with pre-computed pKa values + + Requirements: + - Python 3.10+ + - numpy, scipy + + Output: + - Text file in SHIFTY format (space-separated columns) + - Averaged methylene proton shifts for Gly HA2/HA3 and HB2/HB3 + - CSV file with pKa predictions (if not provided) + + Notes: + - pH corrections applied if pH != 7.0 + - pKa predictions cached and reused for same (sequence, temp, ion) combination + - Minimum 5 residues required + - Chemical shifts not predicted for terminal residues + """ + args = sys.argv[1:] + if len(args) < 4: + logging.getLogger("trizod.potenci").error("FAILED: please provide 4 arguments (exiting)") + logging.getLogger("trizod.potenci").info( + "Usage: python -m trizod.potenci.potenci [pkacsvfile]" + ) raise SystemExit - seq=args[0] #one unbroken line with single-letter amino acid labels - pH=float(args[1])#e.g. 7.0 - temperature=float(args[2])#e.g. 298.0 / K - ion=float(args[3])#e.g. 0.1 / M - pkacsvfile=None - if len(args)>4:pkacsvfile=args[4] - ##name='outPOTENCI_%s_T%6.2f_I%4.2f_pH%4.2f.txt'%(seq,temperature,ion,pH) - name='outPOTENCI_%s_T%6.2f_I%4.2f_pH%4.2f.txt'%(seq[:min(150,len(seq))],temperature,ion,pH) - usephcor = pH<6.99 or pH>7.01 - if len(seq)<5: - logging.getLogger('trizod.potenci').error('FAILED: at least 5 residues are required (exiting)') + seq = args[0] # one unbroken line with single-letter amino acid labels + pH = float(args[1]) # e.g. 7.0 + temperature = float(args[2]) # e.g. 298.0 / K + ion = float(args[3]) # e.g. 0.1 / M + pkacsvfile = None + if len(args) > 4: + pkacsvfile = args[4] + # Generate output filename with truncated sequence (max 150 chars) + name = f"outPOTENCI_{seq[: min(150, len(seq))]}_T{temperature:6.2f}_I{ion:4.2f}_pH{pH:4.2f}.txt" + usephcor = pH < 6.99 or pH > 7.01 + if len(seq) < 5: + logging.getLogger("trizod.potenci").error( + "FAILED: at least 5 residues are required (exiting)" + ) raise SystemExit - #------------- now ready to generate predicted shifts --------------------- - logging.getLogger('trizod.potenci').info('predicting random coil chemical shift with POTENCI using:',seq,pH,temperature,ion,pkacsvfile) - shiftdct=getpredshifts(seq,temperature,pH,ion,usephcor,pkacsvfile) - #------------- write output nicely is SHIFTY format -----------------------$ - writeOutput(name,shiftdct) - logging.getLogger('trizod.potenci').info('chemical shift succesfully predicted, see output:',name) - -if __name__ == '__main__': + # Generate predicted chemical shifts + logging.getLogger("trizod.potenci").info( + "predicting random coil chemical shift with POTENCI using:", + seq, + pH, + temperature, + ion, + pkacsvfile, + ) + shiftdct = getpredshifts(seq, temperature, pH, ion, usephcor, pkacsvfile) + # Write output in SHIFTY format + write_output(name, shiftdct) + logging.getLogger("trizod.potenci").info( + "chemical shift succesfully predicted, see output:", name + ) + + +if __name__ == "__main__": main() diff --git a/trizod/scoring/__init__.py b/trizod/scoring/__init__.py index 1e8c5a9..bedd6e5 100644 --- a/trizod/scoring/__init__.py +++ b/trizod/scoring/__init__.py @@ -1 +1,3 @@ -from .scoring import convert_to_triplet_data, compute_zscores, compute_pscores \ No newline at end of file +from .scoring import compute_pscores, compute_zscores, convert_to_triplet_data + +__all__ = ["compute_pscores", "compute_zscores", "convert_to_triplet_data"] diff --git a/trizod/scoring/scoring.py b/trizod/scoring/scoring.py index 1cddd96..37931d4 100644 --- a/trizod/scoring/scoring.py +++ b/trizod/scoring/scoring.py @@ -1,167 +1,211 @@ +import logging +import warnings + import numpy as np import pandas as pd -import logging -import trizod.bmrb.bmrb as bmrb import scipy -import warnings -from trizod.constants import BBATNS, REFINED_WEIGHTS #, Z_CORRECTION -def convChi2CDF(rss,k): - with np.errstate(divide='ignore', invalid='ignore'): +import trizod.bmrb.bmrb as bmrb +from trizod.constants import BBATNS, REFINED_WEIGHTS # , Z_CORRECTION + + +def conv_chi2_cdf(rss, k): + with np.errstate(divide="ignore", invalid="ignore"): # I expect to see RuntimeWarnings in this block - # k can be 0 at some - res = ((((rss/k)**(1.0/6))-0.50*((rss/k)**(1.0/3))+1.0/3*((rss/k)**(1.0/2)))\ - - (5.0/6-1.0/9/k-7.0/648/(k**2)+25.0/2187/(k**3)))\ - / np.sqrt(1.0/18/k+1.0/162/(k**2)-37.0/11664/(k**3)) + # k can be 0 at some + res = ( + ( + ((rss / k) ** (1.0 / 6)) + - 0.50 * ((rss / k) ** (1.0 / 3)) + + 1.0 / 3 * ((rss / k) ** (1.0 / 2)) + ) + - (5.0 / 6 - 1.0 / 9 / k - 7.0 / 648 / (k**2) + 25.0 / 2187 / (k**3)) + ) / np.sqrt(1.0 / 18 / k + 1.0 / 162 / (k**2) - 37.0 / 11664 / (k**3)) return res + def comp2pred_arr(predshiftdct, bbshifts_arr, bbshifts_mask): - #cmparr = np.zeros(shape=(len(seq), len(BBATNS))) + # cmparr = np.zeros(shape=(len(seq), len(BBATNS))) # convert predshift dict to np array (TODO: do this in potenci...) predshift_arr = np.zeros(shape=bbshifts_arr.shape) predshift_mask = np.full(shape=bbshifts_mask.shape, fill_value=False) - for res,aa in predshiftdct: + for res, aa in predshiftdct: i = res - 1 - for j,at in enumerate(BBATNS): - if at in predshiftdct[(res,aa)]: - if predshiftdct[(res,aa)][at] is not None: - predshift_arr[i, j] = predshiftdct[(res,aa)][at] - predshift_mask[i, j] = True - cmparr = np.subtract(bbshifts_arr, predshift_arr, where=bbshifts_mask & predshift_mask, out=bbshifts_arr) + for j, at in enumerate(BBATNS): + if at in predshiftdct[(res, aa)] and predshiftdct[(res, aa)][at] is not None: + predshift_arr[i, j] = predshiftdct[(res, aa)][at] + predshift_mask[i, j] = True + cmparr = np.subtract( + bbshifts_arr, + predshift_arr, + where=bbshifts_mask & predshift_mask, + out=bbshifts_arr, + ) return cmparr, BBATNS, bbshifts_mask & predshift_mask -def compute_running_offsets(cmparr, mask, minAIC=999.): - w_ = np.array([REFINED_WEIGHTS[at] for at in BBATNS]) # ensure same order + +def compute_running_offsets(cmparr, mask, minAIC=999.0): + w_ = np.array([REFINED_WEIGHTS[at] for at in BBATNS]) # ensure same order shw_ = cmparr / w_ df = pd.DataFrame(shw_).mask(~mask) # compute rolling stadard deviation over detected shifts (missing values are ignored and streched by rolling window) at_stdc = [] at_roff = [] at_std0 = [] - for i in range(7): # TODO: not necessary to compute anything but at_stdc for all values. Only the selected position would suffice + for i in range( + 7 + ): # TODO: not necessary to compute anything but at_stdc for all values. Only the selected position would suffice roll = df[i].dropna().rolling(9, center=True) at_stdc.append(roll.std(ddof=0)) at_roff.append(roll.mean()) - at_std0.append(roll.apply(lambda x : np.sqrt(x.pow(2).mean()))) - runstds_ = pd.concat(at_stdc, axis=1).reindex(pd.Index([i for i in range(len(cmparr))])) - runoffs_ = pd.concat(at_roff, axis=1).reindex(pd.Index([i for i in range(len(cmparr))])) - runstd0s_ = pd.concat(at_std0, axis=1).reindex(pd.Index([i for i in range(len(cmparr))])) + at_std0.append(roll.apply(lambda x: np.sqrt(x.pow(2).mean()))) + runstds_ = pd.concat(at_stdc, axis=1).reindex(pd.Index(list(range(len(cmparr))))) + runoffs_ = pd.concat(at_roff, axis=1).reindex(pd.Index(list(range(len(cmparr))))) + runstd0s_ = pd.concat(at_std0, axis=1).reindex(pd.Index(list(range(len(cmparr))))) # get index with the lowest mean rolling stddev for which all ats were detected (all that were detected anywhere for this sample) runstds_val = runstds_[runstds_.columns[mask.any(axis=0)]].dropna(axis=0).mean(axis=1) try: min_idx_ = runstds_val.idxmin() except ValueError: - return None # still not found - + return None # still not found + offdct_ = {} - for col in runstds_.dropna(how='all', axis=1).columns: # for all at shifts that were detected anywhere in this sample + for col in runstds_.dropna( + how="all", axis=1 + ).columns: # for all at shifts that were detected anywhere in this sample at = BBATNS[col] roff = runoffs_.loc[min_idx_][col] std0 = runstd0s_.loc[min_idx_][col] stdc = runstds_.loc[min_idx_][col] - dAIC = np.log(std0/stdc) * 9 - 1 # difference in Akaike’s information criterion, 9 is width of window - logging.getLogger('trizod.scoring').info(f'minimum running average: {at} {roff} {dAIC}') + dAIC = ( + np.log(std0 / stdc) * 9 - 1 + ) # difference in Akaike’s information criterion, 9 is width of window + logging.getLogger("trizod.scoring").info(f"minimum running average: {at} {roff} {dAIC}") if dAIC > minAIC: - logging.getLogger('trizod.scoring').info(f'using offset correction: {at} {roff} {dAIC}') + logging.getLogger("trizod.scoring").info(f"using offset correction: {at} {roff} {dAIC}") offdct_[at] = roff else: - logging.getLogger('trizod.scoring').info(f'rejecting offset correction due to low dAIC: {at} {roff} {dAIC}') - #offdct_[at] = 0.0 + logging.getLogger("trizod.scoring").info( + f"rejecting offset correction due to low dAIC: {at} {roff} {dAIC}" + ) + # offdct_[at] = 0.0 + + return offdct_ # with the running offsets - return offdct_ #with the running offsets -def compute_offsets(shw_, accdct_, minAIC=999.): +def compute_offsets(shw_, accdct_, minAIC=999.0): anum_ = np.sum(accdct_, axis=0) # I expect to see RuntimeWarnings in this block # accdct_ can contain fully-False columns with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) newoffdct_ = np.nanmean(shw_, axis=0, where=accdct_) - astd0_ = np.sqrt(np.nanmean(shw_ ** 2, axis=0, where=accdct_)) + astd0_ = np.sqrt(np.nanmean(shw_**2, axis=0, where=accdct_)) astdc_ = np.nanstd(shw_, axis=0, where=accdct_) - with np.errstate(divide='ignore'): + with np.errstate(divide="ignore"): # for anum_ == 1, astdc_ is 0. resulting in an adAIC_ of inf as consequence of division-by-zero # this would be problematic if not all offsets with anum_ < 4 were rejected anyways adAIC_ = np.log(astd0_ / astdc_) * anum_ - 1 reject_mask = (adAIC_ < minAIC) | (anum_ < 4) astdc_[reject_mask] = astd0_[reject_mask] - newoffdct_[reject_mask] = 0. - newoffdct_ = {at:val for at,val in zip(BBATNS,newoffdct_)} + newoffdct_[reject_mask] = 0.0 + newoffdct_ = dict(zip(BBATNS, newoffdct_)) return newoffdct_ + def get_outlier_mask(cdfs3_, cdfs_, ashwi_, mask, cdfthr=6.0): oldct_ = ashwi_ > cdfthr totnum_ = mask.sum(axis=1) finaloutli_ = (cdfs_ > cdfthr) | ((cdfs3_ > cdfthr) & (cdfs_ > 0.0) & (totnum_ > 0)) - ol_ = mask & (np.bitwise_or(np.expand_dims(finaloutli_, axis=1), oldct_)) # mask for the outliers + ol_ = mask & ( + np.bitwise_or(np.expand_dims(finaloutli_, axis=1), oldct_) + ) # mask for the outliers return ol_ -def get_std_norm_diffs(cmparr, mask, offdct={}): - w_ = np.array([REFINED_WEIGHTS[at] for at in BBATNS]) # ensure same order - off_ = np.array([offdct.get(at, 0.) for at in BBATNS]) + +def get_std_norm_diffs(cmparr, mask, offdct=None): + if offdct is None: + offdct = {} + w_ = np.array([REFINED_WEIGHTS[at] for at in BBATNS]) # ensure same order + off_ = np.array([offdct.get(at, 0.0) for at in BBATNS]) shw_ = cmparr / w_ - ashwi_ = shw_.copy() # need to do the copy here, because shw_ is reused later and would otherwise be partially overwritten due to the out= + ashwi_ = shw_.copy() # need to do the copy here, because shw_ is reused later and would otherwise be partially overwritten due to the out= ashwi_ = np.abs(np.subtract(shw_, off_, where=mask, out=ashwi_)) return shw_, ashwi_ + def compute_zscores(ashwi3, k3, mask, corr=False): - indices = np.where(np.any(mask,axis=1)) + indices = np.where(np.any(mask, axis=1)) mini, maxi = indices[0][0], indices[0][-1] tot3f_ = (np.minimum(ashwi3, 4.0) ** 2).sum(axis=1) totn3f_ = k3 - cdfs3_ = convChi2CDF(tot3f_, totn3f_) + cdfs3_ = conv_chi2_cdf(tot3f_, totn3f_) if corr: raise ValueError("Z_CORRECTION is not supported") # for k in range(1,22): # m = totn3f_ == k # cdfs3_[m] += cdfs3_[m] * Z_CORRECTION[k] cdfs3_[:mini] = np.nan - cdfs3_[maxi+1:] = np.nan + cdfs3_[maxi + 1 :] = np.nan return cdfs3_ + def compute_pscores(ashwi3, k3, mask, quotient=2.0, limit=4.0): - indices = np.where(np.any(mask,axis=1)) + indices = np.where(np.any(mask, axis=1)) mini, maxi = indices[0][0], indices[0][-1] if limit: - p = np.prod(scipy.stats.norm.pdf(np.minimum(ashwi3, limit) / quotient) / scipy.stats.norm.pdf(0.), axis=1) - with np.errstate(divide='ignore'): # zeros are to be expected; resulting NANs are ok - p = p ** (1/k3) - minimum = scipy.stats.norm.pdf(limit / quotient) / scipy.stats.norm.pdf(0.) - p = (p - minimum) / (1. - minimum) + p = np.prod( + scipy.stats.norm.pdf(np.minimum(ashwi3, limit) / quotient) / scipy.stats.norm.pdf(0.0), + axis=1, + ) + with np.errstate(divide="ignore"): # zeros are to be expected; resulting NANs are ok + p = p ** (1 / k3) + minimum = scipy.stats.norm.pdf(limit / quotient) / scipy.stats.norm.pdf(0.0) + p = (p - minimum) / (1.0 - minimum) else: - p = np.prod(scipy.stats.norm.pdf(ashwi3 / quotient) / scipy.stats.norm.pdf(0.), axis=1) - with np.errstate(divide='ignore'): # zeros are to be expected; resulting NANs are ok - p = p ** (1/k3) + p = np.prod(scipy.stats.norm.pdf(ashwi3 / quotient) / scipy.stats.norm.pdf(0.0), axis=1) + with np.errstate(divide="ignore"): # zeros are to be expected; resulting NANs are ok + p = p ** (1 / k3) p[k3 == 0] = np.nan p[:mini] = np.nan - p[maxi+1:] = np.nan + p[maxi + 1 :] = np.nan return p + def convert_to_triplet_data(ashwi_, mask): ashwi3 = ashwi_.copy() - ashwi3[~mask] = 0. - ashwi3 = np.column_stack([np.pad(ashwi3, ((1,1),(0,0)))[2:], ashwi3, np.pad(ashwi3, ((1,1),(0,0)))[:-2]]) - k3 = np.column_stack([np.pad(mask, ((1,1),(0,0)))[2:],mask,np.pad(mask, ((1,1),(0,0)))[:-2]]).sum(axis=1) + ashwi3[~mask] = 0.0 + ashwi3 = np.column_stack( + [ + np.pad(ashwi3, ((1, 1), (0, 0)))[2:], + ashwi3, + np.pad(ashwi3, ((1, 1), (0, 0)))[:-2], + ] + ) + k3 = np.column_stack( + [np.pad(mask, ((1, 1), (0, 0)))[2:], mask, np.pad(mask, ((1, 1), (0, 0)))[:-2]] + ).sum(axis=1) return ashwi3, k3 -def get_offset_corrected_wSCS(seq, shifts, predshiftdct): + +def get_offset_corrected_wscs(seq, shifts, predshiftdct): # get polymer sequence and chemical backbone shifts ret = bmrb.get_valid_bbshifts(shifts, seq) if ret is None: - logging.getLogger('trizod.scoring').error(f'retrieving backbone shifts failed') + logging.getLogger("trizod.scoring").error("retrieving backbone shifts failed") return bbshifts_arr, bbshifts_mask = ret - + # compare predicted to actual shifts cmparr, _, cmp_mask = comp2pred_arr(predshiftdct, bbshifts_arr, bbshifts_mask) totbbsh = np.sum(cmp_mask) if totbbsh == 0: - logging.getLogger('trizod.scoring').error(f'no comparable backbone shifts') + logging.getLogger("trizod.scoring").error("no comparable backbone shifts") return - logging.getLogger('trizod.scoring').info(f"total number of backbone shifts: {totbbsh}") + logging.getLogger("trizod.scoring").info(f"total number of backbone shifts: {totbbsh}") - off0 = {at:0.0 for at in BBATNS} + off0 = dict.fromkeys(BBATNS, 0.0) shw0, ashwi0 = get_std_norm_diffs(cmparr, cmp_mask, off0) cdfs0 = compute_zscores(ashwi0, cmp_mask.sum(axis=1), cmp_mask) cdfs30 = compute_zscores(*convert_to_triplet_data(ashwi0, cmp_mask), cmp_mask) @@ -173,15 +217,17 @@ def get_offset_corrected_wSCS(seq, shifts, predshiftdct): offr = compute_running_offsets(cmparr, cmp_mask, minAIC=6.0) if offr is None: - logging.getLogger('trizod.scoring').warning(f'no running offset could be estimated') - elif np.any([v != 0. for v in offr.values()]): + logging.getLogger("trizod.scoring").warning("no running offset could be estimated") + elif np.any([v != 0.0 for v in offr.values()]): shwc, ashwic = get_std_norm_diffs(cmparr, cmp_mask, offr) cdfsc = compute_zscores(ashwic, cmp_mask.sum(axis=1), cmp_mask) cdfs3c = compute_zscores(*convert_to_triplet_data(ashwic, cmp_mask), cmp_mask) avc = np.nanmean(cdfs3c) - if av0 >= avc: # use offset correction only if it leads to, in average, better accordance with the POTENCI model (more disordered) + if ( + av0 >= avc + ): # use offset correction only if it leads to, in average, better accordance with the POTENCI model (more disordered) olc = get_outlier_mask(cdfs3c, cdfsc, ashwic, cmp_mask, cdfthr=6.0) - noffc = compute_offsets(shwc, cmp_mask & ~olc, minAIC=6.) + noffc = compute_offsets(shwc, cmp_mask & ~olc, minAIC=6.0) offf = noffc olf = olc diff --git a/trizod/trizod.py b/trizod/trizod.py index a45e7f4..2baafc8 100644 --- a/trizod/trizod.py +++ b/trizod/trizod.py @@ -1,230 +1,353 @@ #!/usr/bin/env python3 -import os, sys -import logging import argparse -import trizod.potenci.potenci as potenci +import logging +import os +import pickle +import re +import sys +import time + +import numpy as np +import pandas as pd +from pandarallel import pandarallel +from tqdm import tqdm + import trizod.bmrb.bmrb as bmrb +import trizod.potenci.potenci as potenci import trizod.scoring.scoring as scoring from trizod.constants import BBATNS, CAN_TRANS from trizod.utils import ArgHelpFormatter -import numpy as np -import pandas as pd -import traceback -import re -import pickle -from tqdm import tqdm -from pandarallel import pandarallel -import time -class Found(Exception): pass -class ZscoreComputationError(Exception): pass -class OffsetTooLargeException(Exception): pass -class OffsetCausedFilterException(Exception): pass -class FilterException(Exception): pass - -filter_defaults = pd.DataFrame({ - 'temperature-range' : [[-np.inf, +np.inf], [263.0, 333.0], [273.0, 323.0], [273.0, 313.0]], - 'ionic-strength-range' : [[0., np.inf], [0., 7.], [0., 5.], [0., 3.]], - 'pH-range' : [[-np.inf, np.inf], [2., 12.], [4., 10.], [6., 8.]], - 'unit-assumptions' : [True, True, True, False], - 'unit-corrections' : [True, True, False, False], - 'default-conditions' : [True, True, True, False], - 'peptide-length-range' : [[5], [5], [10], [15]], - 'min-backbone-shift-types' : [1, 2, 3, 5], - 'min-backbone-shift-positions' : [3, 3, 8, 12], - 'min-backbone-shift-fraction' : [0., 0., 0.6, 0.8], - 'max-noncanonical-fraction' : [1., 0.1, 0.025, 0.], - 'max-x-fraction' : [1., 0.2, 0.05, 0.], - 'keywords-blacklist' : [[], - ['denatur'], - ['denatur', 'unfold', 'misfold'], - ['denatur', 'unfold', 'misfold', 'interacti', 'bound']], # interacti[on/ng] - 'chemical-denaturants' : [[], - ['guanidin', 'GdmCl', 'Gdn-Hcl','urea'], - ['guanidin', 'GdmCl', 'Gdn-Hcl','urea'], - ['guanidin', 'GdmCl', 'Gdn-Hcl','urea','BME','2-ME','mercaptoethanol', - 'TFA', 'trifluoroethanol', 'Potassium Pyrophosphate', 'acetic acid', 'CD3COOH', - 'DTT', 'dithiothreitol', 'dss', 'deuterated sodium acetate']], - 'exp-method-whitelist' : [['', '.'], ['','solution', 'structures'], ['','solution', 'structures'], ['solution','structures']], - 'exp-method-blacklist' : [[], ['solid', 'state'], ['solid', 'state'], ['solid', 'state']], - 'max-offset' : [np.inf, 3., 3., 2.], - 'reject-shift-type-only' : [True, True, False, False], -}, index=['unfiltered', 'tolerant', 'moderate', 'strict']) + +class FoundError(Exception): + pass + + +class ZscoreComputationError(Exception): + pass + + +class OffsetTooLargeError(Exception): + pass + + +class OffsetCausedFilterError(Exception): + pass + + +class FilterError(Exception): + pass + + +filter_defaults = pd.DataFrame( + { + "temperature-range": [ + [-np.inf, +np.inf], + [263.0, 333.0], + [273.0, 323.0], + [273.0, 313.0], + ], + "ionic-strength-range": [[0.0, np.inf], [0.0, 7.0], [0.0, 5.0], [0.0, 3.0]], + "pH-range": [[-np.inf, np.inf], [2.0, 12.0], [4.0, 10.0], [6.0, 8.0]], + "unit-assumptions": [True, True, True, False], + "unit-corrections": [True, True, False, False], + "default-conditions": [True, True, True, False], + "peptide-length-range": [[5], [5], [10], [15]], + "min-backbone-shift-types": [1, 2, 3, 5], + "min-backbone-shift-positions": [3, 3, 8, 12], + "min-backbone-shift-fraction": [0.0, 0.0, 0.6, 0.8], + "max-noncanonical-fraction": [1.0, 0.1, 0.025, 0.0], + "max-x-fraction": [1.0, 0.2, 0.05, 0.0], + "keywords-blacklist": [ + [], + ["denatur"], + ["denatur", "unfold", "misfold"], + ["denatur", "unfold", "misfold", "interacti", "bound"], + ], # interacti[on/ng] + "chemical-denaturants": [ + [], + ["guanidin", "GdmCl", "Gdn-Hcl", "urea"], + ["guanidin", "GdmCl", "Gdn-Hcl", "urea"], + [ + "guanidin", + "GdmCl", + "Gdn-Hcl", + "urea", + "TFA", + "trifluoroethanol", + "Potassium Pyrophosphate", + ], + ], + "exp-method-whitelist": [ + ["", "."], + ["", "solution", "structures"], + ["", "solution", "structures"], + ["solution", "structures"], + ], + "exp-method-blacklist": [ + [], + ["solid"], + ["solid"], + ["solid"], + ], + "max-offset": [np.inf, 3.0, 3.0, 2.0], + "reject-shift-type-only": [True, True, False, False], + }, + index=["unfiltered", "tolerant", "moderate", "strict"], +) def parse_args(): - init_parser = argparse.ArgumentParser(description='', add_help=False) - - io_grp = init_parser.add_argument_group('Input/Output Options') + init_parser = argparse.ArgumentParser(description="", add_help=False) + + io_grp = init_parser.add_argument_group("Input/Output Options") io_grp.add_argument( - '--input-dir', '-d', default='.', - help='Directory that is searched recursively for BMRB .str files.') + "--input-dir", + "-d", + default=".", + help="Directory that is searched recursively for BMRB .str files.", + ) io_grp.add_argument( - '--output-prefix', default='./trizod_dataset', - help='Prefix (and path) of the created output file.') + "--output-prefix", + default="./trizod_dataset", + help="Prefix (and path) of the created output file.", + ) io_grp.add_argument( - '--output-format', choices=['json', 'csv'], default='csv', - help='Output file format.') + "--output-format", + choices=["json", "csv"], + default="csv", + help="Output file format.", + ) io_grp.add_argument( - '--cache-dir', default='./tmp', - help='Create and use cache files in the given directory to acelerate repeated execution.') + "--cache-dir", + default="./tmp", + help="Create and use cache files in the given directory to acelerate repeated execution.", + ) io_grp.add_argument( - '--BMRB-file-pattern', default="bmr(\d+)_3\.str", - help="regular expression pattern for BMRB files.") + "--BMRB-file-pattern", + default=r"bmr(\d+)_3\.str", + help="regular expression pattern for BMRB files.", + ) io_grp.add_argument( - '--include-shifts', action='store_true', - help='Add raw backbone atom shift data to the output.') + "--include-shifts", + action="store_true", + help="Add raw backbone atom shift data to the output.", + ) io_grp.add_argument( - '--no-shift-averaging', action='store_true', - help='Do not average over Proton groups for HA and HB shifts.') - - - filter_defaults_grp = init_parser.add_argument_group('Filter Default Settings') - filter_defaults_arg = filter_defaults_grp.add_argument( - '--filter-defaults', choices=list(filter_defaults.index), default='tolerant', - help='Sets defaults for all filter options, from unfiltered to strict.') + "--no-shift-averaging", + action="store_true", + help="Do not average over Proton groups for HA and HB shifts.", + ) + + filter_defaults_grp = init_parser.add_argument_group("Filter Default Settings") + filter_defaults_grp.add_argument( + "--filter-defaults", + choices=list(filter_defaults.index), + default="tolerant", + help="Sets defaults for all filter options, from unfiltered to strict.", + ) args_init, remaining_argv = init_parser.parse_known_args() parser = argparse.ArgumentParser( parents=[init_parser], description=__doc__, - formatter_class=ArgHelpFormatter,#formatter_class=argparse.RawDescriptionHelpFormatter, - ) - filter_grp = parser.add_argument_group('Filtering Options') + formatter_class=ArgHelpFormatter, # formatter_class=argparse.RawDescriptionHelpFormatter, + ) + filter_grp = parser.add_argument_group("Filtering Options") filter_grp.add_argument( - '--temperature-range', nargs=2, type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'temperature-range'], - help='Minimum and maximum temperature in Kelvin.') + "--temperature-range", + nargs=2, + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "temperature-range"], + help="Minimum and maximum temperature in Kelvin.", + ) filter_grp.add_argument( - '--ionic-strength-range', nargs=2, type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'ionic-strength-range'], - help='Minimum and maximum ionic strength in Mol.') + "--ionic-strength-range", + nargs=2, + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "ionic-strength-range"], + help="Minimum and maximum ionic strength in Mol.", + ) filter_grp.add_argument( - '--pH-range', nargs=2, type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'pH-range'], - help='Minimum and maximum pH.') + "--pH-range", + nargs=2, + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "pH-range"], + help="Minimum and maximum pH.", + ) filter_grp.add_argument( - '--unit-assumptions', action=argparse.BooleanOptionalAction, - default=filter_defaults.loc[args_init.filter_defaults, 'unit-assumptions'], - help='Assume units for Temp., Ionic str. and pH if they are not given and exclude entries instead.') + "--unit-assumptions", + action=argparse.BooleanOptionalAction, + default=filter_defaults.loc[args_init.filter_defaults, "unit-assumptions"], + help="Assume units for Temp., Ionic str. and pH if they are not given and exclude entries instead.", + ) filter_grp.add_argument( - '--unit-corrections', action=argparse.BooleanOptionalAction, - default=filter_defaults.loc[args_init.filter_defaults, 'unit-corrections'], - help='Correct values for Temp., Ionic str. and pH if units are most likely wrong.') + "--unit-corrections", + action=argparse.BooleanOptionalAction, + default=filter_defaults.loc[args_init.filter_defaults, "unit-corrections"], + help="Correct values for Temp., Ionic str. and pH if units are most likely wrong.", + ) filter_grp.add_argument( - '--default-conditions', action=argparse.BooleanOptionalAction, - default=filter_defaults.loc[args_init.filter_defaults, 'default-conditions'], - help='Assume standard conditions if pH (7), ionic strength (0.1 M) or temperature (298 K) are missing and exclude entries instead.') + "--default-conditions", + action=argparse.BooleanOptionalAction, + default=filter_defaults.loc[args_init.filter_defaults, "default-conditions"], + help="Assume standard conditions if pH (7), ionic strength (0.1 M) or temperature (298 K) are missing and exclude entries instead.", + ) filter_grp.add_argument( - '--peptide-length-range', nargs='+', type=int, - default=filter_defaults.loc[args_init.filter_defaults, 'peptide-length-range'], - help='Minimum (and optionally maximum) peptide sequence length.') + "--peptide-length-range", + nargs="+", + type=int, + default=filter_defaults.loc[args_init.filter_defaults, "peptide-length-range"], + help="Minimum (and optionally maximum) peptide sequence length.", + ) filter_grp.add_argument( - '--min-backbone-shift-types', type=int, - default=filter_defaults.loc[args_init.filter_defaults, 'min-backbone-shift-types'], - help='Minimum number of different backbone shift types (max 7).') + "--min-backbone-shift-types", + type=int, + default=filter_defaults.loc[args_init.filter_defaults, "min-backbone-shift-types"], + help="Minimum number of different backbone shift types (max 7).", + ) filter_grp.add_argument( - '--min-backbone-shift-positions', type=int, - default=filter_defaults.loc[args_init.filter_defaults, 'min-backbone-shift-positions'], - help='Minimum number of positions with at least one backbone shift.') + "--min-backbone-shift-positions", + type=int, + default=filter_defaults.loc[args_init.filter_defaults, "min-backbone-shift-positions"], + help="Minimum number of positions with at least one backbone shift.", + ) filter_grp.add_argument( - '--min-backbone-shift-fraction', type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'min-backbone-shift-fraction'], - help='Minimum fraction of positions with at least one backbone shift.') + "--min-backbone-shift-fraction", + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "min-backbone-shift-fraction"], + help="Minimum fraction of positions with at least one backbone shift.", + ) filter_grp.add_argument( - '--max-noncanonical-fraction', type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'max-noncanonical-fraction'], - help='Maximum fraction of non-canonical amino acids (X count as arbitrary canonical) in the amino acid sequence.') + "--max-noncanonical-fraction", + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "max-noncanonical-fraction"], + help="Maximum fraction of non-canonical amino acids (X count as arbitrary canonical) in the amino acid sequence.", + ) filter_grp.add_argument( - '--max-x-fraction', type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'max-x-fraction'], - help='Maximum fraction of X letters (arbitrary canonical amino acid) in the amino acid sequence.') + "--max-x-fraction", + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "max-x-fraction"], + help="Maximum fraction of X letters (arbitrary canonical amino acid) in the amino acid sequence.", + ) filter_grp.add_argument( - '--keywords-blacklist', nargs='*', - default=filter_defaults.loc[args_init.filter_defaults, 'keywords-blacklist'], - help='Exclude entries with any of these keywords mentioned anywhere in the BMRB file, case ignored.') + "--keywords-blacklist", + nargs="*", + default=filter_defaults.loc[args_init.filter_defaults, "keywords-blacklist"], + help="Exclude entries with any of these keywords mentioned anywhere in the BMRB file, case ignored.", + ) filter_grp.add_argument( - '--chemical-denaturants', nargs='*', - default=filter_defaults.loc[args_init.filter_defaults, 'chemical-denaturants'], - help='Exclude entries with any of these chemicals as substrings of sample components, case ignored.') + "--chemical-denaturants", + nargs="*", + default=filter_defaults.loc[args_init.filter_defaults, "chemical-denaturants"], + help="Exclude entries with any of these chemicals as substrings of sample components, case ignored.", + ) filter_grp.add_argument( - '--exp-method-whitelist', nargs='*', - default=filter_defaults.loc[args_init.filter_defaults, 'exp-method-whitelist'], - help='Include only entries with any of these keywords as substring of the experiment subtype, case ignored.') + "--exp-method-whitelist", + nargs="*", + default=filter_defaults.loc[args_init.filter_defaults, "exp-method-whitelist"], + help="Include only entries with any of these keywords as substring of the experiment subtype, case ignored.", + ) filter_grp.add_argument( - '--exp-method-blacklist', nargs='*', - default=filter_defaults.loc[args_init.filter_defaults, 'exp-method-blacklist'], - help='Exclude entries with any of these keywords as substring of the experiment subtype, case ignored.') - - scores_grp = parser.add_argument_group('Scoring Options') + "--exp-method-blacklist", + nargs="*", + default=filter_defaults.loc[args_init.filter_defaults, "exp-method-blacklist"], + help="Exclude entries with any of these keywords as substring of the experiment subtype, case ignored.", + ) + + scores_grp = parser.add_argument_group("Scoring Options") scores_grp.add_argument( - '--score-types', nargs='+', choices=['zscores', 'pscores', 'corrected'], - default=['zscores','pscores'], - help='Which type of scores are created: Observation count-independent zscores (zscores), ' - 'original CheZOD zscores (chezod) or geometric mean of observation probabilities (pscores).') + "--score-types", + nargs="+", + choices=["zscores", "pscores", "corrected"], + default=["zscores", "pscores"], + help="Which type of scores are created: Observation count-independent zscores (zscores), " + "original CheZOD zscores (chezod) or geometric mean of observation probabilities (pscores).", + ) scores_grp.add_argument( - '--offset-correction', action=argparse.BooleanOptionalAction, default=True, - help='Compute correction offsets for random coil chemical shifts') + "--offset-correction", + action=argparse.BooleanOptionalAction, + default=True, + help="Compute correction offsets for random coil chemical shifts", + ) scores_grp.add_argument( - '--max-offset', type=float, - default=filter_defaults.loc[args_init.filter_defaults, 'max-offset'], - help='Maximum valid offset correction for any random coil chemical shift type.') + "--max-offset", + type=float, + default=filter_defaults.loc[args_init.filter_defaults, "max-offset"], + help="Maximum valid offset correction for any random coil chemical shift type.", + ) scores_grp.add_argument( - '--reject-shift-type-only', action=argparse.BooleanOptionalAction, - default=filter_defaults.loc[args_init.filter_defaults, 'reject-shift-type-only'], - help='Upon exceeding the maximal offset set by <--max-offset>, exclude only the backbone shifts exceeding the offset instead of the whole entry.') + "--reject-shift-type-only", + action=argparse.BooleanOptionalAction, + default=filter_defaults.loc[args_init.filter_defaults, "reject-shift-type-only"], + help="Upon exceeding the maximal offset set by <--max-offset>, exclude only the backbone shifts exceeding the offset instead of the whole entry.", + ) scores_grp.add_argument( - '--precision', type=int, default=4, - help='Number of decimal digits that are output to human readable files.') + "--precision", + type=int, + default=4, + help="Number of decimal digits that are output to human readable files.", + ) - other_grp = parser.add_argument_group('Other Options') + other_grp = parser.add_argument_group("Other Options") other_grp.add_argument( - '--processes', default=8, type=int, - help='Number of processes to spawn in multiprocessing.') + "--processes", + default=8, + type=int, + help="Number of processes to spawn in multiprocessing.", + ) other_grp.add_argument( - '--progress', action=argparse.BooleanOptionalAction, + "--progress", + action=argparse.BooleanOptionalAction, default=True, - help='Show progress bars.') + help="Show progress bars.", + ) - parser.add_argument('--debug', action='store_true') + parser.add_argument("--debug", action="store_true") args = parser.parse_args(sys.argv[1:]) - #args = argparse.Namespace(**vars(args_init), **vars(args)) - + # args = argparse.Namespace(**vars(args_init), **vars(args)) if not os.path.exists(args.input_dir): - logging.getLogger('trizod').error(f"Input directory {args.input_dir} does not exist.") + logging.getLogger("trizod").error(f"Input directory {args.input_dir} does not exist.") exit(1) if not os.path.isdir(args.input_dir): - logging.getLogger('trizod').error(f"Path {args.input_dir} is not a directory.") + logging.getLogger("trizod").error(f"Path {args.input_dir} is not a directory.") exit(1) args.input_dir = os.path.abspath(args.input_dir) args.output_prefix = os.path.abspath(args.output_prefix) if not os.path.exists(os.path.dirname(args.output_prefix)): - logging.getLogger('trizod').error(f"Output directory {os.path.dirname(args.output_prefix)} does not exist.") + logging.getLogger("trizod").error( + f"Output directory {os.path.dirname(args.output_prefix)} does not exist." + ) exit(1) if len(args.peptide_length_range) == 1: args.peptide_length_range.append(np.inf) args.cache_dir = os.path.abspath(args.cache_dir) - dirs = [args.cache_dir, - os.path.join(args.cache_dir, 'wSCS'), - os.path.join(args.cache_dir, 'bmrb_entries')] + dirs = [ + args.cache_dir, + os.path.join(args.cache_dir, "wSCS"), + os.path.join(args.cache_dir, "bmrb_entries"), + ] if not np.all([os.path.exists(d) for d in dirs]): if not os.path.exists(args.cache_dir): - logging.getLogger('trizod').debug(f"Directory {args.cache_dir} does not exist and is created.") + logging.getLogger("trizod").debug( + f"Directory {args.cache_dir} does not exist and is created." + ) for d in dirs: os.makedirs(d, exist_ok=True) elif not os.path.isdir(args.cache_dir): - logging.getLogger('trizod').error(f"Path {args.cache_dir} is not a directory.") + logging.getLogger("trizod").error(f"Path {args.cache_dir} is not a directory.") exit(1) return args -def find_bmrb_files(input_dir, pattern="bmr(\d+)_3\.str"): + +def find_bmrb_files(input_dir, pattern=r"bmr(\d+)_3\.str"): """ - If the given path contains at least one bmr_3.str file, only files in this directory are returned. + If the given path contains at least one bmr_3.str file, only files in this directory are returned. Else, all subdirectories are searched for bmr_3.str files. """ bmrb_files = {} @@ -234,29 +357,35 @@ def find_bmrb_files(input_dir, pattern="bmr(\d+)_3\.str"): bmrb_files[m.group(1)] = os.path.join(input_dir, m.group(0)) if not bmrb_files: # try finding BMRB files in subdirectories instead - for d in [os.path.join(input_dir, p) for p in os.listdir(input_dir) if os.path.isdir(os.path.join(input_dir, p))]: + for d in [ + os.path.join(input_dir, p) + for p in os.listdir(input_dir) + if os.path.isdir(os.path.join(input_dir, p)) + ]: for p in os.listdir(d): m = re.fullmatch(pattern, p) if m is not None: bmrb_files[m.group(1)] = os.path.join(d, m.group(0)) return bmrb_files + def parse_bmrb_file(row, cache_dir=None): try: entry = bmrb.BmrbEntry(row.name, row.dir) - except: + except Exception: return None if cache_dir: - with open(row.cache_fp, 'wb') as f: + with open(row.cache_fp, "wb") as f: pickle.dump(entry, f) return entry + def load_bmrb_entries(bmrb_files, cache_dir=None): entries, failed = {}, [] - columns = ['entry', 'dir'] + columns = ["entry", "dir"] # read cached data if cache_dir: - columns.append('cache_fp') + columns.append("cache_fp") for id_, fp in bmrb_files.items(): cache_fp = os.path.join(cache_dir, "bmrb_entries", f"{id_}.pkl") entry = None @@ -264,8 +393,10 @@ def load_bmrb_entries(bmrb_files, cache_dir=None): try: with open(cache_fp, "rb") as f: entry = pickle.load(f) - except: - logging.getLogger('trizod.bmrb').debug(f"cache file {cache_fp} corrupt or formatted wrong") + except Exception as e: + logging.getLogger("trizod.bmrb").debug( + f"cache file {cache_fp} corrupt or formatted wrong: {e}" + ) entries[id_] = (entry, os.path.dirname(fp), cache_fp) else: for id_, fp in bmrb_files.items(): @@ -273,137 +404,173 @@ def load_bmrb_entries(bmrb_files, cache_dir=None): df = pd.DataFrame(entries.values(), index=entries.keys(), columns=columns) sel = pd.isna(df.entry) if not df.loc[sel].empty: - df.loc[sel, 'entry'] = df.loc[sel].parallel_apply(parse_bmrb_file, axis=1, cache_dir=cache_dir) + df.loc[sel, "entry"] = df.loc[sel].parallel_apply( + parse_bmrb_file, axis=1, cache_dir=cache_dir + ) sel = pd.isna(df.entry) failed = df.loc[sel].index.to_list() return df.loc[~sel], failed -def prefilter_dataframe(df, - method_whitelist, method_blacklist, - temperature_range, - ionic_strength_range, - pH_range, - peptide_length_range, - min_backbone_shift_types, - min_backbone_shift_positions, - min_backbone_shift_fraction, - max_noncanonical_fraction, - max_x_fraction, - keywords, - chemical_denaturants, - ): - missing_vals = ~df[['exp_method', 'temperature', 'ionic_strength', 'pH', 'seq', 'total_bbshifts']].isna().any(axis=1) - method_sel = df.exp_method.str.lower().str.contains('nmr') - method_whitelist_ = [l.lower() for l in method_whitelist] + +def prefilter_dataframe( + df, + method_whitelist, + method_blacklist, + temperature_range, + ionic_strength_range, + pH_range, + peptide_length_range, + min_backbone_shift_types, + min_backbone_shift_positions, + min_backbone_shift_fraction, + max_noncanonical_fraction, + max_x_fraction, + keywords, + chemical_denaturants, +): + missing_vals = ~df[ + ["exp_method", "temperature", "ionic_strength", "pH", "seq", "total_bbshifts"] + ].isna().any(axis=1) + method_sel = df.exp_method.str.lower().str.contains("nmr") + method_whitelist_ = [method.lower() for method in method_whitelist] if method_whitelist_: - method_sel &= (df.exp_method_subtype.str.lower().str.contains("|".join(method_whitelist_), regex=True)) + method_sel &= df.exp_method_subtype.str.lower().str.contains( + "|".join(method_whitelist_), regex=True + ) else: method_sel = False - method_blacklist_ = [l.lower() for l in method_blacklist] + method_blacklist_ = [method.lower() for method in method_blacklist] if method_blacklist_: - method_sel &= (~df.exp_method_subtype.str.lower().str.contains("|".join(method_blacklist_), regex=True)) - if '' in method_whitelist_ and '' not in method_blacklist_: - method_sel |= df.exp_method.str.lower().str.contains('nmr') & pd.isna(df.exp_method_subtype) + method_sel &= ~df.exp_method_subtype.str.lower().str.contains( + "|".join(method_blacklist_), regex=True + ) + if "" in method_whitelist_ and "" not in method_blacklist_: + method_sel |= df.exp_method.str.lower().str.contains("nmr") & pd.isna(df.exp_method_subtype) else: - #method_sel = sels_pre["method (sub-)type"].fillna(False) + # method_sel = sels_pre["method (sub-)type"].fillna(False) method_sel &= ~pd.isna(df.exp_method_subtype) missing_vals &= ~pd.isna(df.exp_method_subtype) sels_pre = { - #"missing values" : ~df[['ionic_strength', 'pH', 'temperature','seq','total_bbshifts', 'bbshift_types']].isna().any(axis=1), - ("method (sub-)type", "") : - method_sel, - ("temperature", f"{list(temperature_range)}") : - (df.temperature >= temperature_range[0]) & \ - (df.temperature <= temperature_range[1]), - ("ionic strength", f"{list(ionic_strength_range)}") : - (df.ionic_strength >= ionic_strength_range[0]) & \ - (df.ionic_strength <= ionic_strength_range[1]), - ("pH", f"{list(pH_range)}") : - (df.pH >= pH_range[0]) & \ - (df.pH <= pH_range[1]), - ("peptide length", f"{list(peptide_length_range)}") : - (df.seq.str.len() >= peptide_length_range[0]) & \ - (df.seq.str.len() <= peptide_length_range[1]), - ("bb shift types", f"[{min_backbone_shift_types}, inf]") : - (df.bbshift_types >= min_backbone_shift_types), - ("bb shift positions", f"[{min_backbone_shift_positions}, inf]") : - (df.bbshift_positions >= min_backbone_shift_positions), - ("bb shift fraction", f"[{min_backbone_shift_fraction}, inf]") : - ((df.bbshift_positions / df.seq.str.len()) >= min_backbone_shift_fraction), - ("non-canonical frac", f"[0, {max_noncanonical_fraction}]") : - ((1. - df.seq.str.translate(CAN_TRANS).str.count('#') / df.seq.str.len()) <= max_noncanonical_fraction), - ("X fraction", f"[0, {max_x_fraction}]") : - (df.seq.str.count('X') / df.seq.str.len() <= max_x_fraction), - } - sels_kws = { - kw : ~df[kw] for kw in keywords - } - sels_denat = { - cd : ~df[cd] for cd in chemical_denaturants + # "missing values" : ~df[['ionic_strength', 'pH', 'temperature','seq','total_bbshifts', 'bbshift_types']].isna().any(axis=1), + ("method (sub-)type", ""): method_sel, + ("temperature", f"{list(temperature_range)}"): (df.temperature >= temperature_range[0]) + & (df.temperature <= temperature_range[1]), + ("ionic strength", f"{list(ionic_strength_range)}"): ( + df.ionic_strength >= ionic_strength_range[0] + ) + & (df.ionic_strength <= ionic_strength_range[1]), + ("pH", f"{list(pH_range)}"): (df.pH >= pH_range[0]) & (df.pH <= pH_range[1]), + ("peptide length", f"{list(peptide_length_range)}"): ( + df.seq.str.len() >= peptide_length_range[0] + ) + & (df.seq.str.len() <= peptide_length_range[1]), + ("bb shift types", f"[{min_backbone_shift_types}, inf]"): ( + df.bbshift_types >= min_backbone_shift_types + ), + ("bb shift positions", f"[{min_backbone_shift_positions}, inf]"): ( + df.bbshift_positions >= min_backbone_shift_positions + ), + ("bb shift fraction", f"[{min_backbone_shift_fraction}, inf]"): ( + (df.bbshift_positions / df.seq.str.len()) >= min_backbone_shift_fraction + ), + ("non-canonical frac", f"[0, {max_noncanonical_fraction}]"): ( + (1.0 - df.seq.str.translate(CAN_TRANS).str.count("#") / df.seq.str.len()) + <= max_noncanonical_fraction + ), + ("X fraction", f"[0, {max_x_fraction}]"): ( + df.seq.str.count("X") / df.seq.str.len() <= max_x_fraction + ), } - sels_all_pre = {k[0]:v for k,v in sels_pre.items()} | sels_kws | sels_denat - + sels_kws = {kw: ~df[kw] for kw in keywords} + sels_denat = {cd: ~df[cd] for cd in chemical_denaturants} + sels_all_pre = {k[0]: v for k, v in sels_pre.items()} | sels_kws | sels_denat + passing = missing_vals.copy() - for filter, sel in sels_all_pre.items(): - passing &= sel # passes all filters - - df['pass_pre'] = False - df.loc[passing, 'pass_pre'] = True + for _filter, sel in sels_all_pre.items(): + passing &= sel # passes all filters + + df["pass_pre"] = False + df.loc[passing, "pass_pre"] = True return df, missing_vals, sels_pre, sels_kws, sels_denat, sels_all_pre -def postfilter_dataframe(df, - min_backbone_shift_types, - min_backbone_shift_positions, - min_backbone_shift_fraction, - reject_shift_type_only, - score_types): + +def postfilter_dataframe( + df, + min_backbone_shift_types, + min_backbone_shift_positions, + min_backbone_shift_fraction, + reject_shift_type_only, + score_types, +): comp_error = np.full((len(df),), False) for score_type in score_types: comp_error |= pd.isna(df[score_type]) sels_post = { - ("bb shift types", f"[{min_backbone_shift_types}, inf]") : - (df.bbshift_types_post >= min_backbone_shift_types), - ("bb shift positions", f"[{min_backbone_shift_positions}, inf]") : - (df.bbshift_positions_post >= min_backbone_shift_positions), - ("bb shift fraction", f"[{min_backbone_shift_fraction}, inf]") : - ((df.bbshift_positions_post / df.seq.str.len()) >= min_backbone_shift_fraction), - ("error in computation", "") : - (~comp_error) + ("bb shift types", f"[{min_backbone_shift_types}, inf]"): ( + df.bbshift_types_post >= min_backbone_shift_types + ), + ("bb shift positions", f"[{min_backbone_shift_positions}, inf]"): ( + df.bbshift_positions_post >= min_backbone_shift_positions + ), + ("bb shift fraction", f"[{min_backbone_shift_fraction}, inf]"): ( + (df.bbshift_positions_post / df.seq.str.len()) >= min_backbone_shift_fraction + ), + ("error in computation", ""): (~comp_error), } if not reject_shift_type_only: any_offsets_too_large = pd.Series(np.full((df.shape[0],), False)) for at in scoring.BBATNS: any_offsets_too_large |= pd.isna(df[f"off_{at}"]) - sels_post.update({("rejected due to any offset", "") : ~any_offsets_too_large}) + sels_post.update({("rejected due to any offset", ""): ~any_offsets_too_large}) - sels_off = { - f"off_{at}" : ~pd.isna(df[f"off_{at}"]) for at in BBATNS - } - sels_all_post = {k[0]:v for k,v in sels_post.items()} #| sels_off + sels_off = {f"off_{at}": ~pd.isna(df[f"off_{at}"]) for at in BBATNS} + sels_all_post = {k[0]: v for k, v in sels_post.items()} # | sels_off + + passing = df["pass_pre"].copy() + for _filter, sel in sels_all_post.items(): + passing &= sel # passes all filters - passing = df['pass_pre'].copy() - for filter, sel in sels_all_post.items(): - passing &= sel # passes all filters - - df['pass_post'] = False - df.loc[passing, 'pass_post'] = True + df["pass_post"] = False + df.loc[passing, "pass_post"] = True return sels_post, sels_off, sels_all_post -def print_filter_losses(df, missing_vals, sels_pre, sels_kws, sels_denat, sels_all_pre, sels_post, sels_off, sels_all_post): - w_str, w_num = np.max([len(key[0])+len(key[1])+5 for key in sels_all_pre] + [len(key[0])+len(key[1])+4 for key in sels_all_post] + [40]), 10 - total_width = (w_str + 2*w_num + 7 + 8) + +def print_filter_losses( + df, + missing_vals, + sels_pre, + sels_kws, + sels_denat, + sels_all_pre, + sels_post, + sels_off, + sels_all_post, +): + w_str, w_num = ( + np.max( + [len(key[0]) + len(key[1]) + 5 for key in sels_all_pre] + + [len(key[0]) + len(key[1]) + 4 for key in sels_all_post] + + [40] + ), + 10, + ) + total_width = w_str + 2 * w_num + 7 + 8 print("\nPre-computation filtering results") print("=" * total_width) - print(f"{'criterium':>{w_str}} : {'filtered':<{w_num}} {'unique':<{w_num}}")# {'missing':<{w_num}}") - for (filter,crit), sel in sels_pre.items(): + print( + f"{'criterium':>{w_str}} : {'filtered':<{w_num}} {'unique':<{w_num}}" + ) # {'missing':<{w_num}}") + for (filter, crit), sel in sels_pre.items(): uniq = pd.Series(np.full((len(sel),), False)) for other_filter, other_sel in sels_all_pre.items(): if other_filter != filter: uniq |= ~other_sel uniq = ~sel & ~uniq - s = f"{filter}{'':<{w_str-(len(filter)+len(crit))}}{crit}" - print(f"{s} : {(~sel).sum():>{w_num}} {uniq.sum():>{w_num}}")# {(uniq & ~missing_vals).sum():>{w_num}}") + s = f"{filter}{'':<{w_str - (len(filter) + len(crit))}}{crit}" + print( + f"{s} : {(~sel).sum():>{w_num}} {uniq.sum():>{w_num}}" + ) # {(uniq & ~missing_vals).sum():>{w_num}}") if sels_kws: print() print(f"{'keyword':>{w_str}} : {'filtered':<{w_num}} {'unique':<{w_num}}") @@ -413,7 +580,9 @@ def print_filter_losses(df, missing_vals, sels_pre, sels_kws, sels_denat, sels_a if other_filter != filter: uniq |= ~other_sel uniq = ~sel & ~uniq - print(f"{'.*'+filter+'.*':<{w_str}} : {(~sel).sum():>{w_num}} {uniq.sum():>{w_num}}") + print( + f"{'.*' + filter + '.*':<{w_str}} : {(~sel).sum():>{w_num}} {uniq.sum():>{w_num}}" + ) if sels_denat: print() print(f"{'chemical denaturant':>{w_str}} : {'filtered':<{w_num}} {'unique':<{w_num}}") @@ -423,14 +592,20 @@ def print_filter_losses(df, missing_vals, sels_pre, sels_kws, sels_denat, sels_a if other_filter != filter: uniq |= ~other_sel uniq = ~sel & ~uniq - print(f"{'.*'+filter+'.*':<{w_str}} : {(~sel).sum():>{w_num}} {uniq.sum():>{w_num}}") - + print( + f"{'.*' + filter + '.*':<{w_str}} : {(~sel).sum():>{w_num}} {uniq.sum():>{w_num}}" + ) + print("-" * total_width) - passing_pre = df['pass_pre'].copy() - print(f"{'total filtered':<{w_str}} : {(~passing_pre).sum():>{w_num}} of {len(df):>{w_num-3}} ({(~passing_pre).sum() / len(df) * 100.:>{6}.2f} %)") + passing_pre = df["pass_pre"].copy() + print( + f"{'total filtered':<{w_str}} : {(~passing_pre).sum():>{w_num}} of {len(df):>{w_num - 3}} ({(~passing_pre).sum() / len(df) * 100.0:>{6}.2f} %)" + ) print("=" * total_width) print() - print(f"{'remaining for scores computation':<{w_str}} : {(passing_pre).sum():>{w_num}} of {len(df):>{w_num-3}} ({(passing_pre).sum() / len(df) * 100.:>{6}.2f} %)") + print( + f"{'remaining for scores computation':<{w_str}} : {(passing_pre).sum():>{w_num}} of {len(df):>{w_num - 3}} ({(passing_pre).sum() / len(df) * 100.0:>{6}.2f} %)" + ) print() print("\nRejected offsets stats") print("=" * total_width) @@ -441,93 +616,133 @@ def print_filter_losses(df, missing_vals, sels_pre, sels_kws, sels_denat, sels_a if other_filter != filter: uniq |= ~other_sel uniq = ~sel & ~uniq & passing_pre - print(f"{filter[4:]:<{w_str}} : {(~sel & passing_pre).sum():>{w_num}} {uniq.sum():>{w_num}}") + print( + f"{filter[4:]:<{w_str}} : {(~sel & passing_pre).sum():>{w_num}} {uniq.sum():>{w_num}}" + ) print("=" * total_width) print() print("\nPost-computation filtering results") print("=" * total_width) print(f"{'criterium':>{w_str}} : {'filtered':<{w_num}} {'unique':<{w_num}}") - for (filter,crit), sel in sels_post.items(): + for (filter, crit), sel in sels_post.items(): uniq = pd.Series(np.full((len(sel),), False)) for other_filter, other_sel in sels_all_post.items(): if other_filter != filter: uniq |= ~other_sel uniq = ~sel & ~uniq & passing_pre - s = f"{filter}{'':<{w_str-(len(filter)+len(crit))}}{crit}" + s = f"{filter}{'':<{w_str - (len(filter) + len(crit))}}{crit}" print(f"{s} : {(~sel & passing_pre).sum():>{w_num}} {uniq.sum():>{w_num}}") print("-" * total_width) - passing_post = df['pass_post'] - print(f"{'total filtered':<{w_str}} : {(~passing_post & passing_pre).sum():>{w_num}} of {passing_pre.sum():>{w_num-3}} ({(~passing_post & passing_pre).sum() / passing_pre.sum() * 100.:>{6}.2f} %)") + passing_post = df["pass_post"] + print( + f"{'total filtered':<{w_str}} : {(~passing_post & passing_pre).sum():>{w_num}} of {passing_pre.sum():>{w_num - 3}} ({(~passing_post & passing_pre).sum() / passing_pre.sum() * 100.0:>{6}.2f} %)" + ) print("=" * total_width) print() - print(f"{'final dataset entries':<{w_str}} : {(passing_post).sum():>{w_num}} of {len(df):>{w_num-3}} ({(passing_post).sum() / len(df) * 100.:>{6}.2f} %)") + print( + f"{'final dataset entries':<{w_str}} : {(passing_post).sum():>{w_num}} of {len(df):>{w_num - 3}} ({(passing_post).sum() / len(df) * 100.0:>{6}.2f} %)" + ) -def fill_row_data(row, chemical_denaturants, keywords, - return_default=True, assume_si=True, fix_outliers=True, - include_shifts=False, no_shift_averaging=False): - entry = bmrb_entries.loc[row['entryID'], 'entry'] #row['entry'] + +def fill_row_data( + row, + chemical_denaturants, + keywords, + return_default=True, + assume_si=True, + fix_outliers=True, + include_shifts=False, + no_shift_averaging=False, +): + entry = bmrb_entries.loc[row["entryID"], "entry"] # row['entry'] peptide_shifts = entry.get_peptide_shifts() - shifts, condID, assemID, sampleIDs = peptide_shifts[(row['stID'], row['entity_assemID'], row['entityID'])] - row['citation_title'] = entry.citation_title - row['citation_DOI'] = entry.citation_DOI - row['exp_method'] = entry.exp_method if entry.exp_method else pd.NA - row['exp_method_subtype'] = entry.exp_method_subtype if entry.exp_method_subtype else pd.NA - row['entity_name'] = entry.entities[row['entityID']].name - row['ionic_strength'] = entry.conditions[condID].get_ionic_strength(return_default=return_default, assume_si=assume_si, fix_outliers=fix_outliers) - row['pH'] = entry.conditions[condID].get_pH(return_default=return_default) - row['temperature'] = entry.conditions[condID].get_temperature(return_default=return_default, assume_si=assume_si, fix_outliers=fix_outliers) - seq = entry.entities[row['entityID']].seq - row['seq'] = seq + shifts, condID, assemID, sampleIDs = peptide_shifts[ + (row["stID"], row["entity_assemID"], row["entityID"]) + ] + row["citation_title"] = entry.citation_title + row["citation_DOI"] = entry.citation_DOI + row["exp_method"] = entry.exp_method if entry.exp_method else pd.NA + row["exp_method_subtype"] = entry.exp_method_subtype if entry.exp_method_subtype else pd.NA + row["entity_name"] = entry.entities[row["entityID"]].name + row["ionic_strength"] = entry.conditions[condID].get_ionic_strength( + return_default=return_default, assume_si=assume_si, fix_outliers=fix_outliers + ) + row["pH"] = entry.conditions[condID].get_ph(return_default=return_default) + row["temperature"] = entry.conditions[condID].get_temperature( + return_default=return_default, assume_si=assume_si, fix_outliers=fix_outliers + ) + seq = entry.entities[row["entityID"]].seq + row["seq"] = seq # retrieve # backbone shifts (H,HA,HB,C,CA,CB,N) - total_bbshifts, bbshift_types, bbshift_positions, bbshifts_arr = None, None, None, None + total_bbshifts, bbshift_types, bbshift_positions, bbshifts_arr = ( + None, + None, + None, + None, + ) if seq: ret = bmrb.get_valid_bbshifts(shifts, seq) if ret: bbshifts_arr, bbshifts_mask = ret if len(bbshifts_mask) >= 2: # backbone shift of terminal amino acids are not counted - total_bbshifts = np.sum(bbshifts_mask[1:-1]) # total backbone shifts - bbshift_types = np.any(bbshifts_mask, axis=0).sum() # different backbone shifts - bbshift_positions = np.any(bbshifts_mask, axis=1).sum() # positions with backbone shifts + total_bbshifts = np.sum(bbshifts_mask[1:-1]) # total backbone shifts + bbshift_types = np.any(bbshifts_mask, axis=0).sum() # different backbone shifts + bbshift_positions = np.any( + bbshifts_mask, axis=1 + ).sum() # positions with backbone shifts if include_shifts: if no_shift_averaging: - bbshifts_arr, bbshifts_mask = bmrb.get_valid_bbshifts(shifts, seq, averaging=False) + bbshifts_arr, bbshifts_mask = bmrb.get_valid_bbshifts( + shifts, seq, averaging=False + ) bbshifts_arr[~bbshifts_mask] = np.nan else: total_bbshifts = 0 bbshifts_arr = None bbshift_types = 0 bbshift_positions = 0 - row['total_bbshifts'] = total_bbshifts - row['bbshift_types'] = bbshift_types - row['bbshift_positions'] = bbshift_positions + row["total_bbshifts"] = total_bbshifts + row["bbshift_types"] = bbshift_types + row["bbshift_positions"] = bbshift_positions if include_shifts: - row['bbshifts'] = bbshifts_arr + row["bbshifts"] = bbshifts_arr # check if keywords are present - fields = [entry.title, entry.details, entry.citation_title, - entry.assemblies[assemID].name, entry.assemblies[assemID].details, - entry.entities[row['entityID']].name, entry.entities[row['entityID']].details] + fields = [ + entry.title, + entry.details, + entry.citation_title, + entry.assemblies[assemID].name, + entry.assemblies[assemID].details, + entry.entities[row["entityID"]].name, + entry.entities[row["entityID"]].details, + ] if entry.citation_keywords is not None: - if type(entry.citation_keywords) == list: + if isinstance(entry.citation_keywords, list): for el in entry.citation_keywords: fields.extend(el) else: fields.extend(entry.citation_keywords) if entry.struct_keywords is not None: - if type(entry.struct_keywords) == list: + if isinstance(entry.struct_keywords, list): for el in entry.struct_keywords: fields.extend(el) else: fields.extend(entry.struct_keywords) for sID in sampleIDs: - fields.extend([entry.samples[sID].name, entry.samples[sID].details, entry.samples[sID].framecode]) + fields.extend( + [ + entry.samples[sID].name, + entry.samples[sID].details, + entry.samples[sID].framecode, + ] + ) for keyword in keywords: row[keyword] = False for field in fields: - if field: # can be None - if keyword.lower() in field.lower(): - row[keyword] = True - break + if field and keyword.lower() in field.lower(): # field can be None + row[keyword] = True + break # check if chemical detergents are present for den_comp in chemical_denaturants: row[den_comp] = False @@ -537,182 +752,340 @@ def fill_row_data(row, chemical_denaturants, keywords, try: for sID in sampleIDs: for comp in entry.samples[sID].components: - if comp[3] and not comp[2]: # if it has a name but no entity entry - if den_comp.lower() in comp[3].lower(): - row[den_comp] = True - raise Found - except Found: + if ( + comp[3] and not comp[2] and den_comp.lower() in comp[3].lower() + ): # if it has a name but no entity entry + row[den_comp] = True + raise FoundError + except FoundError: pass # add columns that will be filled later - row['scores'] = None - row['k'] = None - row['total_bbshifts_post'] = np.nan - row['bbshift_types_post'] = np.nan - row['bbshift_positions_post'] = np.nan + row["scores"] = None + row["k"] = None + row["total_bbshifts_post"] = np.nan + row["bbshift_types_post"] = np.nan + row["bbshift_positions_post"] = np.nan for at in BBATNS: - row[f'off_{at}'] = pd.NA + row[f"off_{at}"] = pd.NA return row -def create_peptide_dataframe(bmrb_entries, - chemical_denaturants, keywords, - return_default=True, assume_si=True, fix_outliers=True, - include_shifts=False, - no_shift_averaging=False, - progress=False - ): + +def create_peptide_dataframe( + bmrb_entries, + chemical_denaturants, + keywords, + return_default=True, + assume_si=True, + fix_outliers=True, + include_shifts=False, + no_shift_averaging=False, + progress=False, +): data = [] - columns = ['entryID', #'entry', - 'stID', 'entity_assemID', 'entityID' - ] + columns = [ + "entryID", #'entry', + "stID", + "entity_assemID", + "entityID", + ] it = tqdm(bmrb_entries.iterrows()) if progress else bmrb_entries.iterrows() - for id_,row in it: + for id_, row in it: peptide_shifts = row.entry.get_peptide_shifts() - for (stID, entity_assemID, entityID) in peptide_shifts: + for stID, entity_assemID, entityID in peptide_shifts: data.append([]) data[-1].append(id_) - #data[-1].append(entry) + # data[-1].append(entry) data[-1].extend([stID, entity_assemID, entityID]) df = pd.DataFrame(data, columns=columns) - df = df.parallel_apply(fill_row_data, axis=1, args=(chemical_denaturants, keywords), - return_default=return_default, assume_si=assume_si, fix_outliers=fix_outliers, - include_shifts=include_shifts, no_shift_averaging=no_shift_averaging) - df = df.astype({col : "string" for col in ['entryID', 'citation_title', 'citation_DOI', 'exp_method', 'exp_method_subtype', 'entity_name', 'seq']}) + df = df.parallel_apply( + fill_row_data, + axis=1, + args=(chemical_denaturants, keywords), + return_default=return_default, + assume_si=assume_si, + fix_outliers=fix_outliers, + include_shifts=include_shifts, + no_shift_averaging=no_shift_averaging, + ) + df = df.astype( + dict.fromkeys( + [ + "entryID", + "citation_title", + "citation_DOI", + "exp_method", + "exp_method_subtype", + "entity_name", + "seq", + ], + "string", + ) + ) return df -def compute_scores(entry, stID, entity_assemID, entityID, - seq, ion, pH, temperature, - score_types=['zscores'], offset_correction=True, - max_offset=np.inf, reject_shift_type_only=False, - #min_backbone_shift_types=1, min_backbone_shift_positions=1, min_backbone_shift_fraction=0., - cache_dir=None): + +def compute_scores( + entry, + stID, + entity_assemID, + entityID, + seq, + ion, + pH, + temperature, + score_types=None, + offset_correction=True, + max_offset=np.inf, + reject_shift_type_only=False, + # min_backbone_shift_types=1, min_backbone_shift_positions=1, min_backbone_shift_fraction=0., + cache_dir=None, +): + if score_types is None: + score_types = ["zscores"] exe_times = [np.nan, np.nan, np.nan] - wSCS_cache_fp = os.path.join(cache_dir, 'wSCS', f'{entry.id}_{stID}_{entity_assemID}_{entityID}.npz') + wSCS_cache_fp = os.path.join( + cache_dir, "wSCS", f"{entry.id}_{stID}_{entity_assemID}_{entityID}.npz" + ) if cache_dir and os.path.exists(wSCS_cache_fp): try: z = np.load(wSCS_cache_fp) - shw, ashwi, cmp_mask, olf, offf, shw0, ashwi0, ol0, off0 = z['shw'], z['ashwi'], z['cmp_mask'], z['olf'], z['offf'], z['shw0'], z['ashwi0'], z['ol0'], z['off0'] - offf, off0 = {at:off for at,off in zip(BBATNS, offf)}, {at:off for at,off in zip(BBATNS, off0)} - except: - logging.getLogger('trizod').debug(f"cache file {wSCS_cache_fp} corrupt or formatted wrong, delete and repeat computation") + shw, ashwi, cmp_mask, olf, offf, shw0, ashwi0, ol0, off0 = ( + z["shw"], + z["ashwi"], + z["cmp_mask"], + z["olf"], + z["offf"], + z["shw0"], + z["ashwi0"], + z["ol0"], + z["off0"], + ) + offf, off0 = ( + dict(zip(BBATNS, offf)), + dict(zip(BBATNS, off0)), + ) + except Exception as e: + logging.getLogger("trizod").debug( + f"cache file {wSCS_cache_fp} corrupt or formatted wrong, delete and repeat computation: {e}" + ) os.remove(wSCS_cache_fp) if not (cache_dir and os.path.exists(wSCS_cache_fp)): peptide_shifts = entry.get_peptide_shifts() shifts, condID, assemID, sampleIDs = peptide_shifts[(stID, entity_assemID, entityID)] - + try: # predict random coil chemical shifts using POTENCI - usephcor = (pH != 7.0) + usephcor = pH != 7.0 start_time = time.time() - predshiftdct = potenci.getpredshifts(seq, temperature, pH, ion, usephcor, pkacsvfile=False) + predshiftdct = potenci.getpredshifts( + seq, temperature, pH, ion, usephcor, pkacsvfile=False + ) exe_times[0] = time.time() - start_time - except: - logging.getLogger('trizod').error(f"POTENCI failed for {(entry.id, stID, entity_assemID, entityID)} due to the following error:", exc_info=True) - raise ZscoreComputationError + except Exception as e: + logging.getLogger("trizod").error( + f"POTENCI failed for {(entry.id, stID, entity_assemID, entityID)} due to the following error:", + exc_info=True, + ) + raise ZscoreComputationError from e start_time = time.time() - ret = scoring.get_offset_corrected_wSCS(seq, shifts, predshiftdct) + ret = scoring.get_offset_corrected_wscs(seq, shifts, predshiftdct) if ret is None: - logging.getLogger('trizod').error(f'TriZOD failed for {(entry.id, stID, entity_assemID, entityID)} due to an error in computation of corrected wSCSs.') + logging.getLogger("trizod").error( + f"TriZOD failed for {(entry.id, stID, entity_assemID, entityID)} due to an error in computation of corrected wSCSs." + ) raise ZscoreComputationError else: exe_times[1] = time.time() - start_time shw, ashwi, cmp_mask, olf, offf, shw0, ashwi0, ol0, off0 = ret if cache_dir: - np.savez(wSCS_cache_fp, - shw=shw, ashwi=ashwi, cmp_mask=cmp_mask, - olf=olf, offf=np.array([offf[at] for at in BBATNS]), - shw0=shw0, ashwi0=ashwi0, ol0=ol0, off0=np.array([off0[at] for at in BBATNS])) + np.savez( + wSCS_cache_fp, + shw=shw, + ashwi=ashwi, + cmp_mask=cmp_mask, + olf=olf, + offf=np.array([offf[at] for at in BBATNS]), + shw0=shw0, + ashwi0=ashwi0, + ol0=ol0, + off0=np.array([off0[at] for at in BBATNS]), + ) offsets = offf - if offset_correction == False: + if not offset_correction: ashwi = ashwi0 offsets = off0 - elif not (max_offset == None or np.isinf(max_offset)): + elif not (max_offset is None or np.isinf(max_offset)): # check if any offsets are too large - for i,at in enumerate(BBATNS): + for i, at in enumerate(BBATNS): if np.abs(offf[at]) > max_offset: offsets[at] = np.nan if reject_shift_type_only: # mask data related to this backbone shift type, excluding it from scores computation - cmp_mask[:,i] = False + cmp_mask[:, i] = False if np.any(cmp_mask): start_time = time.time() ashwi3, k3 = scoring.convert_to_triplet_data(ashwi, cmp_mask) scores = [] for score_type in score_types: - if 'corrected' == score_type: + if score_type == "corrected": scores.append(scoring.compute_zscores(ashwi3, k3, cmp_mask, corr=True)) - elif 'zscores' == score_type: + elif score_type == "zscores": scores.append(scoring.compute_zscores(ashwi3, k3, cmp_mask)) - elif 'pscores' == score_type: + elif score_type == "pscores": scores.append(scoring.compute_pscores(ashwi3, k3, cmp_mask)) else: raise ValueError k = k3 exe_times[2] = time.time() - start_time else: - scores, k = [np.full((cmp_mask.shape[0],), np.nan) for i in range(len(score_types))], np.full((cmp_mask.shape[0],), np.nan) + scores, k = ( + [np.full((cmp_mask.shape[0],), np.nan) for i in range(len(score_types))], + np.full((cmp_mask.shape[0],), np.nan), + ) return scores, k, cmp_mask, offsets, exe_times -def compute_scores_row(row, score_types=['zscores'], offset_correction=True, - max_offset=np.inf, reject_shift_type_only=False, - cache_dir=None): - if not row['pass_pre']: + +def compute_scores_row( + row, + score_types=None, + offset_correction=True, + max_offset=np.inf, + reject_shift_type_only=False, + cache_dir=None, +): + if score_types is None: + score_types = ["zscores"] + if not row["pass_pre"]: return row try: start_time = time.time() scores, k, cmp_mask, offsets, exe_times = compute_scores( - bmrb_entries.loc[row['entryID'], 'entry'], row['stID'], row['entity_assemID'], row['entityID'], - row['seq'], row['ionic_strength'], row['pH'], row['temperature'], - score_types=score_types, offset_correction=offset_correction, - max_offset=max_offset, reject_shift_type_only=reject_shift_type_only, - cache_dir=cache_dir) + bmrb_entries.loc[row["entryID"], "entry"], + row["stID"], + row["entity_assemID"], + row["entityID"], + row["seq"], + row["ionic_strength"], + row["pH"], + row["temperature"], + score_types=score_types, + offset_correction=offset_correction, + max_offset=max_offset, + reject_shift_type_only=reject_shift_type_only, + cache_dir=cache_dir, + ) for score_type, scores_ in zip(score_types, scores): row[score_type] = scores_ - row['k'] = k - #row['cmp_mask'] = cmp_mask + row["k"] = k + # row['cmp_mask'] = cmp_mask for at in BBATNS: - row[f'off_{at}'] = offsets[at] - row['total_bbshifts_post'] = np.sum(cmp_mask) - row['bbshift_types_post'] = np.any(cmp_mask, axis=0).sum() - row['bbshift_positions_post'] = np.any(cmp_mask, axis=1).sum() - row['tpotenci'] = exe_times[0] - row['ttrizod'] = exe_times[1] - row['tscores'] = exe_times[2] - row['ttotal'] = time.time() - start_time + row[f"off_{at}"] = offsets[at] + row["total_bbshifts_post"] = np.sum(cmp_mask) + row["bbshift_types_post"] = np.any(cmp_mask, axis=0).sum() + row["bbshift_positions_post"] = np.any(cmp_mask, axis=1).sum() + row["tpotenci"] = exe_times[0] + row["ttrizod"] = exe_times[1] + row["tscores"] = exe_times[2] + row["ttotal"] = time.time() - start_time except ZscoreComputationError: pass return row -def output_dataset(df, output_prefix, output_format, score_types, precision, include_shifts, no_shift_averaging): - df['ID'] = df['entryID']+'_'+df['stID']+'_'+df['entity_assemID']+'_'+df['entityID'] + +def output_dataset( + df, + output_prefix, + output_format, + score_types, + precision, + include_shifts, + no_shift_averaging, +): + df["ID"] = df["entryID"] + "_" + df["stID"] + "_" + df["entity_assemID"] + "_" + df["entityID"] for score_type in score_types: - df.loc[df.pass_post, score_type] = df.loc[df.pass_post, score_type].apply(np.round, args=(precision,)) + df.loc[df.pass_post, score_type] = df.loc[df.pass_post, score_type].apply( + np.round, args=(precision,) + ) shifts = [] if include_shifts: if no_shift_averaging: - shifts = BBATNS + ['HA2', 'HA3' ,'HB1', 'HB2', 'HB3'] - for i,at in enumerate(shifts): - df.loc[df.pass_post, at] = df.loc[df.pass_post, 'bbshifts'].apply(lambda x: x[:,i]) + shifts = BBATNS + ["HA2", "HA3", "HB1", "HB2", "HB3"] + for i, at in enumerate(shifts): + df.loc[df.pass_post, at] = df.loc[df.pass_post, "bbshifts"].apply( + lambda x, idx=i: x[:, idx] + ) df.loc[df.pass_post, at] = df.loc[df.pass_post, at].apply(np.round, args=(precision,)) - if output_format == 'csv': - df.loc[df.pass_post, 'seq'] = df[df.pass_post].seq.apply(lambda x: list(x)) - dout = df.loc[df.pass_post].reset_index()[['ID', 'entryID', 'stID', 'entity_assemID', 'entityID', 'entity_name', 'seq', 'k'] + score_types + shifts] - dout['seq'] = dout.seq.apply(lambda x: list(x)) - dout['seq_index'] = dout.seq.apply(lambda x: list(range(1,len(x)+1))) - dout = dout.explode(['seq_index', 'seq', 'k'] + score_types + shifts) - dout[['ID', 'entryID', 'stID', 'entity_assemID', 'entityID', 'entity_name', 'seq_index', 'seq', 'k'] + score_types + shifts]\ - .to_csv(output_prefix + '.csv', - float_format='%.{}f'.format(precision)) - elif output_format == 'json': - dout = df.loc[df.pass_post].reset_index()[['ID', 'entryID', 'stID', 'entity_assemID', 'entityID', - 'entity_name', 'exp_method', 'exp_method_subtype', 'citation_DOI', 'citation_title', - 'ionic_strength', 'pH', 'temperature', - 'off_C', 'off_CA', 'off_CB', 'off_H', 'off_HA', 'off_HB', 'off_N', - 'bbshift_positions_post', 'bbshift_types_post', 'total_bbshifts', - 'seq', 'k'] + score_types + shifts] - dout.to_json(output_prefix + '.json', orient='records', lines=True) + if output_format == "csv": + df.loc[df.pass_post, "seq"] = df[df.pass_post].seq.apply(lambda x: list(x)) + dout = df.loc[df.pass_post].reset_index()[ + [ + "ID", + "entryID", + "stID", + "entity_assemID", + "entityID", + "entity_name", + "seq", + "k", + ] + + score_types + + shifts + ] + dout["seq"] = dout.seq.apply(lambda x: list(x)) + dout["seq_index"] = dout.seq.apply(lambda x: list(range(1, len(x) + 1))) + dout = dout.explode(["seq_index", "seq", "k"] + score_types + shifts) + dout[ + [ + "ID", + "entryID", + "stID", + "entity_assemID", + "entityID", + "entity_name", + "seq_index", + "seq", + "k", + ] + + score_types + + shifts + ].to_csv(output_prefix + ".csv", float_format=f"%.{precision}f") + elif output_format == "json": + dout = df.loc[df.pass_post].reset_index()[ + [ + "ID", + "entryID", + "stID", + "entity_assemID", + "entityID", + "entity_name", + "exp_method", + "exp_method_subtype", + "citation_DOI", + "citation_title", + "ionic_strength", + "pH", + "temperature", + "off_C", + "off_CA", + "off_CB", + "off_H", + "off_HA", + "off_HB", + "off_N", + "bbshift_positions_post", + "bbshift_types_post", + "total_bbshifts", + "seq", + "k", + ] + + score_types + + shifts + ] + dout.to_json(output_prefix + ".json", orient="records", lines=True) else: raise ValueError(f"Unknown output format: {output_format}") + def main(): args = parse_args() if args.processes is None: @@ -720,32 +1093,35 @@ def main(): else: pandarallel.initialize(verbose=0, nb_workers=args.processes, progress_bar=args.progress) level = logging.DEBUG if args.debug else logging.INFO - logging.basicConfig(level=level, format=f'%(levelname)s : %(message)s') + logging.basicConfig(level=level, format="%(levelname)s : %(message)s") # reject most logging messages for sub-routines like parsing database files: - logging.getLogger('trizod.bmrb').setLevel(logging.CRITICAL) - logging.getLogger('trizod.scoring').setLevel(logging.CRITICAL) + logging.getLogger("trizod.bmrb").setLevel(logging.CRITICAL) + logging.getLogger("trizod.scoring").setLevel(logging.CRITICAL) - logging.getLogger('trizod').info('Loading BMRB files.') + logging.getLogger("trizod").info("Loading BMRB files.") bmrb_files = find_bmrb_files(args.input_dir, args.BMRB_file_pattern) global bmrb_entries bmrb_entries, failed = load_bmrb_entries(bmrb_files, cache_dir=args.cache_dir) print() if failed: - logging.getLogger('trizod').warning(f"Failed loading {len(failed)} of {len(bmrb_files)} BMRB files") - logging.getLogger('trizod').info('Parsing and filtering relevant information.') + logging.getLogger("trizod").warning( + f"Failed loading {len(failed)} of {len(bmrb_files)} BMRB files" + ) + logging.getLogger("trizod").info("Parsing and filtering relevant information.") df = create_peptide_dataframe( - bmrb_entries, - chemical_denaturants=args.chemical_denaturants, - keywords=args.keywords_blacklist, - return_default=args.default_conditions, - assume_si=args.unit_assumptions, + bmrb_entries, + chemical_denaturants=args.chemical_denaturants, + keywords=args.keywords_blacklist, + return_default=args.default_conditions, + assume_si=args.unit_assumptions, fix_outliers=args.unit_corrections, include_shifts=args.include_shifts, no_shift_averaging=args.no_shift_averaging, - progress=args.progress) + progress=args.progress, + ) df, missing_vals, sels_pre, sels_kws, sels_denat, sels_all_pre = prefilter_dataframe( df, - method_whitelist=args.exp_method_whitelist, + method_whitelist=args.exp_method_whitelist, method_blacklist=args.exp_method_blacklist, temperature_range=args.temperature_range, ionic_strength_range=args.ionic_strength_range, @@ -757,29 +1133,53 @@ def main(): max_noncanonical_fraction=args.max_noncanonical_fraction, max_x_fraction=args.max_x_fraction, keywords=args.keywords_blacklist, - chemical_denaturants=args.chemical_denaturants) + chemical_denaturants=args.chemical_denaturants, + ) print() - logging.getLogger('trizod').info('Computing scores for each remaining entry.') + logging.getLogger("trizod").info("Computing scores for each remaining entry.") df = df.parallel_apply( - compute_scores_row, axis=1, - score_types=args.score_types, - offset_correction=args.offset_correction, - max_offset=args.max_offset, + compute_scores_row, + axis=1, + score_types=args.score_types, + offset_correction=args.offset_correction, + max_offset=args.max_offset, reject_shift_type_only=args.reject_shift_type_only, - cache_dir=args.cache_dir) - if args.progress : print() # prevents overwriting last line of progress bars - logging.getLogger('trizod').info('Filtering results.') + cache_dir=args.cache_dir, + ) + if args.progress: + print() # prevents overwriting last line of progress bars + logging.getLogger("trizod").info("Filtering results.") sels_post, sels_off, sels_all_post = postfilter_dataframe( df, min_backbone_shift_types=args.min_backbone_shift_types, min_backbone_shift_positions=args.min_backbone_shift_positions, min_backbone_shift_fraction=args.min_backbone_shift_fraction, reject_shift_type_only=args.reject_shift_type_only, - score_types=args.score_types) - logging.getLogger('trizod').info('Output filtering results.') - print_filter_losses(df, missing_vals, sels_pre, sels_kws, sels_denat, sels_all_pre, sels_post, sels_off, sels_all_post) - logging.getLogger('trizod').info('Writing dataset to file.') - output_dataset(df, args.output_prefix, args.output_format, args.score_types, args.precision, args.include_shifts, args.no_shift_averaging) - -if __name__ == '__main__': - main() \ No newline at end of file + score_types=args.score_types, + ) + logging.getLogger("trizod").info("Output filtering results.") + print_filter_losses( + df, + missing_vals, + sels_pre, + sels_kws, + sels_denat, + sels_all_pre, + sels_post, + sels_off, + sels_all_post, + ) + logging.getLogger("trizod").info("Writing dataset to file.") + output_dataset( + df, + args.output_prefix, + args.output_format, + args.score_types, + args.precision, + args.include_shifts, + args.no_shift_averaging, + ) + + +if __name__ == "__main__": + main() diff --git a/trizod/utils.py b/trizod/utils.py index 62f08b7..7740af3 100644 --- a/trizod/utils.py +++ b/trizod/utils.py @@ -1,16 +1,20 @@ import argparse + class ArgHelpFormatter(argparse.HelpFormatter): - ''' + """ Formatter adding default values to help texts. - ''' + """ + def __init__(self, prog): super().__init__(prog) def _get_help_string(self, action): text = action.help - if action.default is not None and \ - action.default != argparse.SUPPRESS and \ - 'default:' not in text.lower(): - text += ' (default: {})'.format(action.default) - return text \ No newline at end of file + if ( + action.default is not None + and action.default != argparse.SUPPRESS + and "default:" not in text.lower() + ): + text += f" (default: {action.default})" + return text diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..49421f5 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1764 @@ +version = 1 +revision = 3 +requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version < '3.10'", +] + +[[package]] +name = "certifi" +version = "2025.10.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, + { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, + { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, + { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, + { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, + { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, + { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, + { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload-time = "2025-10-14T04:42:10.922Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload-time = "2025-10-14T04:42:12.38Z" }, + { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload-time = "2025-10-14T04:42:13.549Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload-time = "2025-10-14T04:42:14.892Z" }, + { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload-time = "2025-10-14T04:42:16.676Z" }, + { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload-time = "2025-10-14T04:42:17.917Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload-time = "2025-10-14T04:42:19.018Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload-time = "2025-10-14T04:42:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload-time = "2025-10-14T04:42:21.324Z" }, + { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload-time = "2025-10-14T04:42:22.46Z" }, + { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload-time = "2025-10-14T04:42:23.712Z" }, + { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload-time = "2025-10-14T04:42:24.87Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload-time = "2025-10-14T04:42:27.246Z" }, + { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload-time = "2025-10-14T04:42:28.425Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload-time = "2025-10-14T04:42:29.482Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload-time = "2025-10-14T04:42:30.632Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/f6/31a8f28b4a2a4fa0e01085e542f3081ab0588eff8e589d39d775172c9792/contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", size = 13464370, upload-time = "2024-08-27T21:00:03.328Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/e0/be8dcc796cfdd96708933e0e2da99ba4bb8f9b2caa9d560a50f3f09a65f3/contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", size = 265366, upload-time = "2024-08-27T20:50:09.947Z" }, + { url = "https://files.pythonhosted.org/packages/50/d6/c953b400219443535d412fcbbc42e7a5e823291236bc0bb88936e3cc9317/contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", size = 249226, upload-time = "2024-08-27T20:50:16.1Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b4/6fffdf213ffccc28483c524b9dad46bb78332851133b36ad354b856ddc7c/contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", size = 308460, upload-time = "2024-08-27T20:50:22.536Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6c/118fc917b4050f0afe07179a6dcbe4f3f4ec69b94f36c9e128c4af480fb8/contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", size = 347623, upload-time = "2024-08-27T20:50:28.806Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a4/30ff110a81bfe3abf7b9673284d21ddce8cc1278f6f77393c91199da4c90/contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", size = 317761, upload-time = "2024-08-27T20:50:35.126Z" }, + { url = "https://files.pythonhosted.org/packages/99/e6/d11966962b1aa515f5586d3907ad019f4b812c04e4546cc19ebf62b5178e/contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", size = 322015, upload-time = "2024-08-27T20:50:40.318Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e3/182383743751d22b7b59c3c753277b6aee3637049197624f333dac5b4c80/contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", size = 1262672, upload-time = "2024-08-27T20:50:55.643Z" }, + { url = "https://files.pythonhosted.org/packages/78/53/974400c815b2e605f252c8fb9297e2204347d1755a5374354ee77b1ea259/contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", size = 1321688, upload-time = "2024-08-27T20:51:11.293Z" }, + { url = "https://files.pythonhosted.org/packages/52/29/99f849faed5593b2926a68a31882af98afbeac39c7fdf7de491d9c85ec6a/contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", size = 171145, upload-time = "2024-08-27T20:51:15.2Z" }, + { url = "https://files.pythonhosted.org/packages/a9/97/3f89bba79ff6ff2b07a3cbc40aa693c360d5efa90d66e914f0ff03b95ec7/contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", size = 216019, upload-time = "2024-08-27T20:51:19.365Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", size = 266356, upload-time = "2024-08-27T20:51:24.146Z" }, + { url = "https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", size = 250915, upload-time = "2024-08-27T20:51:28.683Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", size = 310443, upload-time = "2024-08-27T20:51:33.675Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c2/1a612e475492e07f11c8e267ea5ec1ce0d89971be496c195e27afa97e14a/contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", size = 348548, upload-time = "2024-08-27T20:51:39.322Z" }, + { url = "https://files.pythonhosted.org/packages/45/cf/2c2fc6bb5874158277b4faf136847f0689e1b1a1f640a36d76d52e78907c/contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", size = 319118, upload-time = "2024-08-27T20:51:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", size = 323162, upload-time = "2024-08-27T20:51:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/42/80/e637326e85e4105a802e42959f56cff2cd39a6b5ef68d5d9aee3ea5f0e4c/contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", size = 1265396, upload-time = "2024-08-27T20:52:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/8cbd6416ca1bbc0202b50f9c13b2e0b922b64be888f9d9ee88e6cfabfb51/contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", size = 1324297, upload-time = "2024-08-27T20:52:21.843Z" }, + { url = "https://files.pythonhosted.org/packages/4d/2c/021a7afaa52fe891f25535506cc861c30c3c4e5a1c1ce94215e04b293e72/contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", size = 171808, upload-time = "2024-08-27T20:52:25.163Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", size = 217181, upload-time = "2024-08-27T20:52:29.13Z" }, + { url = "https://files.pythonhosted.org/packages/c9/92/8e0bbfe6b70c0e2d3d81272b58c98ac69ff1a4329f18c73bd64824d8b12e/contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f", size = 267838, upload-time = "2024-08-27T20:52:33.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/04/33351c5d5108460a8ce6d512307690b023f0cfcad5899499f5c83b9d63b1/contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6", size = 251549, upload-time = "2024-08-27T20:52:39.179Z" }, + { url = "https://files.pythonhosted.org/packages/51/3d/aa0fe6ae67e3ef9f178389e4caaaa68daf2f9024092aa3c6032e3d174670/contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639", size = 303177, upload-time = "2024-08-27T20:52:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/56/c3/c85a7e3e0cab635575d3b657f9535443a6f5d20fac1a1911eaa4bbe1aceb/contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c", size = 341735, upload-time = "2024-08-27T20:52:51.05Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8d/20f7a211a7be966a53f474bc90b1a8202e9844b3f1ef85f3ae45a77151ee/contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06", size = 314679, upload-time = "2024-08-27T20:52:58.473Z" }, + { url = "https://files.pythonhosted.org/packages/6e/be/524e377567defac0e21a46e2a529652d165fed130a0d8a863219303cee18/contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09", size = 320549, upload-time = "2024-08-27T20:53:06.593Z" }, + { url = "https://files.pythonhosted.org/packages/0f/96/fdb2552a172942d888915f3a6663812e9bc3d359d53dafd4289a0fb462f0/contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd", size = 1263068, upload-time = "2024-08-27T20:53:23.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/25/632eab595e3140adfa92f1322bf8915f68c932bac468e89eae9974cf1c00/contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", size = 1322833, upload-time = "2024-08-27T20:53:39.243Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/69738782e315a1d26d29d71a550dbbe3eb6c653b028b150f70c1a5f4f229/contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", size = 172681, upload-time = "2024-08-27T20:53:43.05Z" }, + { url = "https://files.pythonhosted.org/packages/0c/89/9830ba00d88e43d15e53d64931e66b8792b46eb25e2050a88fec4a0df3d5/contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", size = 218283, upload-time = "2024-08-27T20:53:47.232Z" }, + { url = "https://files.pythonhosted.org/packages/53/a1/d20415febfb2267af2d7f06338e82171824d08614084714fb2c1dac9901f/contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", size = 267879, upload-time = "2024-08-27T20:53:51.597Z" }, + { url = "https://files.pythonhosted.org/packages/aa/45/5a28a3570ff6218d8bdfc291a272a20d2648104815f01f0177d103d985e1/contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", size = 251573, upload-time = "2024-08-27T20:53:55.659Z" }, + { url = "https://files.pythonhosted.org/packages/39/1c/d3f51540108e3affa84f095c8b04f0aa833bb797bc8baa218a952a98117d/contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", size = 303184, upload-time = "2024-08-27T20:54:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/00/56/1348a44fb6c3a558c1a3a0cd23d329d604c99d81bf5a4b58c6b71aab328f/contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", size = 340262, upload-time = "2024-08-27T20:54:05.234Z" }, + { url = "https://files.pythonhosted.org/packages/2b/23/00d665ba67e1bb666152131da07e0f24c95c3632d7722caa97fb61470eca/contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", size = 313806, upload-time = "2024-08-27T20:54:09.889Z" }, + { url = "https://files.pythonhosted.org/packages/5a/42/3cf40f7040bb8362aea19af9a5fb7b32ce420f645dd1590edcee2c657cd5/contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", size = 319710, upload-time = "2024-08-27T20:54:14.536Z" }, + { url = "https://files.pythonhosted.org/packages/05/32/f3bfa3fc083b25e1a7ae09197f897476ee68e7386e10404bdf9aac7391f0/contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", size = 1264107, upload-time = "2024-08-27T20:54:29.735Z" }, + { url = "https://files.pythonhosted.org/packages/1c/1e/1019d34473a736664f2439542b890b2dc4c6245f5c0d8cdfc0ccc2cab80c/contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", size = 1322458, upload-time = "2024-08-27T20:54:45.507Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/4f8bfd83972cf8909a4d36d16b177f7b8bdd942178ea4bf877d4a380a91c/contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", size = 172643, upload-time = "2024-08-27T20:55:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4a/fb3c83c1baba64ba90443626c228ca14f19a87c51975d3b1de308dd2cf08/contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", size = 218301, upload-time = "2024-08-27T20:55:56.509Z" }, + { url = "https://files.pythonhosted.org/packages/76/65/702f4064f397821fea0cb493f7d3bc95a5d703e20954dce7d6d39bacf378/contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", size = 278972, upload-time = "2024-08-27T20:54:50.347Z" }, + { url = "https://files.pythonhosted.org/packages/80/85/21f5bba56dba75c10a45ec00ad3b8190dbac7fd9a8a8c46c6116c933e9cf/contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", size = 263375, upload-time = "2024-08-27T20:54:54.909Z" }, + { url = "https://files.pythonhosted.org/packages/0a/64/084c86ab71d43149f91ab3a4054ccf18565f0a8af36abfa92b1467813ed6/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", size = 307188, upload-time = "2024-08-27T20:55:00.184Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/d61a4c288dc42da0084b8d9dc2aa219a850767165d7d9a9c364ff530b509/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", size = 345644, upload-time = "2024-08-27T20:55:05.673Z" }, + { url = "https://files.pythonhosted.org/packages/ca/aa/00d2313d35ec03f188e8f0786c2fc61f589306e02fdc158233697546fd58/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", size = 317141, upload-time = "2024-08-27T20:55:11.047Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6a/b5242c8cb32d87f6abf4f5e3044ca397cb1a76712e3fa2424772e3ff495f/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", size = 323469, upload-time = "2024-08-27T20:55:15.914Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a6/73e929d43028a9079aca4bde107494864d54f0d72d9db508a51ff0878593/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", size = 1260894, upload-time = "2024-08-27T20:55:31.553Z" }, + { url = "https://files.pythonhosted.org/packages/2b/1e/1e726ba66eddf21c940821df8cf1a7d15cb165f0682d62161eaa5e93dae1/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", size = 1314829, upload-time = "2024-08-27T20:55:47.837Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e3/b9f72758adb6ef7397327ceb8b9c39c75711affb220e4f53c745ea1d5a9a/contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", size = 265518, upload-time = "2024-08-27T20:56:01.333Z" }, + { url = "https://files.pythonhosted.org/packages/ec/22/19f5b948367ab5260fb41d842c7a78dae645603881ea6bc39738bcfcabf6/contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", size = 249350, upload-time = "2024-08-27T20:56:05.432Z" }, + { url = "https://files.pythonhosted.org/packages/26/76/0c7d43263dd00ae21a91a24381b7e813d286a3294d95d179ef3a7b9fb1d7/contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", size = 309167, upload-time = "2024-08-27T20:56:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/96/3b/cadff6773e89f2a5a492c1a8068e21d3fccaf1a1c1df7d65e7c8e3ef60ba/contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", size = 348279, upload-time = "2024-08-27T20:56:15.41Z" }, + { url = "https://files.pythonhosted.org/packages/e1/86/158cc43aa549d2081a955ab11c6bdccc7a22caacc2af93186d26f5f48746/contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", size = 318519, upload-time = "2024-08-27T20:56:21.813Z" }, + { url = "https://files.pythonhosted.org/packages/05/11/57335544a3027e9b96a05948c32e566328e3a2f84b7b99a325b7a06d2b06/contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", size = 321922, upload-time = "2024-08-27T20:56:26.983Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/02114f96543f4a1b694333b92a6dcd4f8eebbefcc3a5f3bbb1316634178f/contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", size = 1258017, upload-time = "2024-08-27T20:56:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3b/bfe4c81c6d5881c1c643dde6620be0b42bf8aab155976dd644595cfab95c/contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", size = 1316773, upload-time = "2024-08-27T20:56:58.58Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/c52d2970784383cafb0bd918b6fb036d98d96bbf0bc1befb5d1e31a07a70/contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", size = 171353, upload-time = "2024-08-27T20:57:02.718Z" }, + { url = "https://files.pythonhosted.org/packages/53/23/db9f69676308e094d3c45f20cc52e12d10d64f027541c995d89c11ad5c75/contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", size = 211817, upload-time = "2024-08-27T20:57:06.328Z" }, + { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886, upload-time = "2024-08-27T20:57:10.863Z" }, + { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008, upload-time = "2024-08-27T20:57:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690, upload-time = "2024-08-27T20:57:19.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/dc3dcd77ac7460ab7e9d2b01a618cb31406902e50e605a8d6091f0a8f7cc/contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", size = 261894, upload-time = "2024-08-27T20:57:23.873Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/531642a01cfec39d1682e46b5457b07cf805e3c3c584ec27e2a6223f8f6c/contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", size = 311099, upload-time = "2024-08-27T20:57:28.58Z" }, + { url = "https://files.pythonhosted.org/packages/38/1e/94bda024d629f254143a134eead69e21c836429a2a6ce82209a00ddcb79a/contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", size = 215838, upload-time = "2024-08-27T20:57:32.913Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +dependencies = [ + { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dill" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, +] + +[[package]] +name = "fonttools" +version = "4.60.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/42/97a13e47a1e51a5a7142475bbcf5107fe3a68fc34aef331c897d5fb98ad0/fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9", size = 3559823, upload-time = "2025-09-29T21:13:27.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/70/03e9d89a053caff6ae46053890eba8e4a5665a7c5638279ed4492e6d4b8b/fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28", size = 2810747, upload-time = "2025-09-29T21:10:59.653Z" }, + { url = "https://files.pythonhosted.org/packages/6f/41/449ad5aff9670ab0df0f61ee593906b67a36d7e0b4d0cd7fa41ac0325bf5/fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15", size = 2346909, upload-time = "2025-09-29T21:11:02.882Z" }, + { url = "https://files.pythonhosted.org/packages/9a/18/e5970aa96c8fad1cb19a9479cc3b7602c0c98d250fcdc06a5da994309c50/fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c", size = 4864572, upload-time = "2025-09-29T21:11:05.096Z" }, + { url = "https://files.pythonhosted.org/packages/ce/20/9b2b4051b6ec6689480787d506b5003f72648f50972a92d04527a456192c/fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea", size = 4794635, upload-time = "2025-09-29T21:11:08.651Z" }, + { url = "https://files.pythonhosted.org/packages/10/52/c791f57347c1be98f8345e3dca4ac483eb97666dd7c47f3059aeffab8b59/fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652", size = 4843878, upload-time = "2025-09-29T21:11:10.893Z" }, + { url = "https://files.pythonhosted.org/packages/69/e9/35c24a8d01644cee8c090a22fad34d5b61d1e0a8ecbc9945ad785ebf2e9e/fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a", size = 4954555, upload-time = "2025-09-29T21:11:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/f7/86/fb1e994971be4bdfe3a307de6373ef69a9df83fb66e3faa9c8114893d4cc/fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce", size = 2232019, upload-time = "2025-09-29T21:11:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/40/84/62a19e2bd56f0e9fb347486a5b26376bade4bf6bbba64dda2c103bd08c94/fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038", size = 2276803, upload-time = "2025-09-29T21:11:18.152Z" }, + { url = "https://files.pythonhosted.org/packages/ea/85/639aa9bface1537e0fb0f643690672dde0695a5bbbc90736bc571b0b1941/fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f", size = 2831872, upload-time = "2025-09-29T21:11:20.329Z" }, + { url = "https://files.pythonhosted.org/packages/6b/47/3c63158459c95093be9618794acb1067b3f4d30dcc5c3e8114b70e67a092/fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2", size = 2356990, upload-time = "2025-09-29T21:11:22.754Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/1934b537c86fcf99f9761823f1fc37a98fbd54568e8e613f29a90fed95a9/fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914", size = 5042189, upload-time = "2025-09-29T21:11:25.061Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d2/9f4e4c4374dd1daa8367784e1bd910f18ba886db1d6b825b12edf6db3edc/fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1", size = 4978683, upload-time = "2025-09-29T21:11:27.693Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c4/0fb2dfd1ecbe9a07954cc13414713ed1eab17b1c0214ef07fc93df234a47/fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d", size = 5021372, upload-time = "2025-09-29T21:11:30.257Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d5/495fc7ae2fab20223cc87179a8f50f40f9a6f821f271ba8301ae12bb580f/fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa", size = 5132562, upload-time = "2025-09-29T21:11:32.737Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fa/021dab618526323c744e0206b3f5c8596a2e7ae9aa38db5948a131123e83/fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258", size = 2230288, upload-time = "2025-09-29T21:11:35.015Z" }, + { url = "https://files.pythonhosted.org/packages/bb/78/0e1a6d22b427579ea5c8273e1c07def2f325b977faaf60bb7ddc01456cb1/fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf", size = 2278184, upload-time = "2025-09-29T21:11:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f7/a10b101b7a6f8836a5adb47f2791f2075d044a6ca123f35985c42edc82d8/fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc", size = 2832953, upload-time = "2025-09-29T21:11:39.616Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/7bd094b59c926acf2304d2151354ddbeb74b94812f3dc943c231db09cb41/fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877", size = 2352706, upload-time = "2025-09-29T21:11:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/4bb48a26ed95a1e7eba175535fe5805887682140ee0a0d10a88e1de84208/fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c", size = 4923716, upload-time = "2025-09-29T21:11:43.893Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9f/2cb82999f686c1d1ddf06f6ae1a9117a880adbec113611cc9d22b2fdd465/fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401", size = 4968175, upload-time = "2025-09-29T21:11:46.439Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/be569699e37d166b78e6218f2cde8c550204f2505038cdd83b42edc469b9/fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903", size = 4911031, upload-time = "2025-09-29T21:11:48.977Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9f/89411cc116effaec5260ad519162f64f9c150e5522a27cbb05eb62d0c05b/fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed", size = 5062966, upload-time = "2025-09-29T21:11:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/f888221934b5731d46cb9991c7a71f30cb1f97c0ef5fcf37f8da8fce6c8e/fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6", size = 2218750, upload-time = "2025-09-29T21:11:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/88/8f/a55b5550cd33cd1028601df41acd057d4be20efa5c958f417b0c0613924d/fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383", size = 2267026, upload-time = "2025-09-29T21:11:58.852Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb", size = 2825777, upload-time = "2025-09-29T21:12:01.22Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4", size = 2348080, upload-time = "2025-09-29T21:12:03.785Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c", size = 4903082, upload-time = "2025-09-29T21:12:06.382Z" }, + { url = "https://files.pythonhosted.org/packages/04/05/06b1455e4bc653fcb2117ac3ef5fa3a8a14919b93c60742d04440605d058/fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77", size = 4960125, upload-time = "2025-09-29T21:12:09.314Z" }, + { url = "https://files.pythonhosted.org/packages/8e/37/f3b840fcb2666f6cb97038793606bdd83488dca2d0b0fc542ccc20afa668/fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199", size = 4901454, upload-time = "2025-09-29T21:12:11.931Z" }, + { url = "https://files.pythonhosted.org/packages/fd/9e/eb76f77e82f8d4a46420aadff12cec6237751b0fb9ef1de373186dcffb5f/fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c", size = 5044495, upload-time = "2025-09-29T21:12:15.241Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b3/cede8f8235d42ff7ae891bae8d619d02c8ac9fd0cfc450c5927a6200c70d/fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272", size = 2217028, upload-time = "2025-09-29T21:12:17.96Z" }, + { url = "https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac", size = 2266200, upload-time = "2025-09-29T21:12:20.14Z" }, + { url = "https://files.pythonhosted.org/packages/9a/83/752ca11c1aa9a899b793a130f2e466b79ea0cf7279c8d79c178fc954a07b/fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3", size = 2822830, upload-time = "2025-09-29T21:12:24.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/17/bbeab391100331950a96ce55cfbbff27d781c1b85ebafb4167eae50d9fe3/fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85", size = 2345524, upload-time = "2025-09-29T21:12:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2e/d4831caa96d85a84dd0da1d9f90d81cec081f551e0ea216df684092c6c97/fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537", size = 4843490, upload-time = "2025-09-29T21:12:29.123Z" }, + { url = "https://files.pythonhosted.org/packages/49/13/5e2ea7c7a101b6fc3941be65307ef8df92cbbfa6ec4804032baf1893b434/fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003", size = 4944184, upload-time = "2025-09-29T21:12:31.414Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2b/cf9603551c525b73fc47c52ee0b82a891579a93d9651ed694e4e2cd08bb8/fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08", size = 4890218, upload-time = "2025-09-29T21:12:33.936Z" }, + { url = "https://files.pythonhosted.org/packages/fd/2f/933d2352422e25f2376aae74f79eaa882a50fb3bfef3c0d4f50501267101/fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99", size = 4999324, upload-time = "2025-09-29T21:12:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/38/99/234594c0391221f66216bc2c886923513b3399a148defaccf81dc3be6560/fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6", size = 2220861, upload-time = "2025-09-29T21:12:39.108Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1d/edb5b23726dde50fc4068e1493e4fc7658eeefcaf75d4c5ffce067d07ae5/fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987", size = 2270934, upload-time = "2025-09-29T21:12:41.339Z" }, + { url = "https://files.pythonhosted.org/packages/fb/da/1392aaa2170adc7071fe7f9cfd181a5684a7afcde605aebddf1fb4d76df5/fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299", size = 2894340, upload-time = "2025-09-29T21:12:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/bf/a7/3b9f16e010d536ce567058b931a20b590d8f3177b2eda09edd92e392375d/fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01", size = 2375073, upload-time = "2025-09-29T21:12:46.437Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/e9bcf51980f98e59bb5bb7c382a63c6f6cac0eec5f67de6d8f2322382065/fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801", size = 4849758, upload-time = "2025-09-29T21:12:48.694Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/1d2cf7d1cba82264b2f8385db3f5960e3d8ce756b4dc65b700d2c496f7e9/fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc", size = 5085598, upload-time = "2025-09-29T21:12:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/5d/4d/279e28ba87fb20e0c69baf72b60bbf1c4d873af1476806a7b5f2b7fac1ff/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc", size = 4957603, upload-time = "2025-09-29T21:12:53.423Z" }, + { url = "https://files.pythonhosted.org/packages/78/d4/ff19976305e0c05aa3340c805475abb00224c954d3c65e82c0a69633d55d/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed", size = 4974184, upload-time = "2025-09-29T21:12:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/63/22/8553ff6166f5cd21cfaa115aaacaa0dc73b91c079a8cfd54a482cbc0f4f5/fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259", size = 2282241, upload-time = "2025-09-29T21:12:58.179Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cb/fa7b4d148e11d5a72761a22e595344133e83a9507a4c231df972e657579b/fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c", size = 2345760, upload-time = "2025-09-29T21:13:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7f/1c9a6cc6e7374ab59bbe91cb3b8a65ce0907c59f8f35368bb3bf941bd458/fonttools-4.60.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2", size = 2816178, upload-time = "2025-09-29T21:13:02.915Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/acb4dcf1932566c0b57b5261f93a8b97cb3ebae08d07aff1288e7c9d7faa/fonttools-4.60.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036", size = 2349175, upload-time = "2025-09-29T21:13:05.432Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ac/0b2f8d62c857adfe96551d56abbbc3d2eda2e4715a2e91c5eb7815bb38e1/fonttools-4.60.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856", size = 4840452, upload-time = "2025-09-29T21:13:08.679Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/b2e2ae805f263507e050f1ebfc2fb3654124161f3bea466a1b2a4485c705/fonttools-4.60.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7", size = 4774040, upload-time = "2025-09-29T21:13:11.424Z" }, + { url = "https://files.pythonhosted.org/packages/9d/91/05949ba6f757014f343632b142543576eb100aeb261c036b86e7d1fc50f0/fonttools-4.60.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854", size = 4823746, upload-time = "2025-09-29T21:13:14.08Z" }, + { url = "https://files.pythonhosted.org/packages/1b/cf/db9a1bd8d835dc17f09104f83b9d8c078d7bebbaaa9bd41378bf10f025de/fonttools-4.60.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da", size = 4934001, upload-time = "2025-09-29T21:13:16.435Z" }, + { url = "https://files.pythonhosted.org/packages/87/4a/c58503524f7e6c73eb33b944f27535460e1050a58c99bd5b441242fcca86/fonttools-4.60.1-cp39-cp39-win32.whl", hash = "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a", size = 1499091, upload-time = "2025-09-29T21:13:19.072Z" }, + { url = "https://files.pythonhosted.org/packages/69/8f/3394936411aec5f26a1fdf8d7fdc1da7c276e0c627cd71b7b266b2431681/fonttools-4.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217", size = 1543835, upload-time = "2025-09-29T21:13:21.606Z" }, + { url = "https://files.pythonhosted.org/packages/c7/93/0dd45cd283c32dea1545151d8c3637b4b8c53cdb3a625aeb2885b184d74d/fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", size = 1143175, upload-time = "2025-09-29T21:13:24.134Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "importlib-resources" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/85/4d/2255e1c76304cbd60b48cee302b66d1dde4468dc5b1160e4b7cb43778f2a/kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", size = 97286, upload-time = "2024-09-04T09:39:44.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/14/fc943dd65268a96347472b4fbe5dcc2f6f55034516f80576cd0dd3a8930f/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", size = 122440, upload-time = "2024-09-04T09:03:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/1e/46/e68fed66236b69dd02fcdb506218c05ac0e39745d696d22709498896875d/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", size = 65758, upload-time = "2024-09-04T09:03:46.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fa/65de49c85838681fc9cb05de2a68067a683717321e01ddafb5b8024286f0/kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", size = 64311, upload-time = "2024-09-04T09:03:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/42/9c/cc8d90f6ef550f65443bad5872ffa68f3dee36de4974768628bea7c14979/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", size = 1637109, upload-time = "2024-09-04T09:03:49.281Z" }, + { url = "https://files.pythonhosted.org/packages/55/91/0a57ce324caf2ff5403edab71c508dd8f648094b18cfbb4c8cc0fde4a6ac/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", size = 1617814, upload-time = "2024-09-04T09:03:51.444Z" }, + { url = "https://files.pythonhosted.org/packages/12/5d/c36140313f2510e20207708adf36ae4919416d697ee0236b0ddfb6fd1050/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", size = 1400881, upload-time = "2024-09-04T09:03:53.357Z" }, + { url = "https://files.pythonhosted.org/packages/56/d0/786e524f9ed648324a466ca8df86298780ef2b29c25313d9a4f16992d3cf/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", size = 1512972, upload-time = "2024-09-04T09:03:55.082Z" }, + { url = "https://files.pythonhosted.org/packages/67/5a/77851f2f201e6141d63c10a0708e996a1363efaf9e1609ad0441b343763b/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", size = 1444787, upload-time = "2024-09-04T09:03:56.588Z" }, + { url = "https://files.pythonhosted.org/packages/06/5f/1f5eaab84355885e224a6fc8d73089e8713dc7e91c121f00b9a1c58a2195/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", size = 2199212, upload-time = "2024-09-04T09:03:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/b5/28/9152a3bfe976a0ae21d445415defc9d1cd8614b2910b7614b30b27a47270/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", size = 2346399, upload-time = "2024-09-04T09:04:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/f6/453d1904c52ac3b400f4d5e240ac5fec25263716723e44be65f4d7149d13/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", size = 2308688, upload-time = "2024-09-04T09:04:02.216Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/d4968499441b9ae187e81745e3277a8b4d7c60840a52dc9d535a7909fac3/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", size = 2445493, upload-time = "2024-09-04T09:04:04.571Z" }, + { url = "https://files.pythonhosted.org/packages/07/c9/032267192e7828520dacb64dfdb1d74f292765f179e467c1cba97687f17d/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", size = 2262191, upload-time = "2024-09-04T09:04:05.969Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ad/db0aedb638a58b2951da46ddaeecf204be8b4f5454df020d850c7fa8dca8/kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", size = 46644, upload-time = "2024-09-04T09:04:07.408Z" }, + { url = "https://files.pythonhosted.org/packages/12/ca/d0f7b7ffbb0be1e7c2258b53554efec1fd652921f10d7d85045aff93ab61/kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", size = 55877, upload-time = "2024-09-04T09:04:08.869Z" }, + { url = "https://files.pythonhosted.org/packages/97/6c/cfcc128672f47a3e3c0d918ecb67830600078b025bfc32d858f2e2d5c6a4/kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", size = 48347, upload-time = "2024-09-04T09:04:10.106Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77429fa0a58f941d6e1c58da9efe08597d2e86bf2b2cce6626834f49d07b/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", size = 122442, upload-time = "2024-09-04T09:04:11.432Z" }, + { url = "https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", size = 65762, upload-time = "2024-09-04T09:04:12.468Z" }, + { url = "https://files.pythonhosted.org/packages/f4/98/fe010f15dc7230f45bc4cf367b012d651367fd203caaa992fd1f5963560e/kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", size = 64319, upload-time = "2024-09-04T09:04:13.635Z" }, + { url = "https://files.pythonhosted.org/packages/8b/1b/b5d618f4e58c0675654c1e5051bcf42c776703edb21c02b8c74135541f60/kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", size = 1334260, upload-time = "2024-09-04T09:04:14.878Z" }, + { url = "https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", size = 1426589, upload-time = "2024-09-04T09:04:16.514Z" }, + { url = "https://files.pythonhosted.org/packages/70/d1/c9f96df26b459e15cf8a965304e6e6f4eb291e0f7a9460b4ad97b047561e/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", size = 1541080, upload-time = "2024-09-04T09:04:18.322Z" }, + { url = "https://files.pythonhosted.org/packages/d3/73/2686990eb8b02d05f3de759d6a23a4ee7d491e659007dd4c075fede4b5d0/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052", size = 1470049, upload-time = "2024-09-04T09:04:20.266Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", size = 1426376, upload-time = "2024-09-04T09:04:22.419Z" }, + { url = "https://files.pythonhosted.org/packages/05/83/2857317d04ea46dc5d115f0df7e676997bbd968ced8e2bd6f7f19cfc8d7f/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", size = 2222231, upload-time = "2024-09-04T09:04:24.526Z" }, + { url = "https://files.pythonhosted.org/packages/0d/b5/866f86f5897cd4ab6d25d22e403404766a123f138bd6a02ecb2cdde52c18/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", size = 2368634, upload-time = "2024-09-04T09:04:25.899Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ee/73de8385403faba55f782a41260210528fe3273d0cddcf6d51648202d6d0/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", size = 2329024, upload-time = "2024-09-04T09:04:28.523Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/cd101d8cd2cdfaa42dc06c433df17c8303d31129c9fdd16c0ea37672af91/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", size = 2468484, upload-time = "2024-09-04T09:04:30.547Z" }, + { url = "https://files.pythonhosted.org/packages/e1/72/84f09d45a10bc57a40bb58b81b99d8f22b58b2040c912b7eb97ebf625bf2/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", size = 2284078, upload-time = "2024-09-04T09:04:33.218Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d4/71828f32b956612dc36efd7be1788980cb1e66bfb3706e6dec9acad9b4f9/kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", size = 46645, upload-time = "2024-09-04T09:04:34.371Z" }, + { url = "https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", size = 56022, upload-time = "2024-09-04T09:04:35.786Z" }, + { url = "https://files.pythonhosted.org/packages/35/b3/9f75a2e06f1b4ca00b2b192bc2b739334127d27f1d0625627ff8479302ba/kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", size = 48536, upload-time = "2024-09-04T09:04:37.525Z" }, + { url = "https://files.pythonhosted.org/packages/97/9c/0a11c714cf8b6ef91001c8212c4ef207f772dd84540104952c45c1f0a249/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2", size = 121808, upload-time = "2024-09-04T09:04:38.637Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a", size = 65531, upload-time = "2024-09-04T09:04:39.694Z" }, + { url = "https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee", size = 63894, upload-time = "2024-09-04T09:04:41.6Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e9/26d3edd4c4ad1c5b891d8747a4f81b1b0aba9fb9721de6600a4adc09773b/kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640", size = 1369296, upload-time = "2024-09-04T09:04:42.886Z" }, + { url = "https://files.pythonhosted.org/packages/b6/67/3f4850b5e6cffb75ec40577ddf54f7b82b15269cc5097ff2e968ee32ea7d/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f", size = 1461450, upload-time = "2024-09-04T09:04:46.284Z" }, + { url = "https://files.pythonhosted.org/packages/52/be/86cbb9c9a315e98a8dc6b1d23c43cffd91d97d49318854f9c37b0e41cd68/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483", size = 1579168, upload-time = "2024-09-04T09:04:47.91Z" }, + { url = "https://files.pythonhosted.org/packages/0f/00/65061acf64bd5fd34c1f4ae53f20b43b0a017a541f242a60b135b9d1e301/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258", size = 1507308, upload-time = "2024-09-04T09:04:49.465Z" }, + { url = "https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e", size = 1464186, upload-time = "2024-09-04T09:04:50.949Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0f/529d0a9fffb4d514f2782c829b0b4b371f7f441d61aa55f1de1c614c4ef3/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107", size = 2247877, upload-time = "2024-09-04T09:04:52.388Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e1/66603ad779258843036d45adcbe1af0d1a889a07af4635f8b4ec7dccda35/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948", size = 2404204, upload-time = "2024-09-04T09:04:54.385Z" }, + { url = "https://files.pythonhosted.org/packages/8d/61/de5fb1ca7ad1f9ab7970e340a5b833d735df24689047de6ae71ab9d8d0e7/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038", size = 2352461, upload-time = "2024-09-04T09:04:56.307Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d2/0edc00a852e369827f7e05fd008275f550353f1f9bcd55db9363d779fc63/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383", size = 2501358, upload-time = "2024-09-04T09:04:57.922Z" }, + { url = "https://files.pythonhosted.org/packages/84/15/adc15a483506aec6986c01fb7f237c3aec4d9ed4ac10b756e98a76835933/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520", size = 2314119, upload-time = "2024-09-04T09:04:59.332Z" }, + { url = "https://files.pythonhosted.org/packages/36/08/3a5bb2c53c89660863a5aa1ee236912269f2af8762af04a2e11df851d7b2/kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", size = 46367, upload-time = "2024-09-04T09:05:00.804Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", size = 55884, upload-time = "2024-09-04T09:05:01.924Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f9/3828d8f21b6de4279f0667fb50a9f5215e6fe57d5ec0d61905914f5b6099/kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", size = 48528, upload-time = "2024-09-04T09:05:02.983Z" }, + { url = "https://files.pythonhosted.org/packages/c4/06/7da99b04259b0f18b557a4effd1b9c901a747f7fdd84cf834ccf520cb0b2/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", size = 121913, upload-time = "2024-09-04T09:05:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/97/f5/b8a370d1aa593c17882af0a6f6755aaecd643640c0ed72dcfd2eafc388b9/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", size = 65627, upload-time = "2024-09-04T09:05:05.119Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fc/6c0374f7503522539e2d4d1b497f5ebad3f8ed07ab51aed2af988dd0fb65/kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", size = 63888, upload-time = "2024-09-04T09:05:06.191Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3e/0b7172793d0f41cae5c923492da89a2ffcd1adf764c16159ca047463ebd3/kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", size = 1369145, upload-time = "2024-09-04T09:05:07.919Z" }, + { url = "https://files.pythonhosted.org/packages/77/92/47d050d6f6aced2d634258123f2688fbfef8ded3c5baf2c79d94d91f1f58/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", size = 1461448, upload-time = "2024-09-04T09:05:10.01Z" }, + { url = "https://files.pythonhosted.org/packages/9c/1b/8f80b18e20b3b294546a1adb41701e79ae21915f4175f311a90d042301cf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", size = 1578750, upload-time = "2024-09-04T09:05:11.598Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fe/fe8e72f3be0a844f257cadd72689c0848c6d5c51bc1d60429e2d14ad776e/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", size = 1507175, upload-time = "2024-09-04T09:05:13.22Z" }, + { url = "https://files.pythonhosted.org/packages/39/fa/cdc0b6105d90eadc3bee525fecc9179e2b41e1ce0293caaf49cb631a6aaf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", size = 1463963, upload-time = "2024-09-04T09:05:15.925Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5c/0c03c4e542720c6177d4f408e56d1c8315899db72d46261a4e15b8b33a41/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", size = 2248220, upload-time = "2024-09-04T09:05:17.434Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ee/55ef86d5a574f4e767df7da3a3a7ff4954c996e12d4fbe9c408170cd7dcc/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", size = 2404463, upload-time = "2024-09-04T09:05:18.997Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6d/73ad36170b4bff4825dc588acf4f3e6319cb97cd1fb3eb04d9faa6b6f212/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", size = 2352842, upload-time = "2024-09-04T09:05:21.299Z" }, + { url = "https://files.pythonhosted.org/packages/0b/16/fa531ff9199d3b6473bb4d0f47416cdb08d556c03b8bc1cccf04e756b56d/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", size = 2501635, upload-time = "2024-09-04T09:05:23.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/7e/aa9422e78419db0cbe75fb86d8e72b433818f2e62e2e394992d23d23a583/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", size = 2314556, upload-time = "2024-09-04T09:05:25.907Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/15f7f556df0a6e5b3772a1e076a9d9f6c538ce5f05bd590eca8106508e06/kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", size = 46364, upload-time = "2024-09-04T09:05:27.184Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/32e897e43a330eee8e4770bfd2737a9584b23e33587a0812b8e20aac38f7/kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", size = 55887, upload-time = "2024-09-04T09:05:28.372Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530, upload-time = "2024-09-04T09:05:30.225Z" }, + { url = "https://files.pythonhosted.org/packages/11/88/37ea0ea64512997b13d69772db8dcdc3bfca5442cda3a5e4bb943652ee3e/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", size = 122449, upload-time = "2024-09-04T09:05:55.311Z" }, + { url = "https://files.pythonhosted.org/packages/4e/45/5a5c46078362cb3882dcacad687c503089263c017ca1241e0483857791eb/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", size = 65757, upload-time = "2024-09-04T09:05:56.906Z" }, + { url = "https://files.pythonhosted.org/packages/8a/be/a6ae58978772f685d48dd2e84460937761c53c4bbd84e42b0336473d9775/kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", size = 64312, upload-time = "2024-09-04T09:05:58.384Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/18ef6f452d311e1e1eb180c9bf5589187fa1f042db877e6fe443ef10099c/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", size = 1626966, upload-time = "2024-09-04T09:05:59.855Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/40655f6c3fa11ce740e8a964fa8e4c0479c87d6a7944b95af799c7a55dfe/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", size = 1607044, upload-time = "2024-09-04T09:06:02.16Z" }, + { url = "https://files.pythonhosted.org/packages/fd/93/af67dbcfb9b3323bbd2c2db1385a7139d8f77630e4a37bb945b57188eb2d/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", size = 1391879, upload-time = "2024-09-04T09:06:03.908Z" }, + { url = "https://files.pythonhosted.org/packages/40/6f/d60770ef98e77b365d96061d090c0cd9e23418121c55fff188fa4bdf0b54/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", size = 1504751, upload-time = "2024-09-04T09:06:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/fa/3a/5f38667d313e983c432f3fcd86932177519ed8790c724e07d77d1de0188a/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", size = 1436990, upload-time = "2024-09-04T09:06:08.126Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/1520301a47326e6a6043b502647e42892be33b3f051e9791cc8bb43f1a32/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", size = 2191122, upload-time = "2024-09-04T09:06:10.345Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c4/eb52da300c166239a2233f1f9c4a1b767dfab98fae27681bfb7ea4873cb6/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", size = 2338126, upload-time = "2024-09-04T09:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/1a/cb/42b92fd5eadd708dd9107c089e817945500685f3437ce1fd387efebc6d6e/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", size = 2298313, upload-time = "2024-09-04T09:06:14.562Z" }, + { url = "https://files.pythonhosted.org/packages/4f/eb/be25aa791fe5fc75a8b1e0c965e00f942496bc04635c9aae8035f6b76dcd/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", size = 2437784, upload-time = "2024-09-04T09:06:16.767Z" }, + { url = "https://files.pythonhosted.org/packages/c5/22/30a66be7f3368d76ff95689e1c2e28d382383952964ab15330a15d8bfd03/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", size = 2253988, upload-time = "2024-09-04T09:06:18.705Z" }, + { url = "https://files.pythonhosted.org/packages/35/d3/5f2ecb94b5211c8a04f218a76133cc8d6d153b0f9cd0b45fad79907f0689/kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", size = 46980, upload-time = "2024-09-04T09:06:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/ef/17/cd10d020578764ea91740204edc6b3236ed8106228a46f568d716b11feb2/kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", size = 55847, upload-time = "2024-09-04T09:06:21.407Z" }, + { url = "https://files.pythonhosted.org/packages/91/84/32232502020bd78d1d12be7afde15811c64a95ed1f606c10456db4e4c3ac/kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", size = 48494, upload-time = "2024-09-04T09:06:22.648Z" }, + { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491, upload-time = "2024-09-04T09:06:24.188Z" }, + { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648, upload-time = "2024-09-04T09:06:25.559Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257, upload-time = "2024-09-04T09:06:27.038Z" }, + { url = "https://files.pythonhosted.org/packages/81/e1/c64f50987f85b68b1c52b464bb5bf73e71570c0f7782d626d1eb283ad620/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", size = 80906, upload-time = "2024-09-04T09:06:28.48Z" }, + { url = "https://files.pythonhosted.org/packages/fd/71/1687c5c0a0be2cee39a5c9c389e546f9c6e215e46b691d00d9f646892083/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", size = 79951, upload-time = "2024-09-04T09:06:29.966Z" }, + { url = "https://files.pythonhosted.org/packages/ea/8b/d7497df4a1cae9367adf21665dd1f896c2a7aeb8769ad77b662c5e2bcce7/kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", size = 55715, upload-time = "2024-09-04T09:06:31.489Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/ce37d9b26f07ab90880923c94d12a6ff4d27447096b4c849bfc4339ccfdf/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", size = 58666, upload-time = "2024-09-04T09:06:43.756Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d3/e4b04f43bc629ac8e186b77b2b1a251cdfa5b7610fa189dc0db622672ce6/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", size = 57088, upload-time = "2024-09-04T09:06:45.406Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/752df58e2d339e670a535514d2db4fe8c842ce459776b8080fbe08ebb98e/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", size = 84321, upload-time = "2024-09-04T09:06:47.557Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f8/fe6484e847bc6e238ec9f9828089fb2c0bb53f2f5f3a79351fde5b565e4f/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", size = 80776, upload-time = "2024-09-04T09:06:49.235Z" }, + { url = "https://files.pythonhosted.org/packages/9b/57/d7163c0379f250ef763aba85330a19feefb5ce6cb541ade853aaba881524/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", size = 79984, upload-time = "2024-09-04T09:06:51.336Z" }, + { url = "https://files.pythonhosted.org/packages/8c/95/4a103776c265d13b3d2cd24fb0494d4e04ea435a8ef97e1b2c026d43250b/kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", size = 55811, upload-time = "2024-09-04T09:06:53.078Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, + { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, + { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, + { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, + { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.9.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "contourpy", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "cycler", marker = "python_full_version < '3.10'" }, + { name = "fonttools", marker = "python_full_version < '3.10'" }, + { name = "importlib-resources", marker = "python_full_version < '3.10'" }, + { name = "kiwisolver", version = "1.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pyparsing", marker = "python_full_version < '3.10'" }, + { name = "python-dateutil", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/17/1747b4154034befd0ed33b52538f5eb7752d05bb51c5e2a31470c3bc7d52/matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3", size = 36106529, upload-time = "2024-12-13T05:56:34.184Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/94/27d2e2c30d54b56c7b764acc1874a909e34d1965a427fc7092bb6a588b63/matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50", size = 7885089, upload-time = "2024-12-13T05:54:24.224Z" }, + { url = "https://files.pythonhosted.org/packages/c6/25/828273307e40a68eb8e9df832b6b2aaad075864fdc1de4b1b81e40b09e48/matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff", size = 7770600, upload-time = "2024-12-13T05:54:27.214Z" }, + { url = "https://files.pythonhosted.org/packages/f2/65/f841a422ec994da5123368d76b126acf4fc02ea7459b6e37c4891b555b83/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26", size = 8200138, upload-time = "2024-12-13T05:54:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/272aca07a38804d93b6050813de41ca7ab0e29ba7a9dd098e12037c919a9/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50", size = 8312711, upload-time = "2024-12-13T05:54:34.396Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/f13e23b233c526b7e27ad61be0a771894a079e0f7494a10d8d81557e0e9a/matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5", size = 9090622, upload-time = "2024-12-13T05:54:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8c/b1f5bd2bd70e60f93b1b54c4d5ba7a992312021d0ddddf572f9a1a6d9348/matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d", size = 7828211, upload-time = "2024-12-13T05:54:40.596Z" }, + { url = "https://files.pythonhosted.org/packages/74/4b/65be7959a8fa118a3929b49a842de5b78bb55475236fcf64f3e308ff74a0/matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c", size = 7894430, upload-time = "2024-12-13T05:54:44.049Z" }, + { url = "https://files.pythonhosted.org/packages/e9/18/80f70d91896e0a517b4a051c3fd540daa131630fd75e02e250365353b253/matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099", size = 7780045, upload-time = "2024-12-13T05:54:46.414Z" }, + { url = "https://files.pythonhosted.org/packages/a2/73/ccb381026e3238c5c25c3609ba4157b2d1a617ec98d65a8b4ee4e1e74d02/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249", size = 8209906, upload-time = "2024-12-13T05:54:49.459Z" }, + { url = "https://files.pythonhosted.org/packages/ab/33/1648da77b74741c89f5ea95cbf42a291b4b364f2660b316318811404ed97/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423", size = 8322873, upload-time = "2024-12-13T05:54:53.066Z" }, + { url = "https://files.pythonhosted.org/packages/57/d3/8447ba78bc6593c9044c372d1609f8ea10fb1e071e7a9e0747bea74fc16c/matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e", size = 9099566, upload-time = "2024-12-13T05:54:55.522Z" }, + { url = "https://files.pythonhosted.org/packages/23/e1/4f0e237bf349c02ff9d1b6e7109f1a17f745263809b9714a8576dc17752b/matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3", size = 7838065, upload-time = "2024-12-13T05:54:58.337Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2b/c918bf6c19d6445d1cefe3d2e42cb740fb997e14ab19d4daeb6a7ab8a157/matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70", size = 7891131, upload-time = "2024-12-13T05:55:02.837Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e5/b4e8fc601ca302afeeabf45f30e706a445c7979a180e3a978b78b2b681a4/matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483", size = 7776365, upload-time = "2024-12-13T05:55:05.158Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/b991886c506506476e5d83625c5970c656a491b9f80161458fed94597808/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f", size = 8200707, upload-time = "2024-12-13T05:55:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e2/556b627498cb27e61026f2d1ba86a78ad1b836fef0996bef5440e8bc9559/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00", size = 8313761, upload-time = "2024-12-13T05:55:12.95Z" }, + { url = "https://files.pythonhosted.org/packages/58/ff/165af33ec766ff818306ea88e91f9f60d2a6ed543be1eb122a98acbf3b0d/matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0", size = 9095284, upload-time = "2024-12-13T05:55:16.199Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8b/3d0c7a002db3b1ed702731c2a9a06d78d035f1f2fb0fb936a8e43cc1e9f4/matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b", size = 7841160, upload-time = "2024-12-13T05:55:19.991Z" }, + { url = "https://files.pythonhosted.org/packages/49/b1/999f89a7556d101b23a2f0b54f1b6e140d73f56804da1398f2f0bc0924bc/matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6", size = 7891499, upload-time = "2024-12-13T05:55:22.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/7b/06a32b13a684977653396a1bfcd34d4e7539c5d55c8cbfaa8ae04d47e4a9/matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45", size = 7776802, upload-time = "2024-12-13T05:55:25.947Z" }, + { url = "https://files.pythonhosted.org/packages/65/87/ac498451aff739e515891bbb92e566f3c7ef31891aaa878402a71f9b0910/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858", size = 8200802, upload-time = "2024-12-13T05:55:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6b/9eb761c00e1cb838f6c92e5f25dcda3f56a87a52f6cb8fdfa561e6cf6a13/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64", size = 8313880, upload-time = "2024-12-13T05:55:30.965Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/c8eaa600e2085eec7e38cbbcc58a30fc78f8224939d31d3152bdafc01fd1/matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df", size = 9094637, upload-time = "2024-12-13T05:55:33.701Z" }, + { url = "https://files.pythonhosted.org/packages/71/1f/c6e1daea55b7bfeb3d84c6cb1abc449f6a02b181e7e2a5e4db34c3afb793/matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799", size = 7841311, upload-time = "2024-12-13T05:55:36.737Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3a/2757d3f7d388b14dd48f5a83bea65b6d69f000e86b8f28f74d86e0d375bd/matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb", size = 7919989, upload-time = "2024-12-13T05:55:39.024Z" }, + { url = "https://files.pythonhosted.org/packages/24/28/f5077c79a4f521589a37fe1062d6a6ea3534e068213f7357e7cfffc2e17a/matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a", size = 7809417, upload-time = "2024-12-13T05:55:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/c523fd2963156692916a8eb7d4069084cf729359f7955cf09075deddfeaf/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c", size = 8226258, upload-time = "2024-12-13T05:55:47.259Z" }, + { url = "https://files.pythonhosted.org/packages/f6/88/499bf4b8fa9349b6f5c0cf4cead0ebe5da9d67769129f1b5651e5ac51fbc/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764", size = 8335849, upload-time = "2024-12-13T05:55:49.763Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9f/20a4156b9726188646a030774ee337d5ff695a965be45ce4dbcb9312c170/matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041", size = 9102152, upload-time = "2024-12-13T05:55:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/10/11/237f9c3a4e8d810b1759b67ff2da7c32c04f9c80aa475e7beb36ed43a8fb/matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965", size = 7896987, upload-time = "2024-12-13T05:55:55.941Z" }, + { url = "https://files.pythonhosted.org/packages/56/eb/501b465c9fef28f158e414ea3a417913dc2ac748564c7ed41535f23445b4/matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c", size = 7885919, upload-time = "2024-12-13T05:55:59.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/36/236fbd868b6c91309a5206bd90c3f881f4f44b2d997cd1d6239ef652f878/matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7", size = 7771486, upload-time = "2024-12-13T05:56:04.264Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/105caf2d54d5ed11d9f4335398f5103001a03515f2126c936a752ccf1461/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e", size = 8201838, upload-time = "2024-12-13T05:56:06.792Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a7/bb01188fb4013d34d274caf44a2f8091255b0497438e8b6c0a7c1710c692/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c", size = 8314492, upload-time = "2024-12-13T05:56:09.964Z" }, + { url = "https://files.pythonhosted.org/packages/33/19/02e1a37f7141fc605b193e927d0a9cdf9dc124a20b9e68793f4ffea19695/matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb", size = 9092500, upload-time = "2024-12-13T05:56:13.55Z" }, + { url = "https://files.pythonhosted.org/packages/57/68/c2feb4667adbf882ffa4b3e0ac9967f848980d9f8b5bebd86644aa67ce6a/matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac", size = 7822962, upload-time = "2024-12-13T05:56:16.358Z" }, + { url = "https://files.pythonhosted.org/packages/0c/22/2ef6a364cd3f565442b0b055e0599744f1e4314ec7326cdaaa48a4d864d7/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c", size = 7877995, upload-time = "2024-12-13T05:56:18.805Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/2737456e566e9f4d94ae76b8aa0d953d9acb847714f9a7ad80184474f5be/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca", size = 7769300, upload-time = "2024-12-13T05:56:21.315Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1f/e709c6ec7b5321e6568769baa288c7178e60a93a9da9e682b39450da0e29/matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db", size = 8313423, upload-time = "2024-12-13T05:56:26.719Z" }, + { url = "https://files.pythonhosted.org/packages/5e/b6/5a1f868782cd13f053a679984e222007ecff654a9bfbac6b27a65f4eeb05/matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865", size = 7854624, upload-time = "2024-12-13T05:56:29.359Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "cycler", marker = "python_full_version >= '3.10'" }, + { name = "fonttools", marker = "python_full_version >= '3.10'" }, + { name = "kiwisolver", version = "1.4.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyparsing", marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/87/3932d5778ab4c025db22710b61f49ccaed3956c5cf46ffb2ffa7492b06d9/matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380", size = 8247141, upload-time = "2025-10-09T00:26:06.023Z" }, + { url = "https://files.pythonhosted.org/packages/45/a8/bfed45339160102bce21a44e38a358a1134a5f84c26166de03fb4a53208f/matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d", size = 8107995, upload-time = "2025-10-09T00:26:08.669Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3c/5692a2d9a5ba848fda3f48d2b607037df96460b941a59ef236404b39776b/matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297", size = 8680503, upload-time = "2025-10-09T00:26:10.607Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a0/86ace53c48b05d0e6e9c127b2ace097434901f3e7b93f050791c8243201a/matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42", size = 9514982, upload-time = "2025-10-09T00:26:12.594Z" }, + { url = "https://files.pythonhosted.org/packages/a6/81/ead71e2824da8f72640a64166d10e62300df4ae4db01a0bac56c5b39fa51/matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7", size = 9566429, upload-time = "2025-10-09T00:26:14.758Z" }, + { url = "https://files.pythonhosted.org/packages/65/7d/954b3067120456f472cce8fdcacaf4a5fcd522478db0c37bb243c7cb59dd/matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3", size = 8108174, upload-time = "2025-10-09T00:26:17.015Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" }, + { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" }, + { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" }, + { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" }, + { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" }, + { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" }, + { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" }, + { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" }, + { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" }, + { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" }, + { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, + { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6c/a9bcf03e9afb2a873e0a5855f79bce476d1023f26f8212969f2b7504756c/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537", size = 8241204, upload-time = "2025-10-09T00:27:48.806Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fd/0e6f5aa762ed689d9fa8750b08f1932628ffa7ed30e76423c399d19407d2/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657", size = 8104607, upload-time = "2025-10-09T00:27:50.876Z" }, + { url = "https://files.pythonhosted.org/packages/b9/a9/21c9439d698fac5f0de8fc68b2405b738ed1f00e1279c76f2d9aa5521ead/matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b", size = 8682257, upload-time = "2025-10-09T00:27:52.597Z" }, + { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" }, +] + +[[package]] +name = "numpy" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245, upload-time = "2024-08-26T20:04:14.625Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540, upload-time = "2024-08-26T20:04:36.784Z" }, + { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623, upload-time = "2024-08-26T20:04:46.491Z" }, + { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774, upload-time = "2024-08-26T20:04:58.173Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081, upload-time = "2024-08-26T20:05:19.098Z" }, + { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451, upload-time = "2024-08-26T20:05:47.479Z" }, + { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572, upload-time = "2024-08-26T20:06:17.137Z" }, + { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722, upload-time = "2024-08-26T20:06:39.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170, upload-time = "2024-08-26T20:06:50.361Z" }, + { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558, upload-time = "2024-08-26T20:07:13.881Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137, upload-time = "2024-08-26T20:07:45.345Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552, upload-time = "2024-08-26T20:08:06.666Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957, upload-time = "2024-08-26T20:08:15.83Z" }, + { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573, upload-time = "2024-08-26T20:08:27.185Z" }, + { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330, upload-time = "2024-08-26T20:08:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895, upload-time = "2024-08-26T20:09:16.536Z" }, + { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253, upload-time = "2024-08-26T20:09:46.263Z" }, + { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074, upload-time = "2024-08-26T20:10:08.483Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640, upload-time = "2024-08-26T20:10:19.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230, upload-time = "2024-08-26T20:10:43.413Z" }, + { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803, upload-time = "2024-08-26T20:11:13.916Z" }, + { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835, upload-time = "2024-08-26T20:11:34.779Z" }, + { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499, upload-time = "2024-08-26T20:11:43.902Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497, upload-time = "2024-08-26T20:11:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158, upload-time = "2024-08-26T20:12:14.95Z" }, + { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173, upload-time = "2024-08-26T20:12:44.049Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174, upload-time = "2024-08-26T20:13:13.634Z" }, + { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701, upload-time = "2024-08-26T20:13:34.851Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313, upload-time = "2024-08-26T20:13:45.653Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179, upload-time = "2024-08-26T20:14:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942, upload-time = "2024-08-26T20:14:40.108Z" }, + { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512, upload-time = "2024-08-26T20:15:00.985Z" }, + { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976, upload-time = "2024-08-26T20:15:10.876Z" }, + { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494, upload-time = "2024-08-26T20:15:22.055Z" }, + { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596, upload-time = "2024-08-26T20:15:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099, upload-time = "2024-08-26T20:16:11.048Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823, upload-time = "2024-08-26T20:16:40.171Z" }, + { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424, upload-time = "2024-08-26T20:17:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809, upload-time = "2024-08-26T20:17:13.553Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314, upload-time = "2024-08-26T20:17:36.72Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288, upload-time = "2024-08-26T20:18:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793, upload-time = "2024-08-26T20:18:19.125Z" }, + { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885, upload-time = "2024-08-26T20:18:47.237Z" }, + { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784, upload-time = "2024-08-26T20:19:11.19Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e7/0e07379944aa8afb49a556a2b54587b828eb41dc9adc56fb7615b678ca53/numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb", size = 21259519, upload-time = "2025-10-15T16:15:19.012Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cb/5a69293561e8819b09e34ed9e873b9a82b5f2ade23dce4c51dc507f6cfe1/numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f", size = 14452796, upload-time = "2025-10-15T16:15:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/ff11611200acd602a1e5129e36cfd25bf01ad8e5cf927baf2e90236eb02e/numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36", size = 5381639, upload-time = "2025-10-15T16:15:25.572Z" }, + { url = "https://files.pythonhosted.org/packages/ea/77/e95c757a6fe7a48d28a009267408e8aa382630cc1ad1db7451b3bc21dbb4/numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032", size = 6914296, upload-time = "2025-10-15T16:15:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a3/d2/137c7b6841c942124eae921279e5c41b1c34bab0e6fc60c7348e69afd165/numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7", size = 14591904, upload-time = "2025-10-15T16:15:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/bb/32/67e3b0f07b0aba57a078c4ab777a9e8e6bc62f24fb53a2337f75f9691699/numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda", size = 16939602, upload-time = "2025-10-15T16:15:31.106Z" }, + { url = "https://files.pythonhosted.org/packages/95/22/9639c30e32c93c4cee3ccdb4b09c2d0fbff4dcd06d36b357da06146530fb/numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0", size = 16372661, upload-time = "2025-10-15T16:15:33.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/e9/a685079529be2b0156ae0c11b13d6be647743095bb51d46589e95be88086/numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a", size = 18884682, upload-time = "2025-10-15T16:15:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/cf/85/f6f00d019b0cc741e64b4e00ce865a57b6bed945d1bbeb1ccadbc647959b/numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1", size = 6570076, upload-time = "2025-10-15T16:15:38.225Z" }, + { url = "https://files.pythonhosted.org/packages/7d/10/f8850982021cb90e2ec31990291f9e830ce7d94eef432b15066e7cbe0bec/numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996", size = 13089358, upload-time = "2025-10-15T16:15:40.404Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ad/afdd8351385edf0b3445f9e24210a9c3971ef4de8fd85155462fc4321d79/numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c", size = 10462292, upload-time = "2025-10-15T16:15:42.896Z" }, + { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" }, + { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" }, + { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" }, + { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, + { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, + { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, + { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, + { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, + { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, + { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, + { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, + { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b6/64898f51a86ec88ca1257a59c1d7fd077b60082a119affefcdf1dd0df8ca/numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05", size = 21131552, upload-time = "2025-10-15T16:17:55.845Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4c/f135dc6ebe2b6a3c77f4e4838fa63d350f85c99462012306ada1bd4bc460/numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346", size = 14377796, upload-time = "2025-10-15T16:17:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a4/f33f9c23fcc13dd8412fc8614559b5b797e0aba9d8e01dfa8bae10c84004/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e", size = 5306904, upload-time = "2025-10-15T16:18:00.596Z" }, + { url = "https://files.pythonhosted.org/packages/28/af/c44097f25f834360f9fb960fa082863e0bad14a42f36527b2a121abdec56/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b", size = 6819682, upload-time = "2025-10-15T16:18:02.32Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8c/cd283b54c3c2b77e188f63e23039844f56b23bba1712318288c13fe86baf/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847", size = 14422300, upload-time = "2025-10-15T16:18:04.271Z" }, + { url = "https://files.pythonhosted.org/packages/b0/f0/8404db5098d92446b3e3695cf41c6f0ecb703d701cb0b7566ee2177f2eee/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d", size = 16760806, upload-time = "2025-10-15T16:18:06.668Z" }, + { url = "https://files.pythonhosted.org/packages/95/8e/2844c3959ce9a63acc7c8e50881133d86666f0420bcde695e115ced0920f/numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f", size = 12973130, upload-time = "2025-10-15T16:18:09.397Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandarallel" +version = "1.6.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "pandas" }, + { name = "psutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/c5/787365399cc7262e20d1d9f42ba202018c2191e6cd5b1a2a10f9161dae35/pandarallel-1.6.5.tar.gz", hash = "sha256:1c2df98ff6441e8ae13ff428ceebaa7ec42d731f7f972c41ce4fdef1d3adf640", size = 14201, upload-time = "2023-05-02T20:43:15.214Z" } + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, + { url = "https://files.pythonhosted.org/packages/56/b4/52eeb530a99e2a4c55ffcd352772b599ed4473a0f892d127f4147cf0f88e/pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2", size = 11567720, upload-time = "2025-09-29T23:33:06.209Z" }, + { url = "https://files.pythonhosted.org/packages/48/4a/2d8b67632a021bced649ba940455ed441ca854e57d6e7658a6024587b083/pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8", size = 10810302, upload-time = "2025-09-29T23:33:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/13/e6/d2465010ee0569a245c975dc6967b801887068bc893e908239b1f4b6c1ac/pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff", size = 12154874, upload-time = "2025-09-29T23:33:49.939Z" }, + { url = "https://files.pythonhosted.org/packages/1f/18/aae8c0aa69a386a3255940e9317f793808ea79d0a525a97a903366bb2569/pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29", size = 12790141, upload-time = "2025-09-29T23:34:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/f7/26/617f98de789de00c2a444fbe6301bb19e66556ac78cff933d2c98f62f2b4/pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73", size = 13208697, upload-time = "2025-09-29T23:34:21.835Z" }, + { url = "https://files.pythonhosted.org/packages/b9/fb/25709afa4552042bd0e15717c75e9b4a2294c3dc4f7e6ea50f03c5136600/pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9", size = 13879233, upload-time = "2025-09-29T23:34:35.079Z" }, + { url = "https://files.pythonhosted.org/packages/98/af/7be05277859a7bc399da8ba68b88c96b27b48740b6cf49688899c6eb4176/pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa", size = 11359119, upload-time = "2025-09-29T23:34:46.339Z" }, +] + +[[package]] +name = "pillow" +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, + { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, + { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, + { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, + { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478, upload-time = "2025-07-01T09:15:52.209Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522, upload-time = "2025-07-01T09:15:54.162Z" }, + { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376, upload-time = "2025-07-03T13:11:01.066Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020, upload-time = "2025-07-03T13:11:06.479Z" }, + { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732, upload-time = "2025-07-01T09:15:56.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404, upload-time = "2025-07-01T09:15:58.245Z" }, + { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760, upload-time = "2025-07-01T09:16:00.003Z" }, + { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534, upload-time = "2025-07-01T09:16:02.29Z" }, + { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091, upload-time = "2025-07-01T09:16:04.4Z" }, + { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091, upload-time = "2025-07-01T09:16:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632, upload-time = "2025-07-01T09:16:08.142Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, + { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, + { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606, upload-time = "2025-10-15T18:21:29.823Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023, upload-time = "2025-10-15T18:21:31.415Z" }, + { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937, upload-time = "2025-10-15T18:21:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139, upload-time = "2025-10-15T18:21:35.395Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074, upload-time = "2025-10-15T18:21:37.219Z" }, + { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852, upload-time = "2025-10-15T18:21:39.168Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058, upload-time = "2025-10-15T18:21:40.997Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431, upload-time = "2025-10-15T18:21:42.518Z" }, + { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412, upload-time = "2025-10-15T18:21:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903, upload-time = "2025-10-15T18:21:46.29Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, + { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, + { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, + { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, + { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, + { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +] + +[[package]] +name = "psutil" +version = "7.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, + { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, + { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, + { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, + { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, + { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, +] + +[[package]] +name = "pynmrstar" +version = "3.3.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/26/5b430e0ef32f30bbf6c70d29c67bf91c002bf4bbadc1bc940da8e974c162/pynmrstar-3.3.6.tar.gz", hash = "sha256:b0521be5c89a935214fef31a3c77b6dbafb09cd4d2e0e27d8f70b56209db19c9", size = 388935, upload-time = "2025-09-11T16:41:52.839Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/09/eb60bf576dc7b02718b1bc7763292de4aae349a7bea949275b83e7df072a/pynmrstar-3.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d798e218716e44e72c89e9163375f6b50d72a6f939be6ea6234e7ab7fc9da527", size = 409308, upload-time = "2025-09-11T16:40:02.09Z" }, + { url = "https://files.pythonhosted.org/packages/f4/e7/115717f597dae427cd208d3e995bc4e3d7d7cd7584ef470703738127c2d6/pynmrstar-3.3.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb33c018043d6af486d1706fb5d401f9583295bba7855a64f1a94d2f76c16007", size = 409365, upload-time = "2025-09-11T16:40:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/6882f4c72b1ffc06f5996c215cd01e3393f22697218f88dc2403cce155f7/pynmrstar-3.3.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d72d255375475889a92f023ab4dc67c70b5f7eb1c3db56aea0a77d6b4ea9a0b", size = 427035, upload-time = "2025-09-11T16:40:04.976Z" }, + { url = "https://files.pythonhosted.org/packages/df/72/0b5a6eb451df542e8a719b077a32579f88432759594d6f71b1415c6a4ddd/pynmrstar-3.3.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:669d90e8c20fdc6a3cf9fcdffe9ed27fee9b04d20f278ecb9e894b60fb4def61", size = 425772, upload-time = "2025-09-11T16:40:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/d8/52/26d46af28dbbf2533feea827d0455e4b1ce8dd8d848feb4534081892bed3/pynmrstar-3.3.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ff20d8233c1312e5d43ab0bd6e19e8c2e291c05bc206cc4323c9b65033e41fd2", size = 425284, upload-time = "2025-09-11T16:40:07.817Z" }, + { url = "https://files.pythonhosted.org/packages/3c/13/e6becfdb11bc75e0d9c1604b899ca7a236b7d2eb9ff707f8a6e6d2953a07/pynmrstar-3.3.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5607fdc8b0f36dfbe4b658eeb56815b1d79cc3f70095e37cf98d5816b3d9a33e", size = 426356, upload-time = "2025-09-11T16:40:09.314Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f3/b4a93926c137a65698b5ff8bcbff7d56baea1f0a9c2223f0d97c083d66e2/pynmrstar-3.3.6-cp310-cp310-win32.whl", hash = "sha256:190db11e62162f8fdb0c7f44895bbbe4761f4471d0bcdb9b7fa7a475d96f0257", size = 410010, upload-time = "2025-09-11T16:40:10.907Z" }, + { url = "https://files.pythonhosted.org/packages/5d/88/380487e7f5d6597860ff1ef59a8875c63e2a9f2ef13acb3f1b4ef7f6d32e/pynmrstar-3.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:30b19e3a42bad5a68be77f57ba048c09f0a9405bb9c7b1620077d76cae5e6ffe", size = 411133, upload-time = "2025-09-11T16:40:12.141Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5d/dbef25290f15bae96a2d33d764124df93e8d66a34c2e062758c39527758c/pynmrstar-3.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da2560a0bc7047f55f08b00ba3d04a7904202588f1a3b72bedc2e5b71b090191", size = 409309, upload-time = "2025-09-11T16:40:13.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/98/ca88b7fb7870796a5279c085e42bc0e43fc6cadcda0f098d4a1f3b6c39ab/pynmrstar-3.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81ecdde46dfcd098bd5d518d6dc86c8e9e4a2712618763ab89f44193c4f32909", size = 409362, upload-time = "2025-09-11T16:40:14.979Z" }, + { url = "https://files.pythonhosted.org/packages/c0/61/32726644a18e4dc98ea3ee96af46247e1842a2d9df6dfa33b3f20286c09e/pynmrstar-3.3.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4ec073c99f56a4100cb6599c985a12df197f814d2638f09d63d147a4dd3b341", size = 426991, upload-time = "2025-09-11T16:40:16.587Z" }, + { url = "https://files.pythonhosted.org/packages/95/e4/c2b2f00d3deddf7efc930a3ab636446a6e124e93d65dd016a7915d5dd9b1/pynmrstar-3.3.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc39053cc318a219418006cc0d332e0a0a5b0a5c92548a15515696bc885029d", size = 425740, upload-time = "2025-09-11T16:40:17.864Z" }, + { url = "https://files.pythonhosted.org/packages/46/40/6cc7ea205da968572a6d27e8c7cd1a877a92a6a9263b8819f0210d88d1e9/pynmrstar-3.3.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:96d5d896b2ec4b3ab11556fe8ef1af5f1632eba59e538bd80bfbb099d268c83d", size = 425323, upload-time = "2025-09-11T16:40:19.235Z" }, + { url = "https://files.pythonhosted.org/packages/35/61/a6a0614d941b600a7b90717991ee308dc315887f38d1ee439903bcea285f/pynmrstar-3.3.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e8053d56262e10fd3e4a25046d36b356c4fb7a0d0b99ae8948f4571e17f2a232", size = 426394, upload-time = "2025-09-11T16:40:20.775Z" }, + { url = "https://files.pythonhosted.org/packages/de/f1/325fd9918606245b4ec1625d13309d76b6aaa248f68363487e3eb8e010b7/pynmrstar-3.3.6-cp311-cp311-win32.whl", hash = "sha256:fc5776829f03787b8faacd4f7a606eca9448d80587872fe9be4a0a4fe44a24a4", size = 410011, upload-time = "2025-09-11T16:40:22.022Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e1/ec57b8739a83fd4f1273851ab37ddc7ff4c5939cb47f53da7b100995e790/pynmrstar-3.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:8ebe1abcce6e916c6675283a41682198d714f57dfa26e625b82c6e92b40e141f", size = 411132, upload-time = "2025-09-11T16:40:23.366Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d0/c0eeae38aeb76eeb489355aca7b66f33320c868c3879a3271e19bfb39115/pynmrstar-3.3.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:16c83472714b30773413ee1be2868bf5f0c993f4b6dd97f117830bf5d98f6d76", size = 409205, upload-time = "2025-09-11T16:40:24.671Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ec/45fb1f5fae4a578b3eab70d96a6229614d82f1bd97f9bd846ff3d2106d68/pynmrstar-3.3.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:54be67c542b56fcc682d1d5e99e1644be3b71825b607bd806efabecce9a95314", size = 409411, upload-time = "2025-09-11T16:40:25.931Z" }, + { url = "https://files.pythonhosted.org/packages/b8/28/5bf798373e8b287e6de316245388e250671cc3fce421557cfb91c146a295/pynmrstar-3.3.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b0ce1085d5bd0570f7e2c19080424da34fb2f6bf6e00e989a7cb83967b5cf9", size = 427816, upload-time = "2025-09-11T16:40:27.241Z" }, + { url = "https://files.pythonhosted.org/packages/2f/4b/2717ae0c76f59439ad24461ed259563e6c9e2bf4c4d821ef37bbb87cbadd/pynmrstar-3.3.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c26114576e7597b47814c760df8cad85ce4c808b262105c461c7923c6712c16", size = 426266, upload-time = "2025-09-11T16:40:28.547Z" }, + { url = "https://files.pythonhosted.org/packages/19/17/b0f9b1969c1f5467caeba2e4e0a78e0426339516cdb70256e90d8b773f59/pynmrstar-3.3.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:377d782d38bced58ca4b2360b010bc4a7595fb70e857651411f31932eee15f81", size = 425676, upload-time = "2025-09-11T16:40:30.12Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d3/0d593e223a8b7d8f6f0d6206dc2d4fb0ccd02e40f65d531e38bdc0d29cbc/pynmrstar-3.3.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:14da11688d47e4b72fdb09f2a9c90160f2d60ba376d4876d54e773bb45053c0d", size = 427045, upload-time = "2025-09-11T16:40:31.225Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/81017583bea2f57a89ab8038d4efbcf4d60872490581a9cecddd80a0bf7c/pynmrstar-3.3.6-cp312-cp312-win32.whl", hash = "sha256:31d0ff06677e7b0c921661562fd951cbe90e63dace3f8ae1d5204658eb5e3f8c", size = 410056, upload-time = "2025-09-11T16:40:32.379Z" }, + { url = "https://files.pythonhosted.org/packages/4f/d1/ccf8277888244958dc5e84ec0ca0b0089744ad156144feb1414a91478161/pynmrstar-3.3.6-cp312-cp312-win_amd64.whl", hash = "sha256:ac53a2b46285a0ba4fe8dbd91e9d549a3c2d60f499c5588b59598f9a6d69267c", size = 411192, upload-time = "2025-09-11T16:40:33.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3a/1d54bcd5be156971f43c17f5e88bd09fe8be99eab5e8efffa45aaab0aadf/pynmrstar-3.3.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0688a622a91574846b49b73a584e028a0212342812b9942d6969c748fff0f304", size = 409173, upload-time = "2025-09-11T16:40:35.431Z" }, + { url = "https://files.pythonhosted.org/packages/cf/80/48e2aecdaf67bc723360f2b846c6b62051c166d58d1e0ea0d17979dae13c/pynmrstar-3.3.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:21d52edbbc4248659f4806bf6589df07134e189a15409d01412c6b724131324f", size = 409375, upload-time = "2025-09-11T16:40:36.91Z" }, + { url = "https://files.pythonhosted.org/packages/99/62/58cf0a18a4c952d4ca86478535051c07199710695ece278862c06023b4ed/pynmrstar-3.3.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af7d5f020741a829aa14d0775ce5629754a6bd74213a26b3016f1ea83584ccbd", size = 427760, upload-time = "2025-09-11T16:40:38.126Z" }, + { url = "https://files.pythonhosted.org/packages/84/bc/31d75c539a4d78a0fd9f4baf8d43cedd9dec5e5ea5abaddaa6f098072729/pynmrstar-3.3.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba9c6fc728bdd306791df658d4bb576aa189f726497d1bc6f1e09d0fb8555939", size = 426223, upload-time = "2025-09-11T16:40:39.762Z" }, + { url = "https://files.pythonhosted.org/packages/80/5e/7747f78e69c649759d824dc2b6878c641fa34096f1d4e3ca89de126be5a4/pynmrstar-3.3.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5ec236d927d334afbc8dfcd301c2b68f9fe65c0966fce8110f0a7e6fdf0319f9", size = 425695, upload-time = "2025-09-11T16:40:41.058Z" }, + { url = "https://files.pythonhosted.org/packages/99/d2/96b6013170b613324f88ebc5df64ae65634cc9b2a245ba63a26da61e23c8/pynmrstar-3.3.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1984ac3602d4fbe53ab6807f9e59ecc10c86856b32e1f943b33643b374acd2b6", size = 427066, upload-time = "2025-09-11T16:40:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/90b88ad71ee176ec7b02731ec2e0d5c0267f825b1d91491f96c3303e44b4/pynmrstar-3.3.6-cp313-cp313-win32.whl", hash = "sha256:6b3850f2b68c2fa16a90b55639e2a24ea3ab0d7da25bb7b28e4e120aef76a36c", size = 410044, upload-time = "2025-09-11T16:40:43.612Z" }, + { url = "https://files.pythonhosted.org/packages/40/d2/643ab6ba5cd605ded6be5128989b98cefd74b1c5b1a09c0a13f05c5b91f7/pynmrstar-3.3.6-cp313-cp313-win_amd64.whl", hash = "sha256:9693a7751dca47e4d5389a113f85f9cfd1f22cc9388aee1824e22b6af7c6d518", size = 411190, upload-time = "2025-09-11T16:40:44.833Z" }, + { url = "https://files.pythonhosted.org/packages/77/92/e49af3c101f7571aa57275688d956e6c19debe565f39673c9834cace29c0/pynmrstar-3.3.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9502fea00cada54ef77f090dd8d68473b6f5e5beb0ffa2912b8416eeba07a358", size = 409303, upload-time = "2025-09-11T16:41:07.728Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/ff07f8eb3a79ca20e19eda82543b01d64f146657198e40ec8a87143154fd/pynmrstar-3.3.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2266ec62234c70931e46c563b2963b4ab1c08c247da5c872cf5a831580f07e6c", size = 409360, upload-time = "2025-09-11T16:41:08.954Z" }, + { url = "https://files.pythonhosted.org/packages/b7/01/32d74414afc85892f7bacd4b0952f3ce7a79d09fa3c95455832dc2d46bbd/pynmrstar-3.3.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8e0aead0db01ad1bb34ef3711c34762cf5413a2a3e9d08ea6b660cbb6fb7d92", size = 426917, upload-time = "2025-09-11T16:41:10.586Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e7/462a71ca8334475322b832dbc97fb208cdb9890d3d327247a751c64abc08/pynmrstar-3.3.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6127f9de0683b3d40ac04666629aa4586ea92b78322b261d188a0273bd4dfe7f", size = 425613, upload-time = "2025-09-11T16:41:11.829Z" }, + { url = "https://files.pythonhosted.org/packages/55/a9/0ae0e3d9cb8dd59ecad88af28b0c8b1c13d84094f03dcaa99e64e144d6b5/pynmrstar-3.3.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6e7407ce8b5dfb02df9dc18ca1a2f8263748c3f510f3c5089d7b5e218984a0fd", size = 425127, upload-time = "2025-09-11T16:41:13.013Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d7/ff6343f2193d9f550010c33075d945333e23de5403b78d088e3ee4b8dac4/pynmrstar-3.3.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:65794ba46f38ebc260ffc77972381ebf7f63cc1543ea0e024500b56a251f4a78", size = 426214, upload-time = "2025-09-11T16:41:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/6e/34/d89c95bc6f17181647313003d3eae61af3184734c66f9660e7bd1b4c0c3a/pynmrstar-3.3.6-cp39-cp39-win32.whl", hash = "sha256:d0975ad1244250ad653be2da0223c4454a06aff19b374cc1050909e7169fd241", size = 410008, upload-time = "2025-09-11T16:41:15.547Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d6/6bb1ba79cc2c5995bca6de2feed7241560906831d4dfa3d932d9a31a6bd8/pynmrstar-3.3.6-cp39-cp39-win_amd64.whl", hash = "sha256:a3c66f5933540a8b1d51005bfbf9c8652a9f2008e263359cde396773d880945d", size = 411129, upload-time = "2025-09-11T16:41:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8b/34888cbf0fe497474e27c5e9b51a56cc7ac8a202247c9e5591cb3fe499dd/pynmrstar-3.3.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5e58db57cbec0a8b85c2d2075d643afef1fa9c14e00b8201f012ab34e15edc90", size = 408588, upload-time = "2025-09-11T16:41:18.371Z" }, + { url = "https://files.pythonhosted.org/packages/03/0e/daf393ced9bb8b857976ebc7d9facc8087a2582a0c2cfb4fe525bd77fc38/pynmrstar-3.3.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b54d77254a858833be9a7c42635337034c2fb57d4cda1b10f7e4baf244725431", size = 408897, upload-time = "2025-09-11T16:41:19.668Z" }, + { url = "https://files.pythonhosted.org/packages/91/89/a7a4b1289d05a3d5706d0a4c4415f4854a8e23191730f54feaacc46b50f9/pynmrstar-3.3.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc86c57d019e9060e16e13da1f626182b3917da33cb2597cfbe6f5cef4dd9158", size = 411358, upload-time = "2025-09-11T16:41:20.921Z" }, + { url = "https://files.pythonhosted.org/packages/97/65/8ca6aba17d843237efedebc0ee1c5cb0841d9c72f28253da1890134f7f99/pynmrstar-3.3.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca9df38fba36adecd85dde17cfb5944eec4a82ff8b4c2179c950b3e8d9b472bb", size = 411651, upload-time = "2025-09-11T16:41:22.111Z" }, + { url = "https://files.pythonhosted.org/packages/25/ec/dc126815bc3c75196bbde04f5179381e2632dbeb60835524ff75a49fd9cf/pynmrstar-3.3.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7918b89b67b1230f47637045982c927fc596b5fc657cb671b19fc344e93a53f4", size = 411171, upload-time = "2025-09-11T16:41:23.365Z" }, + { url = "https://files.pythonhosted.org/packages/50/99/7afca4bc018dc778d4b1523792f4bf0124b3351038aa79b50d75d3836e75/pynmrstar-3.3.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c84dbf3b562c57c13aaab90978fd5af936381c924faa4ea94ca114203897b1b", size = 408625, upload-time = "2025-09-11T16:41:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/ea/09/cedba2ed2f0b83c52839281775e373fe4d2d2092007f93cbff727fa2c5a3/pynmrstar-3.3.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:22e2628123b16aa9e18cf8460ec4721d12985f4864b82b628aa828fd9485bad4", size = 408910, upload-time = "2025-09-11T16:41:26.036Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f4/077612aac5ef0e8aae06b28a86e700caa844f80e51470dd04f81181ad795/pynmrstar-3.3.6-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cdc57147b8fe67125e8fbbc7c052176d36bf813673ea766a80c6a81f9007a4d", size = 411319, upload-time = "2025-09-11T16:41:28.065Z" }, + { url = "https://files.pythonhosted.org/packages/b5/54/1ab1f17a58b62185f76bff14afbd1685c145b3d7abc1c83c2abb85bf4bac/pynmrstar-3.3.6-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7112048a89941634245aefea84598c22dbad378fe07e083adf5891ddd090b4f", size = 411641, upload-time = "2025-09-11T16:41:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/4d/46/4c88c74859d8c26f8147508d46cefb009112ffe4f0063e90f56c3a809bca/pynmrstar-3.3.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3898b1ef53b6834fcbe2d8107fdb2e078af9ed20f8f58bf2d64e01d7b3f4586f", size = 411172, upload-time = "2025-09-11T16:41:31.875Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a4/ebbf4f9d0b9f6d6439d7b3d5532910b4cf04659440fcaea854de2a8665b1/pynmrstar-3.3.6-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:831a43301c4adc3d7f88f6011bdc65643706f551a74081435c8769c78b1bd104", size = 408581, upload-time = "2025-09-11T16:41:46.155Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8c/282cab0535ebb8fe1c34fedd21a75e31fccf0fc5a86781ae807b62986861/pynmrstar-3.3.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:edb123358c77b3e2ab28fcb8308b5fd8508d38c8565407de3ddf83a8782164c6", size = 408887, upload-time = "2025-09-11T16:41:47.423Z" }, + { url = "https://files.pythonhosted.org/packages/93/78/6fa8b37da88957cf3ef0e2b1f78253c16af378c0fb3eacce9426cb4b4825/pynmrstar-3.3.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc71d9cf3b43c18f70f62e9f56f3ee655863e969be5eb95d47f5b590c852518e", size = 411354, upload-time = "2025-09-11T16:41:48.954Z" }, + { url = "https://files.pythonhosted.org/packages/86/05/4766472ea2ec587827bb8dbcc9a7995e7d54eaffc85c64110815e0cc784b/pynmrstar-3.3.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7203a028b5dde6ff96cce174d1a08aada79e14646ae64ea01d8e8febef445c0", size = 411646, upload-time = "2025-09-11T16:41:50.184Z" }, + { url = "https://files.pythonhosted.org/packages/5f/94/8a99ce0d498b7e42b8d8f739d82b3eb165c7523914b88076d1eaca434370/pynmrstar-3.3.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d36bff16d4836396e6615eb601761328681e322661764a3bdad37308969e9954", size = 411164, upload-time = "2025-09-11T16:41:51.586Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/f0/62b5a1a723fe183650109407fa56abb433b00aa1c0b9ba555f9c4efec2c6/ruff-0.14.6.tar.gz", hash = "sha256:6f0c742ca6a7783a736b867a263b9a7a80a45ce9bee391eeda296895f1b4e1cc", size = 5669501, upload-time = "2025-11-21T14:26:17.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/d2/7dd544116d107fffb24a0064d41a5d2ed1c9d6372d142f9ba108c8e39207/ruff-0.14.6-py3-none-linux_armv6l.whl", hash = "sha256:d724ac2f1c240dbd01a2ae98db5d1d9a5e1d9e96eba999d1c48e30062df578a3", size = 13326119, upload-time = "2025-11-21T14:25:24.2Z" }, + { url = "https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9f7539ea257aa4d07b7ce87aed580e485c40143f2473ff2f2b75aee003186004", size = 13526007, upload-time = "2025-11-21T14:25:26.906Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7f6007e55b90a2a7e93083ba48a9f23c3158c433591c33ee2e99a49b889c6332", size = 12676572, upload-time = "2025-11-21T14:25:29.826Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/f319e87759949062cfee1b26245048e92e2acce900ad3a909285f9db1859/ruff-0.14.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8e7b9d73d8728b68f632aa8e824ef041d068d231d8dbc7808532d3629a6bef", size = 13140745, upload-time = "2025-11-21T14:25:32.788Z" }, + { url = "https://files.pythonhosted.org/packages/95/d3/248c1efc71a0a8ed4e8e10b4b2266845d7dfc7a0ab64354afe049eaa1310/ruff-0.14.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d50d45d4553a3ebcbd33e7c5e0fe6ca4aafd9a9122492de357205c2c48f00775", size = 13076486, upload-time = "2025-11-21T14:25:35.601Z" }, + { url = "https://files.pythonhosted.org/packages/a5/19/b68d4563fe50eba4b8c92aa842149bb56dd24d198389c0ed12e7faff4f7d/ruff-0.14.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:118548dd121f8a21bfa8ab2c5b80e5b4aed67ead4b7567790962554f38e598ce", size = 13727563, upload-time = "2025-11-21T14:25:38.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/943169436832d4b0e867235abbdb57ce3a82367b47e0280fa7b4eabb7593/ruff-0.14.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:57256efafbfefcb8748df9d1d766062f62b20150691021f8ab79e2d919f7c11f", size = 15199755, upload-time = "2025-11-21T14:25:41.516Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b9/288bb2399860a36d4bb0541cb66cce3c0f4156aaff009dc8499be0c24bf2/ruff-0.14.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff18134841e5c68f8e5df1999a64429a02d5549036b394fafbe410f886e1989d", size = 14850608, upload-time = "2025-11-21T14:25:44.428Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b1/a0d549dd4364e240f37e7d2907e97ee80587480d98c7799d2d8dc7a2f605/ruff-0.14.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c4b7ec1e66a105d5c27bd57fa93203637d66a26d10ca9809dc7fc18ec58440", size = 14118754, upload-time = "2025-11-21T14:25:47.214Z" }, + { url = "https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167843a6f78680746d7e226f255d920aeed5e4ad9c03258094a2d49d3028b105", size = 13949214, upload-time = "2025-11-21T14:25:50.002Z" }, + { url = "https://files.pythonhosted.org/packages/12/27/4dad6c6a77fede9560b7df6802b1b697e97e49ceabe1f12baf3ea20862e9/ruff-0.14.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:16a33af621c9c523b1ae006b1b99b159bf5ac7e4b1f20b85b2572455018e0821", size = 14106112, upload-time = "2025-11-21T14:25:52.841Z" }, + { url = "https://files.pythonhosted.org/packages/6a/db/23e322d7177873eaedea59a7932ca5084ec5b7e20cb30f341ab594130a71/ruff-0.14.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1432ab6e1ae2dc565a7eea707d3b03a0c234ef401482a6f1621bc1f427c2ff55", size = 13035010, upload-time = "2025-11-21T14:25:55.536Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9c/20e21d4d69dbb35e6a1df7691e02f363423658a20a2afacf2a2c011800dc/ruff-0.14.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c55cfbbe7abb61eb914bfd20683d14cdfb38a6d56c6c66efa55ec6570ee4e71", size = 13054082, upload-time = "2025-11-21T14:25:58.625Z" }, + { url = "https://files.pythonhosted.org/packages/66/25/906ee6a0464c3125c8d673c589771a974965c2be1a1e28b5c3b96cb6ef88/ruff-0.14.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:efea3c0f21901a685fff4befda6d61a1bf4cb43de16da87e8226a281d614350b", size = 13303354, upload-time = "2025-11-21T14:26:01.816Z" }, + { url = "https://files.pythonhosted.org/packages/4c/58/60577569e198d56922b7ead07b465f559002b7b11d53f40937e95067ca1c/ruff-0.14.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:344d97172576d75dc6afc0e9243376dbe1668559c72de1864439c4fc95f78185", size = 14054487, upload-time = "2025-11-21T14:26:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/67/0b/8e4e0639e4cc12547f41cb771b0b44ec8225b6b6a93393176d75fe6f7d40/ruff-0.14.6-py3-none-win32.whl", hash = "sha256:00169c0c8b85396516fdd9ce3446c7ca20c2a8f90a77aa945ba6b8f2bfe99e85", size = 13013361, upload-time = "2025-11-21T14:26:08.152Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl", hash = "sha256:390e6480c5e3659f8a4c8d6a0373027820419ac14fa0d2713bd8e6c3e125b8b9", size = 14432087, upload-time = "2025-11-21T14:26:10.891Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1f/93f9b0fad9470e4c829a5bb678da4012f0c710d09331b860ee555216f4ea/ruff-0.14.6-py3-none-win_arm64.whl", hash = "sha256:d43c81fbeae52cfa8728d8766bbf46ee4298c888072105815b392da70ca836b2", size = 13520930, upload-time = "2025-11-21T14:26:13.951Z" }, +] + +[[package]] +name = "scipy" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720, upload-time = "2024-05-23T03:29:26.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076, upload-time = "2024-05-23T03:19:01.687Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232, upload-time = "2024-05-23T03:19:09.089Z" }, + { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202, upload-time = "2024-05-23T03:19:15.138Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335, upload-time = "2024-05-23T03:19:21.984Z" }, + { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728, upload-time = "2024-05-23T03:19:28.225Z" }, + { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588, upload-time = "2024-05-23T03:19:35.661Z" }, + { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805, upload-time = "2024-05-23T03:19:43.081Z" }, + { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687, upload-time = "2024-05-23T03:19:48.799Z" }, + { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638, upload-time = "2024-05-23T03:19:55.104Z" }, + { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931, upload-time = "2024-05-23T03:20:01.82Z" }, + { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145, upload-time = "2024-05-23T03:20:09.173Z" }, + { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227, upload-time = "2024-05-23T03:20:16.433Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301, upload-time = "2024-05-23T03:20:23.538Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348, upload-time = "2024-05-23T03:20:29.885Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062, upload-time = "2024-05-23T03:20:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311, upload-time = "2024-05-23T03:20:42.086Z" }, + { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493, upload-time = "2024-05-23T03:20:48.292Z" }, + { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955, upload-time = "2024-05-23T03:20:55.091Z" }, + { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927, upload-time = "2024-05-23T03:21:01.95Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538, upload-time = "2024-05-23T03:21:07.634Z" }, + { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190, upload-time = "2024-05-23T03:21:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244, upload-time = "2024-05-23T03:21:21.827Z" }, + { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637, upload-time = "2024-05-23T03:21:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440, upload-time = "2024-05-23T03:21:35.888Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +dependencies = [ + { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, + { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, + { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, + { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, + { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "trizod" +version = "0.0.1" +source = { editable = "." } +dependencies = [ + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pandarallel" }, + { name = "pandas" }, + { name = "pynmrstar" }, + { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tqdm" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandarallel" }, + { name = "pandas" }, + { name = "pynmrstar" }, + { name = "scipy" }, + { name = "tqdm" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "ruff" }] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +]