diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..96f82f5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +.venv/ +cache/ +*.db +*.sqlite +*.log +*.gpkg +*.fgb +*.hdf +projects/ +dev/ +winooski/ +.git/ +.github/ +design/ diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..aecd709 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# AWS credentials — leave unset to use IAM role or ~/.aws/credentials +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 + +# Required only when using NHDTiebreaker; not bundled with the package +NHD_GPKG_PATH=/path/to/NHD_H_National_GPKG.gpkg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..76a530f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +name: CI + +on: + push: + branches: [main] + paths: + - "crs_inference/**" + - "tests/**" + - "pyproject.toml" + - "Dockerfile" + - ".github/workflows/ci.yml" + pull_request: + branches: [main] + workflow_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v3 + with: + python-version: "3.12" + - run: uv sync --frozen --extra dev + - run: uv run ruff check . + - run: uv run ruff format --check . + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v3 + with: + python-version: "3.12" + - run: uv sync --frozen --extra dev + - run: uv run pytest --cov=crs_inference --cov-report=xml + - uses: codecov/codecov-action@v4 + with: + files: coverage.xml + fail_ci_if_error: false + + docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: docker/setup-buildx-action@v3 + - uses: docker/build-push-action@v6 + with: + context: . + push: false + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.gitignore b/.gitignore index ee9a2c5..c3327d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,80 @@ -# Python-generated files +# Python __pycache__/ *.py[oc] +*.so +*.pyd +*.egg +*.egg-info/ build/ dist/ wheels/ -*.egg-info +__pypackages__/ +MANIFEST # Virtual environments .venv +venv/ +.python-version -# Environment +# Testing & coverage +.pytest_cache/ +.coverage +.coverage.* +coverage.xml +htmlcov/ +.hypothesis/ +.tox/ + +# Type checkers & linters +.mypy_cache/ +.ruff_cache/ +.pytype/ + +# Jupyter +.ipynb_checkpoints/ + +# Environment & secrets .env +.env.* +!.env.example + +# Geospatial data (large files not for version control) +*.gpkg +*.fgb +*.hdf +*.h5 +*.nc +*.tif +*.tiff +*.shp +*.shx +*.dbf +*.prj +*.cpg +*.sbn +*.sbx +*.xml +*.db +*.sqlite + +# Unignore bundled data shipped with the package +!crs_inference/data/*.gpkg + +# Logs & caches +*.log +cache/ + +# Project-specific working directories +projects/ +dev/ + +# OS +.DS_Store +**/.DS_Store +Thumbs.db + +# Editors +.vscode/ +.idea/ +*.swp +*.swo diff --git a/Dockerfile b/Dockerfile index 84b6602..c928db4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,13 @@ -FROM ubuntu:latest - -RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates python3.12 python3.12-venv python3-pip +FROM python:3.12-slim WORKDIR /process -# Install UV -ADD https://astral.sh/uv/install.sh /uv-installer.sh -RUN sh /uv-installer.sh && rm /uv-installer.sh -ENV PATH="/root/.local/bin/:$PATH" +COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv -# Install python dependencies COPY pyproject.toml uv.lock ./ -RUN uv venv .venv -RUN uv sync --frozen --no-install-project +RUN uv sync --frozen --no-install-project --extra ops -# Copy project files -COPY . . +COPY crs_inference/ crs_inference/ +COPY pyproject.toml README.md ./ -# Install the app -RUN uv pip install -e . +RUN uv pip install --no-deps -e . diff --git a/README.md b/README.md index e69de29..8115b47 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,69 @@ +# crs-inference + +Automatically infers the Coordinate Reference System (CRS/EPSG code) for geospatial models that lack explicit CRS metadata. The primary use case is HEC-RAS riverine hydraulic models, but the core engine works with any Shapely geometry. + +The library works by transforming model geometry into each plausible CRS, measuring how much of the geometry overlaps a known geographic boundary, and returning the CRS with the highest overlap. + +## Installation + +```bash +pip install -e . +``` + +For development extras: + +```bash +pip install -e ".[dev]" # pytest, ruff +pip install -e ".[ops]" # matplotlib, pynhd, pystac +``` + +Requires **Python ≥ 3.12**. + +## Quick Start + +```python +from crs_inference import infer_crs, RasParser, Target + +# Parse a HEC-RAS geometry file +parser = RasParser.from_file("path/to/model.g01") +parser.validate() +geometry = parser.parse() # returns a Shapely MultiLineString + +# Build a target using a US county FIPS code +target = Target.from_county("50007") # Chittenden County, VT + +# Infer the CRS +result = infer_crs(geometry, target) + +print(result.crs) # e.g. "EPSG:5646" +print(result.confidence) # overlap fraction, e.g. 0.97 +print(result.method) # "local" | "non_local" | "none" +``` + +You can also build a target from a bounding box or any Shapely geometry: + +```python +from crs_inference import CRSDatabase, Target + +db = CRSDatabase.bundled() +target = Target.from_bbox(-73.2, 44.3, -72.8, 44.6, crs="EPSG:4326", database=db) +``` + +For custom tiebreakers or overlap thresholds, use the engine directly: + +```python +from crs_inference import CRSInferenceEngine +from crs_inference.tiebreakers import NHDTiebreaker + +engine = CRSInferenceEngine( + tiebreakers=[NHDTiebreaker()], + min_overlap=0.05, +) +result = engine.infer(geometry, target) +``` + +## Documentation + +- [How it works](docs/technical_reference.md) +- [Developer guide](docs/developers.md) +- [FAQ](docs/faq.md) diff --git a/catalog-info.yaml b/catalog-info.yaml new file mode 100644 index 0000000..9c57022 --- /dev/null +++ b/catalog-info.yaml @@ -0,0 +1,22 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: crs-inference + title: crs-inference + description: Automatically infers the Coordinate Reference System (CRS/EPSG code) for geometries that lack explicit CRS metadata, with primary support for HEC-RAS hydraulic models. + tags: + - python + - hec-ras + - geospatial + - coordinate-reference-system + - flood-inundation + annotations: + github.com/project-slug: Dewberry/crs_inference + links: + - url: https://github.com/Dewberry/crs_inference + title: GitHub +spec: + type: library + lifecycle: experimental + owner: dewberry + system: flood-inundation-mapping diff --git a/crs_inference/__init__.py b/crs_inference/__init__.py index e69de29..86aa8e2 100644 --- a/crs_inference/__init__.py +++ b/crs_inference/__init__.py @@ -0,0 +1,48 @@ +"""crs_inference: automatic CRS inference for geospatial models.""" + +__version__ = "0.1.0" + +from crs_inference.consts import MIN_OVERLAP_PCT +from crs_inference.database import CRSDatabase +from crs_inference.engine import CRSInferenceEngine +from crs_inference.errors import ( + EmptyGeometryError, + HTMLDownloadError, + ModelTooLargeError, +) +from crs_inference.parsers.ras import RasParser +from crs_inference.result import InferenceResult +from crs_inference.target import Target +from crs_inference.tiebreakers import NHDTiebreaker, SmallestCodeTiebreaker + + +def infer_crs( + geometry, + target: Target, + *, + tiebreakers=None, + min_overlap: float | None = None, +) -> InferenceResult: + """Infer the CRS for a geometry given a target boundary.""" + kwargs = {} + if tiebreakers is not None: + kwargs["tiebreakers"] = tiebreakers + if min_overlap is not None: + kwargs["min_overlap"] = min_overlap + return CRSInferenceEngine(**kwargs).infer(geometry, target) + + +__all__ = [ + "MIN_OVERLAP_PCT", + "CRSDatabase", + "CRSInferenceEngine", + "EmptyGeometryError", + "HTMLDownloadError", + "InferenceResult", + "ModelTooLargeError", + "NHDTiebreaker", + "RasParser", + "SmallestCodeTiebreaker", + "Target", + "infer_crs", +] diff --git a/crs_inference/consts.py b/crs_inference/consts.py index d3f12c2..d54e45c 100644 --- a/crs_inference/consts.py +++ b/crs_inference/consts.py @@ -1,3 +1,12 @@ """Shared project constants.""" +import os +from pathlib import Path + LATENT_CRS = "EPSG:4326" +MIN_OVERLAP_PCT: float = float(os.getenv("MIN_OVERLAP_PCT", 0.0011)) + +# Path to the NHD National GeoPackage; not bundled. Set NHD_GPKG_PATH in the environment +# or pass a path directly to NHDTiebreaker. +NHD_GPKG_PATH: Path | None = Path(p) if (p := os.getenv("NHD_GPKG_PATH")) else None +RAS_SIZE_LIMIT: int = int(os.getenv("RAS_SIZE_LIMIT", int(1e10))) diff --git a/crs_inference/data_models.py b/crs_inference/data_models.py deleted file mode 100644 index ef32b44..0000000 --- a/crs_inference/data_models.py +++ /dev/null @@ -1,240 +0,0 @@ -"""Classes for various package processes.""" - -import json -import logging -import os -import sys -import warnings -from functools import cached_property - -import geopandas as gpd -import shapely -from pyproj import CRS, Transformer -from shapely.geometry import MultiLineString, Polygon -from shapely.geometry.base import BaseGeometry - -from crs_inference.consts import LATENT_CRS -from crs_inference.errors import EmptyGeometryError, HTMLDownloadError, OutOfMemoryError -from crs_inference.ras import Reach, search_contents -from crs_inference.utils import count_intersections, get_ras_crs, get_s3_content - -warnings.filterwarnings("ignore", module="pyogrio") - -logger = logging.getLogger(__name__) - - -class Target: - """Class representing some geometry with which another geometry falls.""" - - def __init__(self, geometry: Polygon, crs: CRS): - self.crs = LATENT_CRS - if crs != self.crs: - transformer = Transformer.from_crs(crs, self.crs, always_xy=True) - geometry = shapely.ops.transform(transformer.transform, self.geometry) - self.geometry = geometry - self.intersect_df = self.intersect_crs() - - def intersect_crs(self): - """Find crs that are applicable in this area.""" - ras_crs = get_ras_crs() - ras_crs["local"] = ras_crs.geometry.intersects(self.geometry) - return ras_crs - - @property - def local_projections(self) -> list[CRS]: - """Get CRS with area of use containing the geometry.""" - local_projections = self.intersect_df[self.intersect_df["local"]][["auth_name", "code"]].values - return [f"{i}:{j}" for i, j in local_projections] - - @property - def non_local_projections(self) -> list[CRS]: - """Get CRS with area of use containing the geometry.""" - non_local_projections = self.intersect_df[~self.intersect_df["local"]][["auth_name", "code"]].values - return [f"{i}:{j}" for i, j in non_local_projections] - - -class Geometry: - """Class representing some geospatial geometry for which the CRS should be identified.""" - - def __init__(self, geometry): - self.geometry = geometry - - def infer_crs(self, target: Target) -> str: - """Find the crs leading to most overlap between geometry and target.""" - logger.info(f"Inferring CRS on process ID {os.getpid()}") - best_crs, _, overlap_df = self.find_most_overlap(target, target.local_projections) - if best_crs is not None: - logger.info(f"Selected CRS {best_crs} on process ID {os.getpid()}") - return best_crs, overlap_df - logger.info(f"Trying backup CRS on process ID {os.getpid()}") - best_crs, _, overlap_df = self.find_most_overlap(target, target.non_local_projections) - if best_crs is not None: - logger.info(f"Selected CRS {best_crs} on process ID {os.getpid()}") - else: - logger.info(f"No valid CRS found on process ID {os.getpid()}") - return best_crs, overlap_df - - def reproject(self, from_crs: CRS, to_crs: CRS) -> BaseGeometry: - """Reproject the geometry from one crs to another.""" - transformer = Transformer.from_crs(from_crs, to_crs, always_xy=True) - return shapely.ops.transform(transformer.transform, self.geometry) - - def find_most_overlap(self, target: Target, crs_list: list[str]) -> tuple: - """Find the CRS that yields the most overlap between geometry and target.""" - overlap_pcts = [] - authorities = [] - codes = [] - geoms = [] - transform_caches = TransformerCache() - for crs in crs_list: - projected_geom = transform_caches.transform(self.geometry, crs) - if projected_geom.is_valid: - overlap = projected_geom.intersection(target.geometry).length / projected_geom.length - overlap_pcts.append(overlap) - authorities.append(crs.split(":")[0]) - codes.append(crs.split(":")[1]) - geoms.append(projected_geom) - overlap_df = gpd.GeoDataFrame( - {"authority": authorities, "code": codes, "overlap_pct": overlap_pcts, "geometry": geoms}, crs=LATENT_CRS - ) - overlap_df["overlap_pct"] = overlap_df["overlap_pct"].round(3) - overlap_df = overlap_df.sort_values(["overlap_pct", "code"], ascending=[False, True]) - best_crs = overlap_df[ - (overlap_df["overlap_pct"] == overlap_df["overlap_pct"].max()) & (overlap_df["overlap_pct"] != 0) - ].copy() - if len(best_crs) == 0: - return None, 0, overlap_df[overlap_df["overlap_pct"] > 0].copy() - if len(best_crs) > 1: # tie break - best_crs["intersections"] = best_crs.to_crs("EPSG:4269").geometry.map(lambda r: count_intersections(r)) - best_crs = best_crs[best_crs["intersections"] == best_crs["intersections"].max()].copy() - if len(best_crs) > 1: - best_crs["code_num"] = best_crs["code"].apply(lambda x: int(x.split(":")[-1])) - best_crs = best_crs[best_crs["code_num"] == best_crs["code_num"].min()].copy() - - best_crs = best_crs.iloc[0] - if best_crs.overlap_pct < 0.0011: # 0.1% - return None, 0, overlap_df[overlap_df["overlap_pct"] > 0].copy() - else: - return ( - f"{best_crs.authority}:{best_crs.code}", - best_crs.overlap_pct, - overlap_df[overlap_df["overlap_pct"] > 0].copy(), - ) - - -class RasGeometry(Geometry): - """Stripped down class for HEC-RAS geometry.""" - - def __init__(self, contents: str): - self.contents = contents.splitlines() - - @classmethod - def from_s3(cls, href: str): - """Load a geometry file from AWS S3.""" - logger.info(f"Loading RAS geometry at {href}") - contents = get_s3_content(href) - return cls(contents) - - @classmethod - def from_file(cls, href: str): - """Load a geometry file from a local file.""" - logger.info(f"Loading RAS geometry at {href}") - with open(href) as f: - contents = f.read().splitlines() - - return cls(contents) - - @cached_property - def reaches(self) -> dict: - """A dictionary of the reaches contained in the HEC-RAS geometry file.""" - river_reaches = search_contents(self.contents, "River Reach", expect_one=False) - reaches = [] - for river_reach in river_reaches: - reaches.append(Reach(self.contents, river_reach)) - return reaches - - @cached_property - def geometry(self) -> MultiLineString: - """Geometry of the ras centerline.""" - return MultiLineString([r.linestring for r in self.reaches]) - - @property - def invalid_geometry(self) -> bool: - """Check if geometry is valid.""" - return self.geometry.is_empty - - def validate(self): - """Check if geometry is valid and raise informative error.""" - if self.invalid_geometry: - if any(["" in i.lower() for i in self.contents]): - raise HTMLDownloadError() - else: - raise EmptyGeometryError() - if sys.getsizeof(self.contents) > 1000000: - raise OutOfMemoryError(sys.getsizeof(self.contents)) - - -class CountyTargetCache: - """A class to cache county Target classes for speed and reusability.""" - - _instance = None - - def __new__(cls): - if cls._instance is None: - cls._instance = super().__new__(cls) - cls._instance.gdf = gpd.read_file("crs_inference/data/counties.gpkg", layer="counties") - cls._instance.cache = {} - return cls._instance - - def create_target(self, county: str | list) -> Target: - """Load a target from a county boundary.""" - logger.info(f"Creating new target for {str(county)}") - if isinstance(county, list): - geom = self.gdf[self.gdf["GEOID"].isin(county)].union_all() - elif isinstance(county, str): - geom = self.gdf[self.gdf["GEOID"] == county].geometry.iloc[0] - else: - raise ValueError(f"county should be list or str, but got {type(county)}") - - return Target(geom, self.gdf.crs) - - def get_county_target(self, county: str | list) -> Target: - """Get or create a Target for a county.""" - if isinstance(county, list): - idx_str = json.dumps(county) - elif isinstance(county, str): - idx_str = county - else: - raise ValueError(f"county should be list or str, but got {type(county)}") - - if idx_str not in self.cache: - self.cache[idx_str] = self.create_target(county) - logging.info(f"Target cache has size {len(self.cache)}") - - return self.cache[idx_str] - - -class TransformerCache: - """Cache all the CRS transformers.""" - - _instance = None - - def __new__(cls): - if cls._instance is None: - cls._instance = super().__new__(cls) - crs_gdf = get_ras_crs() - cls.transformers = {} - cls.pipelines = {} - for ind, r in crs_gdf.iterrows(): - name = f"{r.auth_name}:{r.code}" - cls.pipelines[name] = r.proj4 - return cls._instance - - def transform(self, geometry: BaseGeometry, crs: str) -> BaseGeometry: - """Use a cached transform to transform a geometry.""" - if crs not in self.transformers: - pipeline = self.pipelines[crs] - if pipeline is None or pipeline == "+proj=noop": - return geometry - self.transformers[crs] = Transformer.from_pipeline(pipeline) - return shapely.ops.transform(self.transformers[crs].transform, geometry) diff --git a/crs_inference/database.py b/crs_inference/database.py new file mode 100644 index 0000000..23208cb --- /dev/null +++ b/crs_inference/database.py @@ -0,0 +1,46 @@ +from functools import cached_property +from pathlib import Path + +import geopandas as gpd +import pandas as pd +from shapely.geometry.base import BaseGeometry + +_BUNDLED = Path(__file__).parent / "data" / "proj.gpkg" + + +class CRSDatabase: + """Holds the set of candidate CRS and filters them by geographic area of use.""" + + def __init__(self, path: Path = _BUNDLED): + self._path = path + + @cached_property + def _gdf(self) -> gpd.GeoDataFrame: + return gpd.read_file(self._path) + + @classmethod + def bundled(cls) -> "CRSDatabase": + """Return the bundled default CRS database.""" + return cls(_BUNDLED) + + @classmethod + def from_file(cls, path: Path) -> "CRSDatabase": + """Return a CRS database loaded from path.""" + return cls(path) + + def candidates_for(self, geometry: BaseGeometry) -> tuple[list[str], list[str]]: + """Return (local_crs, non_local_crs) EPSG/ESRI strings for the given geometry.""" + gdf = self._gdf + local_mask = gdf.geometry.intersects(geometry) + local = [f"{r.auth_name}:{r.code}" for _, r in gdf[local_mask].iterrows()] + non_local = [f"{r.auth_name}:{r.code}" for _, r in gdf[~local_mask].iterrows()] + return local, non_local + + def pipeline_for(self, crs: str) -> str | None: + """Return the proj4 pipeline string for a given 'AUTH:CODE' identifier.""" + auth, code = crs.split(":", 1) + row = self._gdf[(self._gdf["auth_name"] == auth) & (self._gdf["code"] == code)] + if row.empty: + return None + val = row.iloc[0]["proj4"] + return None if pd.isna(val) else val diff --git a/crs_inference/engine.py b/crs_inference/engine.py new file mode 100644 index 0000000..58484c7 --- /dev/null +++ b/crs_inference/engine.py @@ -0,0 +1,79 @@ +import logging +import os +from collections.abc import Sequence + +import geopandas as gpd +from shapely.geometry.base import BaseGeometry + +from crs_inference.consts import LATENT_CRS, MIN_OVERLAP_PCT +from crs_inference.result import InferenceResult +from crs_inference.target import Target +from crs_inference.tiebreakers import SmallestCodeTiebreaker, Tiebreaker +from crs_inference.transformer import TransformerCache + +logger = logging.getLogger(__name__) + + +class CRSInferenceEngine: + """Stateless CRS scoring engine. Thread-safe; share a single instance across workers.""" + + def __init__( + self, + tiebreakers: Sequence[Tiebreaker] | None = None, + min_overlap: float = MIN_OVERLAP_PCT, + ): + self._tiebreakers = list(tiebreakers) if tiebreakers else [SmallestCodeTiebreaker()] + self._min_overlap = min_overlap + self._transformers = TransformerCache() + + def infer(self, geometry: BaseGeometry, target: Target) -> InferenceResult: + """Run inference: try local CRS first, fall back to non-local.""" + logger.debug("infer pid=%d", os.getpid()) + local_result = self._score(geometry, target, target.local_projections) + if local_result.crs is not None: + return local_result + return self._score(geometry, target, target.non_local_projections) + + def _score(self, geometry: BaseGeometry, target: Target, crs_list: list[str]) -> InferenceResult: + """Score each CRS in crs_list and return the best result.""" + rows = [] + for crs in crs_list: + projected = self._transformers.transform(geometry, crs) + if not projected.is_valid or projected.length == 0: + continue + overlap = projected.intersection(target.geometry).length / projected.length + auth, code = crs.split(":", 1) + rows.append( + { + "authority": auth, + "code": code, + "overlap_pct": round(overlap, 4), + "geometry": projected, + } + ) + + if not rows: + return InferenceResult(crs=None, confidence=0.0, method="none", candidates=gpd.GeoDataFrame()) + + candidates = gpd.GeoDataFrame(rows, crs=LATENT_CRS) + candidates.sort_values(["overlap_pct", "code"], ascending=[False, True], inplace=True) + positive: gpd.GeoDataFrame = candidates[candidates["overlap_pct"] > 0].copy() # type: ignore[assignment] + + best: gpd.GeoDataFrame = candidates[candidates["overlap_pct"] == candidates["overlap_pct"].max()].copy() # type: ignore[assignment] + if best.empty or best.iloc[0]["overlap_pct"] < self._min_overlap: + return InferenceResult(crs=None, confidence=0.0, method="none", candidates=positive) + + if len(best) > 1: + for tb in self._tiebreakers: + best = tb.rank(best) + if len(best) == 1: + break + + winner = best.iloc[0] + method = "local" if crs_list is target.local_projections else "non_local" + return InferenceResult( + crs=f"{winner['authority']}:{winner['code']}", + confidence=float(winner["overlap_pct"]), + method=method, + candidates=positive, + ) diff --git a/crs_inference/errors.py b/crs_inference/errors.py index 1ca565d..8c2c7ad 100644 --- a/crs_inference/errors.py +++ b/crs_inference/errors.py @@ -15,8 +15,8 @@ def __init__(self): super().__init__("Download contained '' tag indicating a bad download.") -class OutOfMemoryError(Exception): - """Raised when a geometry might consume too much memory when reprojected many times.""" +class ModelTooLargeError(Exception): + """Raised when a geometry file exceeds the size limit.""" def __init__(self, size: int): - super().__init__(f"Geometry had size {size / 1e6} MB.") + super().__init__(f"Geometry file had size {size / 1e6:.1f} MB, which exceeds the limit.") diff --git a/crs_inference/inference.py b/crs_inference/inference.py deleted file mode 100644 index e69de29..0000000 diff --git a/crs_inference/loaders/__init__.py b/crs_inference/loaders/__init__.py new file mode 100644 index 0000000..cb18166 --- /dev/null +++ b/crs_inference/loaders/__init__.py @@ -0,0 +1,3 @@ +from crs_inference.loaders.s3 import get_s3_content + +__all__ = ["get_s3_content"] diff --git a/crs_inference/loaders/s3.py b/crs_inference/loaders/s3.py new file mode 100644 index 0000000..27f96b6 --- /dev/null +++ b/crs_inference/loaders/s3.py @@ -0,0 +1,50 @@ +import json +import re +from functools import lru_cache +from urllib.parse import urlparse + +import boto3 + + +@lru_cache(maxsize=1) +def _init_s3_resources() -> tuple: + """Establish a boto3 session and return (session, s3_client, s3_resource).""" + session = boto3.Session() + return session, session.client("s3"), session.resource("s3") + + +def split_uri(uri: str) -> tuple[str, str]: + """Split an s3:// URI into (bucket, key).""" + parsed = urlparse(uri) + return parsed.netloc, parsed.path.lstrip("/") + + +def get_s3_content(uri: str) -> str: + """Download and decode a text file from S3.""" + bucket, key = split_uri(uri) + _, client, _ = _init_s3_resources() + result = client.get_object(Bucket=bucket, Key=key) + return result["Body"].read().decode() + + +def get_json_s3(uri: str) -> dict: + """Download and parse a JSON file from S3.""" + return json.loads(get_s3_content(uri)) + + +def search_s3(uri: str, regex_str: str) -> list[str]: + """Search S3 for object keys matching regex_str under the given prefix URI.""" + bucket, prefix = split_uri(uri) + _, s3_client, _ = _init_s3_resources() + pattern = re.compile(regex_str, re.IGNORECASE) + + results = [] + kwargs: dict = {"Bucket": bucket, "Prefix": prefix} + while True: + resp = s3_client.list_objects_v2(**kwargs) + results += [obj["Key"] for obj in resp.get("Contents", []) if pattern.search(obj["Key"])] + try: + kwargs["ContinuationToken"] = resp["NextContinuationToken"] + except KeyError: + break + return results diff --git a/crs_inference/parsers/__init__.py b/crs_inference/parsers/__init__.py new file mode 100644 index 0000000..d9e9962 --- /dev/null +++ b/crs_inference/parsers/__init__.py @@ -0,0 +1,3 @@ +from crs_inference.parsers.ras import RasParser + +__all__ = ["RasParser"] diff --git a/crs_inference/parsers/base.py b/crs_inference/parsers/base.py new file mode 100644 index 0000000..6388df9 --- /dev/null +++ b/crs_inference/parsers/base.py @@ -0,0 +1,15 @@ +from typing import Protocol + +from shapely.geometry.base import BaseGeometry + + +class GeometryParser(Protocol): + """Parse a source file/string into a shapely geometry for CRS inference. + + Protocol (structural subtyping) rather than ABC: parsers don't need to + import or inherit from this class — they just need matching method signatures. + Type checkers enforce the contract statically; no runtime coupling required. + """ + + def parse(self) -> BaseGeometry: ... + def validate(self) -> None: ... diff --git a/crs_inference/parsers/ras.py b/crs_inference/parsers/ras.py new file mode 100644 index 0000000..8c90f1a --- /dev/null +++ b/crs_inference/parsers/ras.py @@ -0,0 +1,177 @@ +import math +from functools import cached_property +from pathlib import Path +from typing import Literal, overload + +from shapely.geometry import LineString, MultiLineString + +from crs_inference.consts import RAS_SIZE_LIMIT +from crs_inference.errors import ( + EmptyGeometryError, + HTMLDownloadError, + ModelTooLargeError, +) + + +@overload +def _search_contents(lines: list, search_string: str, token: str = ..., *, expect_one: Literal[True] = ...) -> str: ... +@overload +def _search_contents(lines: list, search_string: str, token: str = ..., *, expect_one: Literal[False]) -> list[str]: ... +def _search_contents(lines: list, search_string: str, token: str = "=", *, expect_one: bool = True) -> str | list[str]: + """Split each line by token and return the second half when search_string appears in the first half.""" + results = [] + for line in lines: + if f"{search_string}{token}" in line: + results.append(token.join(line.split(token)[1:])) + if expect_one and len(results) > 1: + raise ValueError(f"expected 1 result, got {len(results)}") + elif expect_one and len(results) == 0: + raise ValueError("expected 1 result, no results found") + elif expect_one: + return results[0] + return results + + +def _handle_spaces_around_equals(line: str, lines: list[str]) -> str: + """Return line with or without a space after '=' depending on what appears in lines.""" + if line in lines: + return line + if "= " in line and line.replace("= ", "=") in lines: + return line.replace("= ", "=") + return line.replace("=", "= ") + + +def _handle_spaces(line: str, lines: list[str]) -> str: + """Find a line in lines, trying common space-around-equals variants.""" + if line in lines: + return line + if _handle_spaces_around_equals(line.rstrip(" "), lines) in lines: + return _handle_spaces_around_equals(line.rstrip(" "), lines) + if _handle_spaces_around_equals(line + " ", lines) in lines: + return _handle_spaces_around_equals(line + " ", lines) + raise ValueError(f"line: {line} not found in lines") + + +def _text_block_from_start_end_str( + start_str: str, end_strs: list[str], lines: list, additional_lines: int = 0 +) -> list[str]: + """Return lines from the exact match of start_str until a line containing any end_str.""" + start_str = _handle_spaces(start_str, lines) + start_index = lines.index(start_str) + end_index = len(lines) + for line in lines[start_index + 1 :]: + if end_index != len(lines): + break + for end_str in end_strs: + if end_str in line: + end_index = lines.index(line) + additional_lines + break + return lines[start_index:end_index] + + +def _text_block_from_start_str_length(start_str: str, number_of_lines: int, lines: list) -> list[str]: + """Return number_of_lines lines immediately after the exact match of start_str.""" + start_str = _handle_spaces(start_str, lines) + results = [] + in_block = False + for line in lines: + if line == start_str: + in_block = True + continue + if in_block: + if len(results) >= number_of_lines: + return results + results.append(line) + return results + + +def _data_pairs_from_text_block(lines: list[str], width: int) -> list[tuple[float, float]]: + """Split lines at given width to get paired data strings and convert to float tuples.""" + pairs = [] + for line in lines: + for i in range(0, len(line), width): + x = line[i : int(i + width / 2)] + y = line[int(i + width / 2) : int(i + width)] + pairs.append((float(x), float(y))) + return pairs + + +class _Reach: + """One river reach parsed from a HEC-RAS geometry file.""" + + def __init__(self, ras_data: list, river_reach: str): + reach_lines = _text_block_from_start_end_str(f"River Reach={river_reach}", ["River Reach"], ras_data, -1) + self.ras_data = reach_lines + self.river_reach = river_reach + self.river = river_reach.split(",")[0].rstrip() + self.reach = river_reach.split(",")[1].rstrip() + + @cached_property + def coords(self) -> list[tuple[float, float]]: + """Return the coordinate pairs for this reach.""" + lines = _text_block_from_start_str_length( + f"Reach XY= {self.number_of_coords} ", + math.ceil(self.number_of_coords / 2), + self.ras_data, + ) + return _data_pairs_from_text_block(lines, 32) + + @cached_property + def number_of_coords(self) -> int: + """Return the number of coordinates in this reach.""" + return int(_search_contents(self.ras_data, "Reach XY")) + + @cached_property + def linestring(self) -> LineString: + """Return the reach centerline as a LineString.""" + return LineString(self.coords) + + +class RasParser: + """Parse a HEC-RAS geometry (.g##) file into a MultiLineString centerline.""" + + def __init__(self, contents: str): + self._lines = contents.splitlines() + + @classmethod + def from_string(cls, contents: str) -> "RasParser": + """Build a RasParser from a string of file contents.""" + return cls(contents) + + @classmethod + def from_file(cls, path: Path | str) -> "RasParser": + """Build a RasParser by reading a local file.""" + with open(path) as f: + return cls(f.read()) + + @classmethod + def from_s3(cls, uri: str) -> "RasParser": + """Build a RasParser by downloading a file from S3.""" + from crs_inference.loaders.s3 import get_s3_content + + return cls(get_s3_content(uri)) + + def validate(self) -> None: + """Raise an error if the file is too large, empty, or appears to be an HTML error page.""" + total_size = sum(len(line) for line in self._lines) + if total_size > RAS_SIZE_LIMIT: + raise ModelTooLargeError(total_size) + if self.parse().is_empty: + if any("" in line.lower() for line in self._lines): + raise HTMLDownloadError() + raise EmptyGeometryError() + + def parse(self) -> MultiLineString: + """Return the model centerline geometry.""" + return self.geometry + + @cached_property + def reaches(self) -> list[_Reach]: + """Return a list of Reach objects parsed from the file.""" + names = _search_contents(self._lines, "River Reach", expect_one=False) + return [_Reach(self._lines, name) for name in names] + + @cached_property + def geometry(self) -> MultiLineString: + """Return the full model centerline as a MultiLineString.""" + return MultiLineString([r.linestring for r in self.reaches]) diff --git a/crs_inference/ras.py b/crs_inference/ras.py deleted file mode 100644 index ef800bd..0000000 --- a/crs_inference/ras.py +++ /dev/null @@ -1,130 +0,0 @@ -import math -from functools import cached_property - -import shapely -import shapely.ops -from pyproj import CRS, Transformer -from shapely import LineString, MultiLineString -from shapely.geometry import shape - - -def search_contents(lines: list, search_string: str, token: str = "=", expect_one: bool = True) -> list[str]: - """Split a line by a token and returns the second half of the line if the search_string is found in the first half.""" - results = [] - for line in lines: - if f"{search_string}{token}" in line: - results.append(line.split(token)[1]) - - if expect_one and len(results) > 1: - raise ValueError(f"expected 1 result, got {len(results)}") - elif expect_one and len(results) == 0: - raise ValueError("expected 1 result, no results found") - elif expect_one and len(results) == 1: - return results[0] - else: - return results - - -def text_block_from_start_end_str( - start_str: str, end_strs: list[str], lines: list, additional_lines: int = 0 -) -> list[str]: - """Search for an exact match to the start_str and return all lines from there to a line that contains the end_str.""" - start_str = handle_spaces(start_str, lines) - - start_index = lines.index(start_str) - end_index = len(lines) - for line in lines[start_index + 1 :]: - if end_index != len(lines): - break - for end_str in end_strs: - if end_str in line: - end_index = lines.index(line) + additional_lines - break - return lines[start_index:end_index] - - -def text_block_from_start_str_length(start_str: str, number_of_lines: int, lines: list) -> list[str]: - """Search for an exact match to the start token and return a number of lines equal to number_of_lines.""" - start_str = handle_spaces(start_str, lines) - results = [] - in_block = False - for line in lines: - if line == start_str: - in_block = True - continue - if in_block: - if len(results) >= number_of_lines: - return results - else: - results.append(line) - - -def data_pairs_from_text_block(lines: list[str], width: int) -> list[tuple[float]]: - """Split lines at given width to get paired data string. Split the string in half and convert to tuple of floats.""" - pairs = [] - for line in lines: - for i in range(0, len(line), width): - x = line[i : int(i + width / 2)] - y = line[int(i + width / 2) : int(i + width)] - pairs.append((float(x), float(y))) - - return pairs - - -def handle_spaces(line: str, lines: list[str]): - """Handle spaces in the line.""" - if line in lines: - return line - elif handle_spaces_arround_equals(line.rstrip(" "), lines): - return handle_spaces_arround_equals(line.rstrip(" "), lines) - elif handle_spaces_arround_equals(line + " ", lines) in lines: - return handle_spaces_arround_equals(line + " ", lines) - else: - raise ValueError(f"line: {line} not found in lines") - - -def handle_spaces_arround_equals(line: str, lines: list[str]) -> str: - """Handle spaces in the line.""" - if line in lines: - return line - elif "= " in line: - if line.replace("= ", "=") in lines: - return line.replace("= ", "=") - else: - return line.replace("=", "= ") - - -class Reach: - def __init__(self, ras_data: list, river_reach: str): - reach_lines = text_block_from_start_end_str(f"River Reach={river_reach}", ["River Reach"], ras_data, -1) - self.ras_data = reach_lines - self.river_reach = river_reach - self.river = river_reach.split(",")[0].rstrip() - self.reach = river_reach.split(",")[1].rstrip() - - @cached_property - def coords(self): - """Reach coordinates.""" - lines = text_block_from_start_str_length( - f"Reach XY= {self.number_of_coords} ", - math.ceil(self.number_of_coords / 2), - self.ras_data, - ) - return data_pairs_from_text_block(lines, 32) - - @cached_property - def number_of_coords(self): - """Number of coordinates in reach.""" - return int(search_contents(self.ras_data, "Reach XY")) - - @cached_property - def linestring(self): - return LineString(self.coords) - - -def measure_intersection(authority: str, code: str, geom_1: MultiLineString, crs_2: str, geom_2: shape) -> float: - """Measure the overlap between an unprojected geometry (#1) and a projected one (#2).""" - tmp_crs = CRS.from_authority(authority, code) - transformer = Transformer.from_crs(tmp_crs, crs_2, always_xy=True) - projected_centerline = shapely.ops.transform(transformer.transform, geom_1) - return projected_centerline.intersection(geom_2).length diff --git a/crs_inference/result.py b/crs_inference/result.py new file mode 100644 index 0000000..b074f53 --- /dev/null +++ b/crs_inference/result.py @@ -0,0 +1,12 @@ +from dataclasses import dataclass, field +from typing import Literal + +import geopandas as gpd + + +@dataclass(frozen=True) +class InferenceResult: + crs: str | None + confidence: float + method: Literal["local", "non_local", "none"] + candidates: gpd.GeoDataFrame = field(compare=False) diff --git a/crs_inference/target.py b/crs_inference/target.py new file mode 100644 index 0000000..ad7a7db --- /dev/null +++ b/crs_inference/target.py @@ -0,0 +1,65 @@ +from pathlib import Path + +import geopandas as gpd +import shapely.ops +from pyproj import Transformer +from shapely.geometry import box +from shapely.geometry.base import BaseGeometry + +from crs_inference.consts import LATENT_CRS +from crs_inference.database import CRSDatabase + +_COUNTIES = Path(__file__).parent / "data" / "counties.gpkg" + + +class Target: + """A geographic boundary within which CRS inference is constrained.""" + + def __init__(self, geometry: BaseGeometry, database: CRSDatabase | None = None): + self.geometry = geometry + self._db = database or CRSDatabase.bundled() + self.local_projections, self.non_local_projections = self._db.candidates_for(geometry) + + @classmethod + def from_geometry( + cls, + geometry: BaseGeometry, + crs: str = LATENT_CRS, + database: CRSDatabase | None = None, + ) -> "Target": + """Build a Target from any shapely geometry, reprojecting to EPSG:4326 if needed.""" + if crs != LATENT_CRS: + t = Transformer.from_crs(crs, LATENT_CRS, always_xy=True) + geometry = shapely.ops.transform(t.transform, geometry) + return cls(geometry, database) + + @classmethod + def from_bbox( + cls, + minx: float, + miny: float, + maxx: float, + maxy: float, + crs: str = LATENT_CRS, + database: CRSDatabase | None = None, + ) -> "Target": + """Build a Target from a bounding box.""" + return cls.from_geometry(box(minx, miny, maxx, maxy), crs=crs, database=database) + + @classmethod + def from_county(cls, fips: str | list[str], database: CRSDatabase | None = None) -> "Target": + """Build a Target from a US county FIPS code or list of FIPS codes.""" + gdf = gpd.read_file(_COUNTIES, layer="counties") + if isinstance(fips, list): + geom = gdf[gdf["GEOID"].isin(fips)].union_all() + else: + geom = gdf[gdf["GEOID"] == fips].geometry.iloc[0] + assert gdf.crs is not None + crs_str = f"EPSG:{gdf.crs.to_epsg()}" + return cls.from_geometry(geom, crs=crs_str, database=database) + + @classmethod + def from_geodataframe(cls, gdf: gpd.GeoDataFrame, database: CRSDatabase | None = None) -> "Target": + """Build a Target from the union of all geometries in a GeoDataFrame.""" + assert gdf.crs is not None + return cls.from_geometry(gdf.union_all(), crs=gdf.crs.to_string(), database=database) diff --git a/crs_inference/tiebreakers.py b/crs_inference/tiebreakers.py new file mode 100644 index 0000000..483300c --- /dev/null +++ b/crs_inference/tiebreakers.py @@ -0,0 +1,46 @@ +from pathlib import Path +from typing import Protocol + +import geopandas as gpd + + +class Tiebreaker(Protocol): + """Rank tied CRS candidates. Return the GeoDataFrame filtered to the winner(s).""" + + def rank(self, candidates: gpd.GeoDataFrame) -> gpd.GeoDataFrame: ... + + +class SmallestCodeTiebreaker: + """Always-available fallback: prefer the numerically smallest authority code.""" + + def rank(self, candidates: gpd.GeoDataFrame) -> gpd.GeoDataFrame: + """Return candidates filtered to the row with the smallest numeric code.""" + candidates = candidates.copy() + candidates["_code_num"] = candidates["code"].astype(int) + return candidates[candidates["_code_num"] == candidates["_code_num"].min()] # type: ignore[return-value] + + +class NHDTiebreaker: + """Count NHD flowline intersections. Requires the national NHD GeoPackage.""" + + def __init__(self, nhd_path: Path | None = None): + from crs_inference.consts import NHD_GPKG_PATH + + resolved = nhd_path or NHD_GPKG_PATH + if resolved is None: + raise ValueError("nhd_path must be provided or NHD_GPKG_PATH must be set in the environment") + self.nhd_path = Path(resolved) + + def rank(self, candidates: gpd.GeoDataFrame) -> gpd.GeoDataFrame: + """Return candidates filtered to the row with the most NHD flowline intersections.""" + candidates = candidates.copy() + in_4269 = candidates.to_crs("EPSG:4269") + candidates["_nhd_count"] = in_4269.geometry.map(self._count) + return candidates[candidates["_nhd_count"] == candidates["_nhd_count"].max()] # type: ignore[return-value] + + def _count(self, geom) -> int: + """Count distinct NHD flowline segments intersecting geom.""" + rows = gpd.read_file(self.nhd_path, layer="NHDFlowline", mask=geom) + if len(rows) == 0: + return 0 + return len(rows.intersection(geom).explode()) diff --git a/crs_inference/transformer.py b/crs_inference/transformer.py new file mode 100644 index 0000000..92604d1 --- /dev/null +++ b/crs_inference/transformer.py @@ -0,0 +1,26 @@ +import shapely.ops +from pyproj import Transformer +from shapely.geometry.base import BaseGeometry + +from crs_inference.database import CRSDatabase + + +class TransformerCache: + """Cache pyproj transformers by CRS string to avoid repeated pipeline parsing.""" + + def __init__(self, database: CRSDatabase | None = None): + self._db = database or CRSDatabase.bundled() + self._transformers: dict[str, Transformer | None] = {} + + def transform(self, geometry: BaseGeometry, crs: str) -> BaseGeometry: + """Transform geometry from crs to EPSG:4326 using a cached transformer.""" + if crs not in self._transformers: + pipeline = self._db.pipeline_for(crs) + if pipeline is None or pipeline == "+proj=noop": + self._transformers[crs] = None + else: + self._transformers[crs] = Transformer.from_pipeline(pipeline) + transformer = self._transformers[crs] + if transformer is None: + return geometry + return shapely.ops.transform(transformer.transform, geometry) diff --git a/crs_inference/utils.py b/crs_inference/utils.py deleted file mode 100644 index 15d4513..0000000 --- a/crs_inference/utils.py +++ /dev/null @@ -1,138 +0,0 @@ -import json -import os -import re -from functools import lru_cache -from urllib.parse import urlparse - -import boto3 -import botocore -import geopandas as gpd -from obstore.store import S3Store - - -@lru_cache -def get_ras_crs() -> list: - """Load the HEC-RAS db and convert all crs to pyproj crs.""" - return gpd.read_file("crs_inference/data/proj.gpkg") - - -@lru_cache -def load_counties(): - """Load the county geopackage.""" - return gpd.read_file("crs_inference/data/counties.gpkg", layer="counties") - - -def count_intersections(geom): - """Count how many times a geometry intersects NHD.""" - filtered = gpd.read_file("NHD_H_National_GPKG.gpkg", layer="NHDFlowline", mask=geom) - if len(filtered) == 0: - return 0 - intersections = filtered.intersection(geom).explode() - return len(intersections) - - -### S3 Utilities ### - - -def init_s3_resources() -> tuple: - """Establish a boto3 (AWS) session and return the session, S3 client, and S3 resource handles.""" - # Instantitate S3 resources - session = boto3.Session( - aws_access_key_id=os.environ.get("aws_access_key_id"), - aws_secret_access_key=os.environ.get("aws_secret_access_key"), - ) - - s3_client = session.client("s3") - s3_resource = session.resource("s3") - return session, s3_client, s3_resource - - -def get_s3_content(uri: str): - bucket, prefix = split_uri(uri) - _, client, _ = init_s3_resources() - result = client.get_object(Bucket=bucket, Key=prefix) - return result["Body"].read().decode() - - -def get_json_boto3(uri: str): - text = get_s3_content(uri) - json_content = json.loads(text) - return json_content - - -def split_uri(uri: str) -> tuple: - """Split a uri into bucket and prefix.""" - parsed = urlparse(uri) - bucket = parsed.netloc - prefix = parsed.path.lstrip("/") - return bucket, prefix - - -def find_metadata(uri: str) -> list: - """Search a prefix for metadata jsons.""" - # Parse uri - bucket, prefix = split_uri(uri) - - # Get paginator - _, s3_client, _ = init_s3_resources() - paginator = s3_client.get_paginator("list_objects_v2") - result = paginator.paginate(Bucket=bucket, Prefix=prefix, Delimiter="/") - - # Find subdirectories - sub_prefixes = set() - for page in result: - for cp in page.get("CommonPrefixes", []): - sub_prefixes.add(cp["Prefix"]) - - # Search for meta in subdirectory - results = [] - for i in list(sub_prefixes): - try: - prefix = i + "mip_package_geolocation_metadata.json" - s3_client.head_object(Bucket=bucket, Key=prefix) - results.append(f"s3://{bucket}/{prefix}") - except botocore.exceptions.ClientError: - pass - return results - - -def search_s3_boto3(uri: str, regex_str: str) -> list: - """Search S3 for files matching regex at a certain prefix.""" - _, s3_client, _ = init_s3_resources() - - # Parse uri - bucket, prefix = split_uri(uri) - - # Compile a regex for ".g##" where # is 0-9 - pattern = re.compile(regex_str) - - # Search - results = [] - kwargs = {"Bucket": bucket, "Prefix": prefix} - while True: - resp = s3_client.list_objects_v2(**kwargs) - results += [obj["Key"] for obj in resp["Contents"] if pattern.search(obj["Key"])] - try: - kwargs["ContinuationToken"] = resp["NextContinuationToken"] - except KeyError: - break - return results - - -def search_s3_obstore(uri: str, regex_str: str) -> list: - """Search S3 for files matching regex at a certain prefix.""" - # Parse uri - bucket, prefix = split_uri(uri) - - # Compile a regex for ".g##" where # is 0-9 - pattern = re.compile(regex_str) - - # Search - store = S3Store(bucket) - - results = [] - for key in store.list(prefix=prefix): - if pattern.search(key): - results.append(key) - - return results diff --git a/docs/developers.md b/docs/developers.md new file mode 100644 index 0000000..4a1cfd4 --- /dev/null +++ b/docs/developers.md @@ -0,0 +1,95 @@ +# Developer Guide + +## Running Tests + +```bash +# Run the full suite +pytest + +# With coverage +pytest --cov=crs_inference + +# Verbose output for a single module +pytest tests/test_engine.py -v +``` + +The end-to-end test in `tests/test_e2e_winooski.py` is the highest-value smoke test. It parses a real HEC-RAS model of the Winooski River (Chittenden County, VT, FIPS `50007`) and asserts the result is `EPSG:5646` (Vermont Transverse Mercator). If that test passes, the parser, database, engine, and tiebreakers are all working together correctly. + +Test fixtures live in `tests/fixtures/` (minimal synthetic files) and `tests/winooski/` (real model files). + +--- + +## Bundled Data Files + +Two GeoPackages ship with the library under `crs_inference/data/`. Both are checked into the repository and must be regenerated whenever their upstream sources change. + +### `proj.gpkg` — CRS Database + +This file contains one row per projected CRS, covering all EPSG and ESRI codes that PROJ knows about. Each row stores the authority name, numeric code, the area-of-use bounding box in EPSG:4326, and a pre-computed pyproj pipeline string for transforming from EPSG:4326 into that CRS. + +The pipeline string is the performance-critical artifact: it lets the engine construct a `pyproj.Transformer` from a plain string at runtime without any authority database lookup. + +**Rebuilding `proj.gpkg`** + +The build script is `scripts/proj_2_gpkg.py`. It requires a local PROJ SQLite database (`proj.db`), which ships with every pyproj installation. + +```bash +python scripts/proj_2_gpkg.py +``` + +The script: +1. Opens `crs_inference/data/proj.db` and queries `crs_view` for all `(auth_name, code)` pairs. +2. For each pair, constructs a `pyproj.CRS` from the authority and code. +3. Builds a `Transformer` from that CRS to EPSG:4326 and serializes it as a proj4 pipeline string. +4. Reads the CRS area-of-use and converts it to a Shapely bounding box. +5. Writes the result to `crs_inference/data/proj.gpkg` via GeoPandas. + +Entries where PROJ raises `CRSError` or `ProjError` (malformed or unsupported CRS definitions) are skipped and logged. The output CRS of the GeoPackage is EPSG:4326. + +> After rebuilding, run the full test suite to confirm the new database does not break any known inference results. + +--- + +### `counties.gpkg` — US County Boundaries + +This file is a filtered extract of US Census TIGER county boundaries. It contains one polygon per county with a `GEOID` column holding the 5-digit FIPS code. The native CRS is EPSG:4269 (NAD83 geographic). + +`Target.from_county()` reads this file, filters by GEOID, and reprojects the selected polygon(s) to EPSG:4326 before using them as a target boundary. + +**Rebuilding `counties.gpkg`** + +Download the county shapefile from the US Census Bureau TIGER/Line archive: + +```bash +curl -O https://www2.census.gov/geo/tiger/TIGER2023/COUNTY/tl_2023_us_county.zip +unzip tl_2023_us_county.zip +``` + +Then convert and filter to only the columns the library uses: + +```python +import geopandas as gpd + +gdf = gpd.read_file("tl_2023_us_county.shp")[["GEOID", "geometry"]] +gdf.to_file("crs_inference/data/counties.gpkg", layer="counties") +``` + +> The TIGER shapefile includes territories (Puerto Rico, USVI, etc.). These are valid inputs to `from_county()` and should be retained. + +--- + +## NHD GeoPackage (optional) + +The `NHDTiebreaker` requires the National Hydrography Dataset national GeoPackage (`NHD_H_National_GPKG.gpkg`). This file is ~5 GB and is **not** bundled. Download it from the USGS: + +``` +https://www.usgs.gov/national-hydrography/access-national-hydrography-products +``` + +Point the library at it via environment variable: + +```bash +export NHD_GPKG_PATH=/path/to/NHD_H_National_GPKG.gpkg +``` + +The tiebreaker only reads the `NHDFlowline` layer using a bounding-box spatial filter, so the full file must be present but only a small portion is read per call. diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..5ca17d5 --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,126 @@ +# Frequently Asked Questions + +
+What does "infer a CRS" actually mean? + +HEC-RAS geometry files store raw coordinate pairs — numbers like `(897432.15, 214876.40)` — with no metadata indicating which coordinate reference system they belong to. CRS inference is the process of figuring out which projected coordinate system those numbers are in by testing each plausible CRS, transforming the geometry into it, and measuring how much of the result overlaps a known geographic boundary. The CRS that produces the highest overlap is returned as the best guess. +
+ +
+How accurate is the inference? + +For models with clear, well-surveyed geometry and a reasonably tight target area (e.g., a single county), accuracy is very high. The end-to-end test suite confirms correct inference on real models. Accuracy decreases for very short models (few coordinates), models near the boundary between two CRS areas of use, or highly unusual projections. The `confidence` field in the result is the raw overlap fraction — values above ~0.8 are reliably correct; values below ~0.3 warrant manual review. +
+ +
+What is a "target" and why do I need one? + +A `Target` tells the engine where on Earth to look. There's no magic way to determine CRS from a set of coordinates without knowing approximately where those coordinates are supposed to be. +
+ +
+What if I don't know which county a model is in? + +Use `Target.from_bbox()` with the broadest bounding box you can confidently assert. A state or multi-state box works. A wider target means more CRS candidates that lead to overlaps with that target, but not all of them may be correct. +
+ +
+What is the difference between "local" and "non_local" in the result? + +"Local" means the winning CRS is one whose area-of-use polygon (as defined by PROJ) intersects your target geometry. These are the high-confidence candidates. "Non-local" means the engine exhausted the local pool without finding any candidate above the minimum overlap threshold and fell back to scoring every other known CRS. A non-local result is not wrong, but it warrants extra scrutiny — it may indicate the target geometry was too coarse or the model is genuinely in a marginal CRS. +
+ +
+What does the "confidence" value mean exactly? + +Confidence is the fraction of the model geometry's total linear length that falls inside the target boundary after transformation into the inferred CRS. A value of `1.0` means the entire geometry is inside the target. A value of `0.5` means half of the geometry overlaps. It is not a probability estimate — it is a raw spatial overlap ratio. High confidence (> 0.8) strongly suggests the correct CRS. Low confidence (< 0.3) means the result is uncertain. +
+ +
+What is MIN_OVERLAP_PCT and should I change it? + +`MIN_OVERLAP_PCT` (default 0.11%) is the minimum overlap fraction a CRS must achieve to be considered a valid candidate at all. It exists to filter out numerical noise — projections with nearly identical parameters can produce tiny non-zero overlaps even when wrong. In practice you should not need to change this. If you are getting `crs=None` results for models that should have a clear answer, try lowering it. If you are getting false positives, try raising it. Set it via the `MIN_OVERLAP_PCT` environment variable. +
+ +
+What is the NHDTiebreaker and when should I use it? + +`NHDTiebreaker` breaks ties between candidates that have identical overlap scores by counting NHD flowline intersections. The idea is that the correct CRS will align a river centerline model with the actual rivers in the NHD dataset. It is more informative than the default `SmallestCodeTiebreaker` but requires the national NHD GeoPackage (~5 GB). Use it when you are processing many models at scale and want the most accurate tiebreaking, or when the default tiebreaker produces obviously wrong results for tied cases. Set the path via `NHD_GPKG_PATH`. +
+ +
+What is the SmallestCodeTiebreaker? + +It is the default tiebreaker. When two or more candidates have identical overlap scores, it selects the one with the numerically smallest EPSG or ESRI code. This is a deterministic fallback that requires no external data. After reviewing many CRS, it was found that lower codes are generally the more common code for identical CRS with higher codes. +
+ +
+Can I use this library with non-HEC-RAS models? + +Yes. The `CRSInferenceEngine` and `Target` classes work with any Shapely `BaseGeometry`. `RasParser` is just one way to produce that geometry. If you have another model format, write a parser that returns a `MultiLineString` (or any geometry) and pass it directly to `infer_crs()`. +
+ +
+Can I parse a model from S3 without downloading it first? + +Yes. `RasParser.from_s3("s3://bucket/path/to/model.g01")` downloads the file content using boto3 and parses it in memory. AWS credentials must be configured in the environment (via `AWS_PROFILE`, `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY`, an IAM instance role, etc.). If the S3 URL is not accessible, the download will return an HTML error page and `validate()` will raise `HTMLDownloadError`. +
+ +
+Why does validate() raise HTMLDownloadError? + +When an S3 object is inaccessible (wrong bucket, wrong key, insufficient permissions), AWS returns an XML or HTML error document instead of the requested file. `RasParser.from_s3()` downloads whatever the URL returns, and `validate()` checks if the content starts with ``. If it does, the file was not a real HEC-RAS geometry file and inference would produce nonsense. Fix the S3 URI or credentials and try again. +
+ +
+Why does validate() raise ModelTooLargeError? + +Some HEC-RAS models are very large (hundreds of reaches, thousands of coordinates per reach). The default limit is 10 GB (`RAS_SIZE_LIMIT`). Files larger than this are rejected before parsing to prevent out-of-memory conditions. If you have a legitimately large model and sufficient RAM, raise the limit via the `RAS_SIZE_LIMIT` environment variable. +
+ +
+How do I run inference on many models in parallel? + +Create one `CRSInferenceEngine` instance per process and reuse it. The engine is stateless and the `TransformerCache` it holds gets warmer over time as more transformers are cached, so per-process reuse is faster than constructing a new engine per model. Use Python's `multiprocessing` (not `threading`) — the transformer cache is not thread-safe. + +```python +engine = CRSInferenceEngine() # once per process +for geometry, target in work_items: + result = engine.infer(geometry, target) +``` +
+ +
+What happens if the geometry is empty? + +`validate()` raises `EmptyGeometryError` if the parsed geometry contains no coordinates. This can happen if the `.g01` file has no `River Reach=` sections, or if all `Reach XY=` blocks had zero coordinates. Check that the file is a geometry file (`.g01`, `.g02`, etc.) and not a plan or flow file. +
+ +
+How is proj.gpkg built and can I update it? + +`proj.gpkg` is generated from the PROJ SQLite database by `scripts/proj_2_gpkg.py`. It queries all CRS definitions, computes their area-of-use bounding boxes, and pre-computes the pyproj pipeline strings. See the [Developer Guide](developers.md) for full rebuild instructions. After rebuilding, run the full test suite to confirm no known inference results changed. +
+ +
+Can I use a custom CRS database instead of the bundled one? + +Yes. Pass a custom `CRSDatabase` instance to `Target` and `CRSInferenceEngine`: + +```python +from crs_inference import CRSDatabase, Target, CRSInferenceEngine + +db = CRSDatabase.from_file("path/to/custom.gpkg") +target = Target.from_county("50007", database=db) +engine = CRSInferenceEngine() +result = engine.infer(geometry, target) +``` + +The custom GeoPackage must have the same schema as the bundled one: columns `auth_name`, `code`, `proj4`, and `geometry`. +
+ +
+What Python version is required? + +Python 3.12 or later. The library uses several 3.12+ features including the `type` statement syntax in type annotations. +
diff --git a/docs/technical_reference.md b/docs/technical_reference.md new file mode 100644 index 0000000..7218d91 --- /dev/null +++ b/docs/technical_reference.md @@ -0,0 +1,123 @@ +# CRS Inference — How It Works + +This document is a detailed technical walkthrough of how the library infers a CRS from a geometry. It is intended for anyone who wants to understand the mechanics rather than just the API. + +## Table of Contents + +1. [The Core Problem](#the-core-problem) +2. [Step 1 — Parsing Model Geometry](#step-1--parsing-model-geometry) +3. [Step 2 — Building a Target](#step-2--building-a-target) +4. [Step 3 — Selecting CRS Candidates](#step-3--selecting-crs-candidates) +5. [Step 4 — Scoring Each Candidate](#step-4--scoring-each-candidate) +6. [Step 5 — Resolving Ties](#step-5--resolving-ties) +7. [Step 6 — The Result](#step-6--the-result) +8. [Thread Safety and Caching](#thread-safety-and-caching) +9. [Configuration](#configuration) + + +--- + +## The Core Problem + +HEC-RAS hydraulic model files store geometry as raw coordinate pairs with no embedded CRS. The coordinates are real-world survey values — meters or feet in some projected space — but the file gives no indication of which space. The goal is to figure out which projected coordinate system those numbers belong to. + +The insight the library exploits is that a correct CRS transformation will place the geometry where it physically belongs on Earth. If you transform a river centerline into the right CRS and then intersect it with a known county boundary, you get high overlap. Transform it into the wrong CRS and the resulting coordinates land somewhere else — possibly in the ocean — producing near-zero overlap. This is the scoring signal. + +--- + +## Step 1 — Parsing the Model Geometry + +A HEC-RAS geometry file (`.g01`, `.g02`, etc.) is a plain-text format. `RasParser` reads it and extracts the centerline of every river reach in the model. + +The file is structured as a sequence of reach blocks. Each block begins with a `River Reach=RiverName,ReachName` header. Downstream, a `Reach XY= N` line announces that N coordinate pairs follow. The coordinates are stored in fixed-width 16-character fields — x and y alternating on successive lines — with no delimiter other than whitespace. The parser reads N pairs exactly, which means it must handle the variable amount of whitespace the RAS exporter uses around the `=` sign (some versions emit `Reach XY=42`, others `Reach XY= 42`). + +Each reach becomes a Shapely `LineString`. All reaches are combined into a `MultiLineString` that represents the entire spatial footprint of the model. This is the geometry that gets scored. + +Before any scoring happens, `validate()` applies three guards: it rejects files larger than `RAS_SIZE_LIMIT` (default 10 GB) to prevent memory exhaustion, rejects content that begins with `` because that indicates an S3 access-denied error page was returned instead of the actual file, and rejects geometries where every reach parsed to zero coordinates. + +--- + +## Step 2 — Building a Target + +A `Target` has two jobs: it holds a geographic boundary that the model is expected to fall inside, and it holds the pre-computed list of CRS candidates that are plausible for that area. + +The boundary is always stored internally in EPSG:4326 (WGS84 geographic). If you construct a target from a county FIPS code, the library loads the county polygon from the bundled `counties.gpkg`, reprojects it from its native CRS (EPSG:4269, NAD83) to EPSG:4326, and uses that polygon. If you provide a bounding box or an arbitrary Shapely geometry, the same reprojection step happens. This normalization ensures that all spatial comparisons against the CRS database happen in a consistent coordinate space. + +Once the boundary geometry exists, `CRSDatabase.candidates_for()` performs a spatial intersection against the area-of-use polygons in `proj.gpkg`. Every CRS whose area of use intersects the target boundary becomes a **local** candidate. Everything else becomes a **non-local** candidate. Local candidates are the high-confidence pool — they are CRS definitions that PROJ itself says are valid for this region. Non-local candidates are the fallback pool, used only if the local search fails entirely. + +--- + +## Step 3 — The CRS Database + +`proj.gpkg` is a GeoPackage derived from the PROJ SQLite database. Each row represents one projected CRS and contains four things: the authority name (`EPSG` or `ESRI`), the numeric code, the area-of-use boundary as a box polygon in EPSG:4326, and a pyproj pipeline string that transforms coordinates from EPSG:4326 into that CRS. + +The pipeline string is the key artifact. It was pre-computed at build time by constructing a `Transformer` from the CRS to EPSG:4326, inverting it, and serializing it as a proj4 string. This means at inference time, the library never needs to call `Transformer.from_crs()` — which requires a network lookup or authority database scan — because all the transformation math is already baked into the pipeline string. + +The spatial query in `candidates_for()` uses GeoPandas, so it is a vectorized polygon intersection against the entire GeoPackage at once. This is fast for the local pool (tens to hundreds of candidates per region) but would be slow if run without the local/non-local split for the full global database. + +--- + +## Step 4 — Scoring Each Candidate + +The engine iterates over each CRS in its candidate list. For each one: + +**Transformation.** The `TransformerCache` looks up the pipeline string from the database and constructs a pyproj `Transformer` from it. The transformer is cached by pipeline string so it is only constructed once per unique CRS per engine instance. Constructing a transformer is the most expensive single operation in the loop (it parses and validates the proj4 pipeline), so this cache provides significant speedup when the same engine instance is reused across many models. The cache calls `shapely.ops.transform()` with the transformer's `.transform` method, which applies the projection coordinate-by-coordinate to the entire geometry in one pass. + +If the pipeline string is `None` (unknown CRS) or equals `+proj=noop` (identity transform), the geometry is returned unchanged and the row is skipped. + +**Overlap computation.** The transformed geometry — now in the candidate CRS's units, typically meters or feet — is intersected with the target boundary, which has been transformed into the same CRS. The overlap metric is: + +``` +overlap = intersection.length / geometry.length +``` + +This uses linear length rather than area because the input is a `MultiLineString`. A value of `1.0` means every vertex of the model falls inside the target boundary. A value of `0.0` means no part of the transformed geometry touches the boundary — the CRS is wrong. + +Only candidates with `overlap >= min_overlap` (default 0.11%) survive. The threshold exists to filter out numerical noise from nearly-correct projections that share similar parameters. + +--- + +## Step 5 — The Two-Tier Search Strategy + +The engine always tries local candidates first. If any local candidate exceeds the threshold, the non-local pool is never touched. This is the common case — for a model somewhere in the US, the correct CRS is almost certainly in the local pool for the state or region, which typically contains 10–50 candidates rather than the thousands in the global database. + +If no local candidate passes, the engine falls back to non-local candidates. This handles edge cases: models at the boundary between CRS areas of use, models in territories with unusual CRS coverage, or models in regions where the PROJ area-of-use polygons are coarse bounding boxes that don't fully capture the local projections. + +The method field in `InferenceResult` records which tier produced the winner (`"local"`, `"non_local"`, or `"none"` if even the fallback failed). + +--- + +## Step 6 — Resolving Ties + +When two or more candidates share the same (rounded) maximum overlap, the engine passes the tied candidates to each tiebreaker in sequence. A tiebreaker receives a GeoDataFrame of tied candidates and returns a filtered GeoDataFrame with only the preferred candidate(s). If after all tiebreakers there is still more than one candidate, the first row wins. + +**SmallestCodeTiebreaker** casts the `code` column to integers and returns the row with the minimum value. After reviewing many CRS, it was determined that lower codes are often times the more common variants of other CRS. + +**NHDTiebreaker** uses the National Hydrography Dataset. For each tied candidate, it reads the `NHDFlowline` layer from the national GeoPackage using the candidate's bounding box as a spatial filter, then counts how many distinct flowline segments intersect the transformed geometry. The candidate with the most flowline intersections wins. The intuition is that the correct CRS will align the model's river centerlines with NHD flowlines — wrong CRS transformations will shift the geometry away from the actual rivers. This is a much stronger signal than smallest-code, but requires the large NHD GeoPackage to be available locally. + +--- + +## Step 7 — The Result + +`InferenceResult` is a frozen dataclass. `crs` is the winning authority:code string, or `None` if the search failed. `confidence` is the raw overlap fraction of the winner. `candidates` is a GeoDataFrame containing every candidate that exceeded the minimum overlap threshold, with their geometries in the winning CRS and their overlap scores, sorted by overlap descending. The candidates frame is useful for debugging — it shows not just the winner but how far ahead it was and which projections were close runners-up. + +--- + +## Thread Safety and Caching + +`CRSInferenceEngine` is stateless except for the `TransformerCache`. The cache is a plain dict keyed by pipeline string — not thread-safe by default. In practice, the library is used in multiprocessing contexts (one process per model) rather than multithreaded ones, so this is not a concern. If you use threads, create one engine instance per thread. + +The `CRSDatabase` loads the entire `proj.gpkg` into memory on first access and holds it for the lifetime of the object. For batch inference jobs, construct a single database instance and share it across all `Target` constructions to avoid repeated disk reads. + +--- + +## Configuration + +All runtime behavior can be tuned through environment variables, which the library reads at import time from the process environment (or from a `.env` file via `python-dotenv`): + +| Variable | Default | Effect | +|----------|---------|--------| +| `MIN_OVERLAP_PCT` | `0.0011` | Minimum overlap fraction to consider a CRS match | +| `NHD_GPKG_PATH` | — | Path to NHD national GeoPackage for `NHDTiebreaker` | +| `RAS_SIZE_LIMIT` | `10000000000` | Max file size in bytes before `ModelTooLargeError` | + diff --git a/ops/db.py b/ops/db.py new file mode 100644 index 0000000..f7d069e --- /dev/null +++ b/ops/db.py @@ -0,0 +1,99 @@ +"""SQLite state management for batch CRS inference runs.""" + +import json +import sqlite3 +from pathlib import Path + +import pandas as pd + + +class Database: + """SQLite-backed state store for inference runs. Does not hold a persistent connection.""" + + def __init__(self, db_path: Path = Path("inference.db")): + self.db_path = db_path + self._create_schema() + + def _create_schema(self) -> None: + """Initialize tables if they don't exist.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute("PRAGMA journal_mode=WAL") + cur.execute("CREATE TABLE IF NOT EXISTS models (uri TEXT PRIMARY KEY, county TEXT, crs TEXT)") + cur.execute("CREATE TABLE IF NOT EXISTS run_status (uri TEXT PRIMARY KEY, status TEXT, err TEXT, tb TEXT)") + cur.execute("CREATE TABLE IF NOT EXISTS no_geometry (prefix TEXT PRIMARY KEY, csv TEXT, reason TEXT)") + + @property + def models(self) -> list[tuple[str, list]]: + """Return all models without an inferred CRS.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute("SELECT uri, county FROM models WHERE crs IS NULL") + res = cur.fetchall() + return [(uri, json.loads(county)) for uri, county in res] + + def get_pending_model(self) -> list[tuple[str, list]]: + """Return one model that has no CRS and no run_status entry.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute( + "SELECT m.uri, m.county FROM models m " + "LEFT JOIN run_status s ON s.uri = m.uri " + "WHERE m.crs IS NULL AND s.status IS NULL LIMIT 1" + ) + res = cur.fetchall() + return [(uri, json.loads(county)) for uri, county in res] + + @property + def models_w_crs(self) -> list[tuple[str, list, str]]: + """Return all models that have an inferred CRS.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute("SELECT uri, county, crs FROM models WHERE crs IS NOT NULL") + res = cur.fetchall() + return [(uri, json.loads(county), crs) for uri, county, crs in res] + + def log_models(self, models: list[tuple[str, str]]) -> None: + """Insert (uri, county_json) pairs, ignoring duplicates.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.executemany("INSERT OR IGNORE INTO models (uri, county) VALUES (?, ?)", models) + + def log_crs(self, model_uri: str, crs: str) -> None: + """Set the inferred CRS for a model.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute("UPDATE models SET crs = ? WHERE uri = ?", (crs, model_uri)) + + def log_overlaps(self, df: pd.DataFrame) -> None: + """Append overlap rows to the overlaps table.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + df.to_sql("overlaps", con, if_exists="append", index=False) + + def log_status(self, uri: str, status: str, error: str = "", tb: str = "") -> None: + """Record the processing status for a model.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute( + "INSERT OR REPLACE INTO run_status (uri, status, err, tb) VALUES (?, ?, ?, ?)", + (uri, status, error, tb), + ) + + def log_no_geometry(self, prefix: str, csv: str, reason: str = "not found") -> None: + """Record a prefix that had no geometry file.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute( + "INSERT OR IGNORE INTO no_geometry (prefix, csv, reason) VALUES (?, ?, ?)", + (prefix, csv, reason), + ) + + def get_counties(self, uri: str) -> list: + """Return the county list for a model URI.""" + with sqlite3.connect(self.db_path, timeout=30) as con: + cur = con.cursor() + cur.execute("SELECT county FROM models WHERE uri = ? LIMIT 1", (uri,)) + res = cur.fetchone() + if res is None: + raise KeyError(f"uri not found: {uri}") + return json.loads(res[0]) diff --git a/ops/infer_s3_ras.py b/ops/infer_s3_ras.py new file mode 100644 index 0000000..a5404e5 --- /dev/null +++ b/ops/infer_s3_ras.py @@ -0,0 +1,207 @@ +"""Batch CRS inference for HEC-RAS geometry files staged in S3.""" + +import concurrent.futures +import glob +import json +import logging +import os +import time +import traceback +import warnings +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path + +import geopandas as gpd +import pandas as pd +import psutil + +from crs_inference import CRSInferenceEngine, RasParser, Target +from crs_inference.loaders.s3 import get_json_s3, search_s3, split_uri +from ops.db import Database + +logging.basicConfig( + filename="inference.log", + filemode="a", + format="%(asctime)s,%(msecs)03d %(name)s %(levelname)s %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=logging.INFO, +) +logging.getLogger("botocore").setLevel(logging.WARNING) +logging.getLogger("boto3").setLevel(logging.WARNING) +warnings.filterwarnings("ignore", category=RuntimeWarning, module="shapely") + +logger = logging.getLogger(__name__) + +# Configure these for each production run. +CSV_PATHS: list[str] = [] + +_engine = CRSInferenceEngine() +_target_cache: dict[str, Target] = {} + + +def _get_target(counties: list[str]) -> Target: + """Return a cached Target for the given county list.""" + key = json.dumps(sorted(counties)) + if key not in _target_cache: + _target_cache[key] = Target.from_county(counties if len(counties) > 1 else counties[0]) + return _target_cache[key] + + +def load_models_from_csv(csv_path: str, limit: int | None = None, db: Database | None = None) -> list[tuple[str, str]]: + """Load (geometry_uri, county_json) pairs from a ras_bundles CSV file.""" + path = Path(csv_path) + logger.info(f"Loading models from CSV: {path}") + df = pd.read_csv(path, dtype=str) + models = [] + for _, row in df.iterrows(): + if limit is not None and len(models) >= limit: + break + destination_prefix = row["destination_prefix"].rstrip("/") + "/" + counties = [f.strip() for f in str(row["co_fips"]).split(",") if f.strip()] + try: + geometry_keys = search_s3(destination_prefix, r"\.g\d\d$") + except Exception as e: # noqa: BLE001 + logger.warning(f"Could not search {destination_prefix}: {e}") + if db: + db.log_no_geometry(destination_prefix, str(path), reason=str(e)) + continue + if not geometry_keys: + logger.warning(f"No geometry file found at {destination_prefix}") + if db: + db.log_no_geometry(destination_prefix, str(path)) + continue + bucket, _ = split_uri(destination_prefix) + geometry_uri = f"s3://{bucket}/{min(geometry_keys)}" + models.append((geometry_uri, json.dumps(counties))) + logger.info(f"Loaded {len(models)} models from {path.name}") + return models + + +def _process_meta(meta_uri: str) -> tuple[str | None, str | None]: + """Extract geometry URI and county from a MIP metadata file.""" + metadata = get_json_s3(meta_uri) + counties = metadata.get("county") + root = meta_uri.replace("mip_package_geolocation_metadata.json", "") + geometry_keys = search_s3(root, r"\.g\d\d$") + if not geometry_keys: + return None, None + bucket, _ = split_uri(meta_uri) + geometry_uri = f"s3://{bucket}/{min(geometry_keys)}" + return geometry_uri, json.dumps(counties) + + +def process_model(geom_uri: str, counties: list[str], db: Database) -> None: + """Download, validate, and infer CRS for one model, then write results.""" + logger.info(f"Processing {geom_uri}") + parser = RasParser.from_s3(geom_uri) + parser.validate() + target = _get_target(counties) + result = _engine.infer(parser.parse(), target) + db.log_crs(geom_uri, result.crs) + if result.candidates is not None and len(result.candidates): + candidates = result.candidates.copy() + candidates["uri"] = geom_uri + os.makedirs("runner_ups_tmp", exist_ok=True) + candidates.to_file(f"runner_ups_tmp/runner_ups_{os.getpid()}.gpkg", mode="a") + + +def process_runner(geom_uri: str, counties: list[str], db: Database) -> str: + """Run process_model with error handling and status logging.""" + try: + db.log_status(geom_uri, "Processing") + t1 = time.perf_counter() + process_model(geom_uri, counties, db) + except Exception as e: # noqa: BLE001 + logger.error(f"Error on {geom_uri}") + db.log_status(geom_uri, "Failure", str(e), traceback.format_exc()) + else: + db.log_status(geom_uri, "Success") + t2 = time.perf_counter() + logger.info(f"finished {geom_uri} in {round(t2 - t1, 2)}s") + logger.info(f"{round(psutil.virtual_memory()[2], 2)}% memory used") + return geom_uri + + +def merge_runner_ups() -> None: + """Merge per-worker runner_ups temp files into runner_ups.gpkg.""" + temp_files = glob.glob("runner_ups_tmp/runner_ups_*.gpkg") + if not temp_files: + return + gdfs = [] + for f in temp_files: + try: + gdfs.append(gpd.read_file(f)) + except Exception as e: # noqa: BLE001 + logger.warning(f"Could not read temp file {f}: {e}") + if gdfs: + merged = gpd.GeoDataFrame(pd.concat(gdfs, ignore_index=True), crs=gdfs[0].crs) + merged.to_file("runner_ups.gpkg", mode="a") + logger.info(f"Merged {len(temp_files)} temp files ({len(merged)} rows)") + for f in temp_files: + os.remove(f) + try: + os.rmdir("runner_ups_tmp") + except OSError: + pass + + +def smoke_test(n: int = 3) -> None: + """Run inference on a small sample to verify the pipeline end-to-end.""" + db_path = Path("smoke_test.db") + runner_ups_path = "smoke_test_runner_ups.gpkg" + print(f"=== Smoke test: {n} models ===") + models: list = [] + db = Database(db_path) + for csv_path in CSV_PATHS: + remaining = n - len(models) + models.extend(load_models_from_csv(csv_path, limit=remaining, db=db)) + if len(models) >= n: + break + models = models[:n] + if not models: + print("No models found — check CSV_PATHS") + return + db.log_models(models) + for i, (geom_uri, counties) in enumerate(db.models, 1): + print(f"\n[{i}/{n}] {geom_uri}") + parser = RasParser.from_s3(geom_uri) + parser.validate() + print(f" reaches : {len(parser.reaches)}") + target = _get_target(counties) + result = _engine.infer(parser.parse(), target) + print(f" result : {result.crs} confidence={result.confidence:.3f}") + db.log_crs(geom_uri, result.crs) + db.log_status(geom_uri, "Success") + if result.candidates is not None and len(result.candidates): + cands = result.candidates.copy() + cands["uri"] = geom_uri + cands.to_file(runner_ups_path, mode="a") + print(f"\n=== Done. Outputs: {db_path}, {runner_ups_path} ===") + + +def production() -> None: + """Run inference across all CSV_PATHS using all available CPU cores.""" + merge_runner_ups() + db = Database() + if not db.models and not db.models_w_crs: + for csv_path in CSV_PATHS: + models = load_models_from_csv(csv_path, db=db) + db.log_models(models) + logger.info("Beginning CRS inference") + workers = max(os.cpu_count() - 1, 1) + with ProcessPoolExecutor(max_workers=workers) as executor: + futures = { + executor.submit(process_runner, geom_uri, counties, db): geom_uri for geom_uri, counties in db.models + } + for future in concurrent.futures.as_completed(futures): + try: + geom_uri = future.result() + logger.info(f"Finished {geom_uri}") + except Exception as exc: # noqa: BLE001 + logger.error(str(exc)) + merge_runner_ups() + logger.info("Finished Inferring CRS") + + +if __name__ == "__main__": + production() diff --git a/production/infer_s3_ras.py b/production/infer_s3_ras.py deleted file mode 100644 index 4a7a615..0000000 --- a/production/infer_s3_ras.py +++ /dev/null @@ -1,316 +0,0 @@ -"""Infer the CRS for all HEC-RAS geometry files in an S3 bucket+prefix.""" - -import concurrent -import json -import logging -import os -import sqlite3 -import time -import traceback -import warnings -from concurrent.futures import ProcessPoolExecutor -from pathlib import Path - -import geopandas as gpd -import pandas as pd -import psutil - -from crs_inference.data_models import CountyTargetCache, RasGeometry, TransformerCache -from crs_inference.utils import ( - find_metadata, - get_json_boto3, - search_s3_boto3, - split_uri, -) - -logging.basicConfig( - filename="inference.log", - filemode="a", - format="%(asctime)s,%(msecs)03d %(name)s %(levelname)s %(message)s", - datefmt="%Y-%m-%d %H:%M:%S", - level=logging.INFO, -) -warnings.filterwarnings("ignore", category=RuntimeWarning, module="shapely") - - -class Database: - """Simple OOP representation of database (will not persist connection).""" - - def __init__(self): - self.db_path = Path("inference.db") - self.create_schema() - - def create_schema(self): - """Initialize tables.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute("CREATE TABLE IF NOT EXISTS models (uri TEXT PRIMARY KEY, county TEXT, crs TEXT)") - cur.execute("CREATE TABLE IF NOT EXISTS run_status (uri TEXT PRIMARY KEY, status TEXT, err TEXT, tb TEXT)") - - @property - def models(self): - """Retrieve model information.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute("SELECT uri, county FROM models WHERE crs IS NULL") - res = cur.fetchall() - res = [(i, json.loads(j)) for i, j in res] - return res - - def get_model(self): - """Retrieve one model information.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute( - "SELECT m.uri, m.county FROM models m LEFT JOIN run_status s ON s.uri = m.uri WHERE m.crs IS NULL AND s.status IS NULL LIMIT 1" - ) - res = cur.fetchall() - res = [(i, json.loads(j)) for i, j in res] - return res - - @property - def models_w_crs(self): - """Retrieve model information where CRS is available.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute("SELECT uri, county, crs FROM models WHERE crs IS NOT NULL") - res = cur.fetchall() - res = [(i, json.loads(j), k) for i, j, k in res] - return res - - def log_models(self, models: list): - """Log models and counties to db.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.executemany("INSERT OR IGNORE INTO models (uri, county) VALUES (?, ?)", models) - - def log_crs(self, model_uri: str, crs: str): - """Log crs for a model to db.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute("UPDATE models SET crs = ? WHERE uri = ?", (crs, model_uri)) - - def log_overlaps(self, df: pd.DataFrame): - """Log crs for a model to db.""" - with sqlite3.connect(self.db_path) as con: - df.to_sql("overlaps", con, if_exists="append", index=False) - - def log_status(self, uri: str, status: str, error: str = "", tb: str = ""): - """Log the status of a model to database.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute( - "INSERT OR REPLACE INTO run_status (uri, status, err, tb) VALUES (?, ?, ?, ?)", - (uri, status, error, tb), - ) - - def get_geom_counties(self, uri: str) -> list: - """Get the counties for a geometry.""" - with sqlite3.connect(self.db_path) as con: - cur = con.cursor() - cur.execute("SELECT uri, county, crs FROM models WHERE uri = ? LIMIT 1", (uri,)) - res = cur.fetchall() - res = [(i, json.loads(j), k) for i, j, k in res] - return res[0][1] - - -def identify_models(uri: str): - """Identify all models and their counties in an S3 prefix.""" - logging.info(f"Identifying models for {uri}") - meta_packages = find_metadata(uri) - models = [] - for i in meta_packages: - try: - model = process_path(i) - if model[0] is not None: - models.append(model) - except Exception as e: - print(e) # TODO: improve - return models - - -def process_path(meta_uri: str): - """Get county and geometry file for a uri.""" - # Get county - metadata = get_json_boto3(meta_uri) - counties = metadata.get("county") - - # find geometry - root = meta_uri.replace("mip_package_geolocation_metadata.json", "") - geometry_paths = search_s3_boto3(root, r"\.g\d\d$") - if len(geometry_paths) > 0: - geometry_uri = sorted(geometry_paths)[0] - else: - return None, None - - bucket, _ = split_uri(meta_uri) - geometry_uri = f"s3://{bucket}/{geometry_uri}" - return (geometry_uri, json.dumps(counties)) - - -def process_wrapper(func): - """Single-use wrapper for process_model function.""" - - def wrap(geom_uri: str, counties: str, db: Database): - try: - res = func(geom_uri, counties, db) - except Exception as e: - logging.error(f"Error on {geom_uri}") - db.log_status(geom_uri, "Failure", str(e), traceback.format_exc()) - return None - db.log_status(geom_uri, "Success") - return res - - return wrap - - -def process_model(geom_uri: str, counties: str, db: Database, debug: bool = False): - """Infer the CRS for a model.""" - logging.info(f"Processing geometry at {geom_uri}") - # Load geom - geom = RasGeometry.from_s3(geom_uri) - geom.validate() - - # Load target - target = CountyTargetCache().create_target(counties) - - # Infer CRS - logging.info(f"Inferring CRS for geometry at {geom_uri}") - crs, crs_df = geom.infer_crs(target) - - # Log results - if not debug: - db.log_crs(geom_uri, crs) - crs_df["uri"] = geom_uri - crs_df.to_file("runner_ups.gpkg", mode="a") - else: - all_crs = target.local_projections + target.non_local_projections - _, _, crs_df = geom.find_most_overlap(target, all_crs) - crs_df.to_file("debug_projections.gpkg", mode="a") - print(f"{geom_uri}-{crs}") - - -def process_runner(geom_uri: str, counties: str, db: Database): - """Catch errors on process_model.""" - try: - db.log_status(geom_uri, "Processing") - t1 = time.perf_counter() - res = process_model(geom_uri, counties, db) - except Exception as e: - logging.error(f"Error on {geom_uri}") - db.log_status(geom_uri, "Failure", str(e), traceback.format_exc()) - else: - db.log_status(geom_uri, "Success") - t2 = time.perf_counter() - logging.info(f"finished {geom_uri} in {round(t2 - t1, 2)} seconds") - logging.info(f"{round(psutil.virtual_memory()[2], 2)}% memory used") - logging.info(f"{round(psutil.cpu_percent(), 2)}% cpu used") - return geom_uri - - -def main(uri: str): - """Top-level controller for process.""" - logging.info("Beginning CRS inference") - db = Database() - models = identify_models(uri) - db.log_models(models) - for geom_uri, counties in db.models: - process_runner(geom_uri, counties, db) - logging.info("Finished Inferring CRS") - - -def production(): - """Run pipeline.""" - logging.info("Logging model URIs") - db = Database() - if not os.path.exists("inference.db"): - models = identify_models("s3://fim/mip_30/source_models/") - db.log_models(models) - models = identify_models("s3://fim/mip_70/source_models/") - db.log_models(models) - - logging.info("Beginning CRS inference") - workers = max((os.cpu_count() - 1), 1) - # workers = 1 - with ProcessPoolExecutor(max_workers=workers) as executor: - results = [] - for geom_uri, counties in db.models: - results.append(executor.submit(process_runner, geom_uri, counties, db)) - time.sleep(0.1) - for future in concurrent.futures.as_completed(results): - try: - geom_uri = future.result() - except Exception as exc: - logging.error(str(exc)) - else: - logging.info(f"Finished {geom_uri}") - logging.info("Finished Inferring CRS") - - -def debug_single(geom_uri: str): - """Debug a single model.""" - db = Database() - counties = db.get_geom_counties(geom_uri) - print(f"COUNTIES: {counties}") - target = CountyTargetCache.instance().get_county_target(counties) - # process_model(geom_uri, counties, db, debug=True) - geom = RasGeometry.from_s3(geom_uri) - geom.validate() - gdf = gpd.GeoDataFrame({"geometry": [geom.geometry]}, geometry="geometry") - crs = target.local_projections # + target.non_local_projections - all_gdf = [] - for c in crs: - print(c) - tmp_gdf = gdf.copy().set_crs(c) - tmp_gdf = tmp_gdf.to_crs("EPSG:4326") - tmp_gdf["crs"] = c - all_gdf.append(tmp_gdf) - all_gdf = gpd.GeoDataFrame(pd.concat(all_gdf), crs="EPSG:4326") - all_gdf.to_file("debug_projections.gpkg") - print(f"COUNTIES: {counties}") - - -def qc_worker(geom_uri, crs): - out_path = "inference_qc.gpkg" - trans_cache = TransformerCache() - geom = RasGeometry.from_s3(geom_uri) - projected_geom = trans_cache.transform(geom.geometry, crs) - gpd.GeoDataFrame({"geom_uri": [geom_uri], "CRS": [crs], "geometry": [projected_geom]}, crs="EPSG:4326").to_file( - out_path, mode="a" - ) - - -def generate_qc(): - """Make a QC layer for results.""" - out_path = "inference_qc.gpkg" - # if os.path.exists(out_path): - # os.remove(out_path) - - db = Database() - models = db.models_w_crs - with sqlite3.connect(out_path) as con: - cur = con.cursor() - cur.execute("SELECT geom_uri FROM inference_qc") - already_processed = [i[0] for i in cur.fetchall()] - models = [i for i in models if i[0] not in already_processed] - workers = max((os.cpu_count() - 1), 1) - print("Starting QC generation") - with ProcessPoolExecutor(max_workers=workers) as executor: - results = [] - for geom_uri, _, crs in models: - results.append(executor.submit(qc_worker, geom_uri, crs)) - counter = 0 - for future in concurrent.futures.as_completed(results): - try: - geom_uri = future.result() - except Exception as exc: - print(str(exc)) - counter += 1 - if counter % 100 == 0: - print(f"{counter} / {len(models)}") - print("done") - - -if __name__ == "__main__": - # generate_qc() - production() diff --git a/pyproject.toml b/pyproject.toml index 22acb38..a019185 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,46 @@ +[build-system] +requires = ["setuptools>=64"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +include = ["crs_inference*"] + +[tool.setuptools.dynamic] +version = {attr = "crs_inference.__version__"} + [project] name = "crs-inference" -version = "0.1.0" -description = "Add your description here" +dynamic = ["version"] +description = "Automatic CRS inference for geospatial models using geographic overlap." readme = "README.md" +license = { text = "MIT" } requires-python = ">=3.12" +authors = [{ name = "Dewberry" }] + dependencies = [ "boto3>=1.37.28", "geopandas>=1.0.1", "obstore>=0.6.0", + "psutil>=7.0.0", + "python-dotenv>=1.2.2", "shapely>=2.1.0", ] + +[project.optional-dependencies] +dev = ["pytest>=8", "pytest-cov>=5", "ruff>=0.9"] +ops = [ + "matplotlib>=3.10.1", + "pympler>=1.1", + "pynhd>=0.19.3", + "pystac>=1.15.2", +] + +[project.urls] +Repository = "https://github.com/Dewberry/crs_inference" + +[tool.ruff] +line-length = 120 +target-version = "py312" + +[tool.ruff.lint] +select = ["E", "F", "I", "UP", "B", "LOG", "BLE", "FURB", "RUF"] diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..ee0addb --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,11 @@ +from pathlib import Path + +import pytest + +FIXTURES = Path(__file__).parent / "fixtures" + + +@pytest.fixture +def sample_g01() -> Path: + """Return the path to the minimal HEC-RAS fixture file.""" + return FIXTURES / "sample.g01" diff --git a/tests/fixtures/sample.g01 b/tests/fixtures/sample.g01 new file mode 100644 index 0000000..4604089 --- /dev/null +++ b/tests/fixtures/sample.g01 @@ -0,0 +1,3 @@ +River Reach=TestRiver , TestReach +Reach XY= 2 + 481000.000000 234000.000000 482000.000000 234500.000000 diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 0000000..5ae2a41 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,37 @@ +from shapely.geometry import Point + +from crs_inference.database import CRSDatabase + + +def test_bundled_loads(): + db = CRSDatabase.bundled() + gdf = db._gdf + assert len(gdf) > 0 + assert "auth_name" in gdf.columns + assert "code" in gdf.columns + assert "proj4" in gdf.columns + + +def test_candidates_for_returns_lists(): + db = CRSDatabase.bundled() + # Point in North Carolina + geom = Point(-80.0, 35.5) + local, non_local = db.candidates_for(geom) + assert isinstance(local, list) + assert isinstance(non_local, list) + assert len(local) > 0 + + +def test_pipeline_for_returns_string(): + db = CRSDatabase.bundled() + geom = Point(-80.0, 35.5) + local, _ = db.candidates_for(geom) + assert len(local) > 0 + pipeline = db.pipeline_for(local[0]) + assert pipeline is None or isinstance(pipeline, str) + + +def test_pipeline_for_unknown_returns_none(): + db = CRSDatabase.bundled() + result = db.pipeline_for("FAKE:99999") + assert result is None diff --git a/tests/test_e2e_winooski.py b/tests/test_e2e_winooski.py new file mode 100644 index 0000000..4de48f4 --- /dev/null +++ b/tests/test_e2e_winooski.py @@ -0,0 +1,22 @@ +"""End-to-end inference test using the Winooski River HEC-RAS model (Chittenden County, VT).""" + +from pathlib import Path + +from crs_inference import CRSInferenceEngine, RasParser, Target + +WINOOSKI_G01 = Path(__file__).parent / "winooski" / "winooski.g01" +CHITTENDEN_FIPS = "50007" +EXPECTED_CRS = "EPSG:5646" + + +def test_winooski_infers_expected_crs(): + parser = RasParser.from_file(WINOOSKI_G01) + parser.validate() + target = Target.from_county(CHITTENDEN_FIPS) + result = CRSInferenceEngine().infer(parser.parse(), target) + assert result.crs == EXPECTED_CRS, ( + f"Expected {EXPECTED_CRS}, got {result.crs}. " + f"Candidates: {result.candidates[['authority', 'code', 'overlap_pct']].to_string()}" + ) + assert result.confidence > 0.0 + assert result.method == "local" diff --git a/tests/test_engine.py b/tests/test_engine.py new file mode 100644 index 0000000..66cf3eb --- /dev/null +++ b/tests/test_engine.py @@ -0,0 +1,40 @@ +import geopandas as gpd +from shapely.geometry import MultiLineString + +from crs_inference.engine import CRSInferenceEngine +from crs_inference.result import InferenceResult +from crs_inference.target import Target + + +def test_infer_result_is_inference_result(): + # Use a geometry with coordinates that look like they could be in a projected CRS + # near Charlotte, NC in ESRI:102719 (NAD 1983 StatePlane NC) + geom = MultiLineString([[(481000, 234000), (482000, 234500)]]) + target = Target.from_bbox(-81.5, 34.5, -79.5, 36.5) + engine = CRSInferenceEngine() + result = engine.infer(geom, target) + assert isinstance(result, InferenceResult) + assert result.method in ("local", "non_local", "none") + assert 0.0 <= result.confidence <= 1.0 + + +def test_infer_returns_none_for_garbage_geometry(): + from shapely.geometry import LineString + + # Coordinates that don't project sensibly into any local CRS for NC + geom = LineString([(1e12, 1e12), (1e12 + 1, 1e12 + 1)]) + target = Target.from_bbox(-81.5, 34.5, -79.5, 36.5) + engine = CRSInferenceEngine() + result = engine.infer(geom, target) + assert result.crs is None + assert result.method == "none" + + +def test_infer_candidates_is_geodataframe(): + from shapely.geometry import LineString + + geom = LineString([(481000, 234000), (482000, 234500)]) + target = Target.from_bbox(-81.5, 34.5, -79.5, 36.5) + engine = CRSInferenceEngine() + result = engine.infer(geom, target) + assert isinstance(result.candidates, gpd.GeoDataFrame) diff --git a/tests/test_ras_parser.py b/tests/test_ras_parser.py new file mode 100644 index 0000000..9e70a30 --- /dev/null +++ b/tests/test_ras_parser.py @@ -0,0 +1,46 @@ +from pathlib import Path + +import pytest +from shapely.geometry import MultiLineString + +from crs_inference.errors import EmptyGeometryError +from crs_inference.parsers.ras import RasParser + + +def test_from_file_parses_reaches(sample_g01: Path): + parser = RasParser.from_file(sample_g01) + assert len(parser.reaches) == 1 + assert parser.reaches[0].river == "TestRiver" + assert parser.reaches[0].reach == " TestReach" + + +def test_parse_returns_multilinestring(sample_g01: Path): + parser = RasParser.from_file(sample_g01) + geom = parser.parse() + assert isinstance(geom, MultiLineString) + assert not geom.is_empty + + +def test_validate_passes_on_valid(sample_g01: Path): + parser = RasParser.from_file(sample_g01) + parser.validate() # should not raise + + +def test_validate_raises_empty_geometry(): + parser = RasParser.from_string("") + with pytest.raises(EmptyGeometryError): + parser.validate() + + +def test_validate_raises_html_download_error(): + parser = RasParser.from_string("Access Denied") + from crs_inference.errors import HTMLDownloadError + + with pytest.raises(HTMLDownloadError): + parser.validate() + + +def test_from_string_roundtrip(sample_g01: Path): + contents = sample_g01.read_text() + parser = RasParser.from_string(contents) + assert len(parser.reaches) == 1 diff --git a/tests/test_target.py b/tests/test_target.py new file mode 100644 index 0000000..6584497 --- /dev/null +++ b/tests/test_target.py @@ -0,0 +1,31 @@ +from shapely.geometry import Point + +from crs_inference.target import Target + + +def test_from_bbox_has_candidates(): + target = Target.from_bbox(-80.5, 35.2, -79.8, 35.9) + assert len(target.local_projections) > 0 + assert isinstance(target.local_projections[0], str) + assert ":" in target.local_projections[0] + + +def test_from_county_single(): + target = Target.from_county("37183") # Wake County, NC + assert len(target.local_projections) > 0 + + +def test_from_county_list(): + target = Target.from_county(["37183", "37063"]) + assert len(target.local_projections) > 0 + + +def test_from_geometry_reprojects(): + + # Point in NC in EPSG:32617 (UTM zone 17N) + pt = Point(700000, 3900000) + target = Target.from_geometry(pt, crs="EPSG:32617") + # geometry stored in 4326, should be around (-80, 35) + assert isinstance(target.geometry, Point) + assert -90 < target.geometry.x < -70 + assert 30 < target.geometry.y < 40 diff --git a/tests/test_tiebreakers.py b/tests/test_tiebreakers.py new file mode 100644 index 0000000..738bef8 --- /dev/null +++ b/tests/test_tiebreakers.py @@ -0,0 +1,31 @@ +import geopandas as gpd +from shapely.geometry import box + +from crs_inference.tiebreakers import SmallestCodeTiebreaker + + +def _make_candidates(codes: list[str], authority: str = "ESRI") -> gpd.GeoDataFrame: + return gpd.GeoDataFrame( + { + "authority": [authority] * len(codes), + "code": codes, + "overlap_pct": [0.95] * len(codes), + "geometry": [box(-80, 35, -79, 36)] * len(codes), + }, + crs="EPSG:4326", + ) + + +def test_smallest_code_picks_minimum(): + tb = SmallestCodeTiebreaker() + candidates = _make_candidates(["102720", "102697", "102719"]) + result = tb.rank(candidates) + assert len(result) == 1 + assert result.iloc[0]["code"] == "102697" + + +def test_smallest_code_single_candidate(): + tb = SmallestCodeTiebreaker() + candidates = _make_candidates(["102697"]) + result = tb.rank(candidates) + assert len(result) == 1 diff --git a/tests/winooski/winooski.f01 b/tests/winooski/winooski.f01 new file mode 100644 index 0000000..0829309 --- /dev/null +++ b/tests/winooski/winooski.f01 @@ -0,0 +1,18 @@ +Flow Title=winooski +Program Version=6.50 +Number of Profiles= 1 +Profile Names=PF 1 +River Rch & RM=Mainstem,Reach 1 ,30186 + 20000 +Boundary for River Rch & Prof#=Mainstem,Reach 1 , 1 +Up Type= 0 +Dn Type= 3 +Dn Slope=0.00001 +DSS Import StartDate= +DSS Import StartTime= +DSS Import EndDate= +DSS Import EndTime= +DSS Import GetInterval= 0 +DSS Import Interval= +DSS Import GetPeak= 0 +DSS Import FillOption= 0 diff --git a/tests/winooski/winooski.g01 b/tests/winooski/winooski.g01 new file mode 100644 index 0000000..3d216ae --- /dev/null +++ b/tests/winooski/winooski.g01 @@ -0,0 +1,1034 @@ +Geom Title=winooski +Program Version=6.50 +Viewing Rectangle= 1445625.43683889 , 1462180.36751716 , 744982.531149583 , 722005.774207564 + +River Reach=Mainstem ,Reach 1 +Reach XY= 42 +1461427.87066815725797.0387501411460676.09667874725334.408602813 +1459230.37746834725681.3812133091457958.14456319725941.610671181 +1457524.42880007726057.2682080131457379.85687903726230.754513261 +1457350.94249482726606.6415079641457177.45618958 726953.61411846 +1457148.54180537727358.4154973721457350.94249482728023.446334155 + 1457264.1993422729151.1073182661457003.96988433730105.281997129 + 1456541.339737730654.6552970811456107.62397388 730943.79913916 +1455500.42190551 731232.942981241454777.56230031731695.573128568 + 1454372.7609214732216.0320443111454141.44584774732967.806033719 +1454025.78831091733285.8642600061453476.41501096 733517.17933367 + 1452927.041711733575.008102086 1452551.1547163733170.206723175 +1452146.35333739732476.2615021831451568.06565323732042.545739064 +1451018.69235328732158.2032758951450527.14782174732649.747807431 +1450266.91836387 733372.607412631450440.40466912734153.295786246 +1450960.86358486734587.0115493651452117.43895318734905.069775653 +1452724.64102155735223.1280019411452782.46978996735627.929380852 +1451510.23688481735830.3300703081450527.14782174735743.586917684 +1450064.51767442735049.6416966931449428.40122184734644.840317781 +1448734.45600085735338.7855387731447895.93885882735685.758149268 +1447635.70940095736639.9328281311448300.74023773737912.165733282 +1447664.62378515738750.6828753141447346.56555887739126.569870017 +Rch Text X Y=1457907.5443908,729129.4215301 +Reverse River Text= 0 + +Type RM Length L Ch R = 1 ,30186 ,1511.9,1511.9,1511.9 +XS GIS Cut Line=3 +1460589.35352612723050.1722503831459866.49392092726866.870965836 +1460762.83983137728890.877860394 +Node Last Edited Time=Jan/09/2025 15:13:45 +#Sta/Elev= 206 + 0 298.86 9.5 298.62 31.2 297.97 63 297.43 77.6 297.2 + 112.2 296.6 145.8 296.46 163 296.43 193.2 296.33 213.9 296.02 + 262.9 294.9 274.3 294.71 282 294.67 436.3 294.61 517.3 294.32 + 554.4 294.13 562.7 294.07 598.3 293.87 622.5 293.97 662.7 294.03 + 679.3 294.08 690.7 294.02 750.5 293.92 760.3 293.92 826.9 294.32 + 862.6 294.48 895 294.76 922.4 294.82 963.1 294.55 1003.4 294.19 + 1031.2 293.79 1062.5 293.99 1084.4 293.81 1099.3 292 1162.4 285.94 + 1165.4 285.6 1167.5 285.06 1178.3 282.11 1235.6 267.02 1246.4 264.9 + 1262.3 259.29 1303.7 242.68 1327.4 234.85 1362.3 222.96 1371.8 220.15 + 1408.4 206.85 1439.9 202.72 1462.2 200.2 1489.5 196.78 1508 195.54 + 1562.2 190.4 1570.5 189.77 1576.1 189.37 1606 186.3 1644.2 182.31 + 1651.5 180.95 1662.1 179.92 1712.4 175.65 1732.5 173.58 1762.1 170.26 + 1780.5 167.21 1813.5 164.33 1848.6 159.63 1862 157.94 1894.5 153.67 + 1916.7 148.73 1961.9 137.71 1975.5 134.59 1984.8 132.22 2033.8 117.97 + 2052.9 112.01 2056.6 110.81 2061.9 110.1 2121 101.6 2137.6 99.45 + 2161.8 99.23 2189.2 99 2218.6 98.72 2299.6 99.5 2325.4 99.68 + 2361.7 100.01 2380.6 100.15 2461.6 99.78 2529.7 99.07 2542.6 99.17 + 2561.6 99.99 2597.8 101.33 2623.7 102.53 2704.7 104.45 2734.1 104.1 + 2761.5 103.55 2785.7 103.2 2802.2 102.5 2861.4 99.01 2866.7 98.76 + 2870.3 99.01 2889.3 100.03 2938.4 102.78 2947.7 103.29 2961.4 104.39 + 3006.5 109.32 3028.7 110.81 3061.3 113.86 3074.6 115.24 3109.7 118.38 + 3142.7 122.62 3161.2 125.6 3190.8 129.7 3210.9 133.76 3261.2 145.8 + 3271.8 148.06 3279 148.98 3317 153.58 3352.8 157.8 3433.8 161.16 + 3461.1 161.36 3483.3 161.56 3514.8 161.77 3551.4 162.19 3619.5 162.92 + 3661 163.09 3676.8 163.22 3744.8 170.7 3757.8 172.17 3823.9 175.45 + 3838.9 176.15 3884.5 175.72 3922.5 175.69 3930.6 175.86 3948.8 176.04 + 3990.9 176.77 4009.6 177.38 4051.2 177.83 4057.9 177.75 4096.6 177.64 + 4111.6 177.67 4145.4 177.39 4171.9 177.4 4183.7 177.26 4214.1 177.76 + 4232.2 178.1 4270.7 178.62 4292.6 179.53 4341.9 182.1 4352.9 182.86 + 4357.8 183.17 4370.4 183.83 4413.3 186.12 4444.8 187.7 4473.6 189.54 + 4526.6 192.63 4531.9 192.95 4533.9 193.07 4538.5 193.34 4594.3 198.42 + 4619 201.52 4654.6 206.08 4682.9 210.7 4706 214.16 4714.9 215.34 + 4735.1 218.16 4775.3 222.59 4793.1 224.24 4835.6 227.51 4839.2 227.68 + 4880.1 230.12 4895.9 230.63 4931.7 231.34 4956.3 231.49 4967.2 231.7 + 4995.4 232.32 5016.6 232.67 5054.2 233.82 5076.9 234.97 5128.2 238.33 + 5141.3 239.09 5151.7 239.9 5197.6 243.74 5228.3 245.81 5257.9 246.57 + 5307.9 247.54 5315.4 247.7 5318.3 247.71 5324.8 247.72 5402.4 247.49 + 5439 247.2 5464.2 247.05 5489.5 246.88 5521.4 246.73 5576.6 246.38 + 5620 246.2 5663.6 245.88 5680.3 245.87 5718 245.96 5740.6 246.23 + 5750.7 246.36 5801 248.1 5837.7 249.3 5861.3 249.9 5924.8 251.34 + 5932.9 251.47 5982 252.06 6011.8 252.69 6042.3 253.68 6089.2 256.13 +6098.152 256.53 +#Mann= 4 ,-1,0 + 0 .4 0 1894.5 .03 0 3433.8 .4 0 +6098.152 .4 0 +Bank Sta=1894.5,3433.8 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=99.22,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,28674 ,2500.8,2500.8,2500.8 +XS GIS Cut Line=2 +1457929.23017898723946.5181608311459953.23707354 729093.27854985 +Node Last Edited Time=Jan/09/2025 15:13:45 +#Sta/Elev= 203 + 0 307.62 10.6 307.65 48.4 306.08 64.8 304.8 96.2 302.84 + 109.8 302.15 144.5 299.4 171.2 297.05 181.7 296.23 205.8 295.25 + 232.6 293.94 267.2 292.87 294 292.71 346.8 292.63 352.8 292.61 + 355.4 292.62 362 292.58 416.8 292.51 438.3 292.5 478.2 290.75 + 487.7 289.95 523.8 287.57 539.6 284.57 579.5 277.96 601 275.58 + 609.4 275.04 628.7 272.84 662.3 268.5 694.9 265.44 723.7 262.58 + 769.7 258.59 780.4 257.6 785.1 257.27 797 254.89 846.5 245.17 + 866 241.76 907.9 236.36 910.7 235.76 951.5 228.51 969.3 227.25 + 1014.5 222.53 1030.7 220.78 1037 220.05 1051.6 219.96 1092.1 219.93 + 1122.6 219.51 1153.5 219.05 1192.6 218.25 1208.1 217.96 1214.9 217.77 + 1232 217.53 1276.2 216.35 1293.6 216.03 1333.6 213.99 1337.6 213.76 + 1379.2 211.99 1399 210.47 1449.5 206.95 1460.4 206.06 1464.7 205.75 + 1474.5 204.73 1521.8 199.87 1550.2 196.85 1583.2 194.42 1615.5 191.89 + 1635.8 190.34 1644.6 186.39 1667 176.76 1706 159.85 1721.3 153.78 + 1767.4 137.33 1806.8 123.16 1828.8 117.98 1884.5 104.97 1890.2 103.67 + 1892.4 103.19 1897.4 102.97 1951.5 100.16 1977.9 99.35 2012.9 99.48 + 2038.4 99.76 2063.4 99.95 2074.3 100.82 2102 103.07 2135.7 105.6 + 2149 106.51 2197.1 108.31 2234.5 109.72 2258.5 109.98 2320 111.06 + 2381.3 113.39 2405.6 115.46 2442.7 125.38 2461.3 132.11 2491.1 141.64 + 2504.1 144.45 2537 150.12 2565.4 153.2 2576.6 154.39 2602.3 155.35 + 2626.8 156.2 2662.2 157.65 2747.7 158.61 2749.6 158.65 2754.5 158.8 + 2811 160.46 2833.2 161.17 2872.4 164.08 2918.8 167.46 2933.8 167.47 + 2995.2 167.35 3004.3 167.35 3025.2 166.94 3056.6 166.38 3089.8 165.67 + 3118 165.25 3166.2 164.18 3179.4 163.93 3260.9 163 3302.1 161.07 + 3307.2 160.9 3346.4 159.34 3363.5 159.93 3407 162.47 3424.9 163.67 + 3432 164.21 3448.1 165.74 3486.3 169.66 3517.5 172.29 3547.7 174.04 + 3589.1 175.02 3603 175.55 3609.1 175.61 3624.5 176.07 3670.5 177.72 + 3688.6 178.08 3731.9 178.53 3774.1 178.87 3793.3 178.95 3842 178.97 + 3854.6 178.95 3859.6 178.93 3871 178.81 3916 178.42 3945.2 178.07 + 3977.4 177.42 4012 176.52 4030.7 176.09 4038.8 175.88 4100.2 174.81 + 4116.2 174.6 4153 174.47 4161.6 174.38 4201.7 174.62 4223 175.33 + 4277 178.81 4284.4 179.48 4287.3 179.84 4293.9 180.82 4345.8 188.08 + 4372.8 192.26 4407.2 197.07 4434.9 200.22 4458.3 203.14 4468.5 204.27 + 4494.5 206.59 4529.9 209.96 4543.9 211.03 4575.9 215.28 4591.3 217.41 + 4629.4 222.19 4652.7 224.27 4712 228.87 4714.9 229.05 4775.5 228.5 + 4800.5 228.32 4836.9 228.3 4857.8 228.22 4886 228.14 4898.3 228.3 + 4929.5 228.57 4959.7 228.79 4971.5 228.97 4998.8 229.75 5021.1 230.16 + 5057.1 231.64 5082.5 233.9 5139.8 240.59 5142.6 240.89 5147 241.65 + 5205.2 250.21 5228.1 252.69 5266.6 252.56 5280.7 252.63 5313.7 252.68 + 5328 252.59 5364.5 252.18 5389.4 251.81 5399.2 251.65 5421.7 251.13 + 5450.8 250.52 5484.7 249.645530.438 248.73 +#Mann= 4 ,-1,0 + 0 .4 0 1550.2 .03 0 2626.8 .4 0 +5530.438 .4 0 +Bank Sta=1550.2,2626.8 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=99.85,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,26173 ,973.35,973.35,973.35 +XS GIS Cut Line=4 +1455991.96643705726201.8401290531456628.08288963 727098.1860395 +1457755.74387374727531.9018026191459374.94938938728630.648402523 +Node Last Edited Time=Jan/09/2025 15:13:45 +#Sta/Elev= 148 + 0 233.19 45.3 226.92 77.2 221.39 102.4 213.9 137.9 203.15 + 159.5 196.99 174.8 192.55 216.6 180.95 265.1 167.99 272.4 166.02 + 275.4 165.86 330.7 162.61 370 161.01 387.8 160.51 444.9 158.46 + 467.6 157.55 502 158.64 550.5 164.25 559.1 164.98 565.2 165.43 + 601.3 162.63 616.2 161.49 662.8 157.43 673.3 154.49 688 150.38 + 730.4 136.97 760.4 130.27 787.5 128.6 825.6 126.9 844.6 126.18 + 901.6 125.1 963.1 124.04 1053.3 122.12 1072.9 121.76 1099.1 121.35 + 1132.4 121.58 1165.8 121.26 1185.3 121.22 1194 121.13 1216.7 120.77 + 1255.6 120.1 1270.6 119.72 1304.3 118.19 1317.2 117.73 1355.9 115.5 + 1378.8 112.41 1438.4 104.8 1440.4 104.57 1441.2 104.51 1502 100.45 + 1526.5 98.92 1563.6 98.28 1581.5 98.13 1611.8 97.77 1625.2 98.2 + 1660.1 99.62 1686.8 100.57 1697 100.8 1720.1 101.68 1748.4 102.69 + 1782.3 104.08 1810 105.87 1858.7 109.71 1867.6 110.36 1881.9 110.69 + 1933.2 111.58 1952.9 112.11 1994.8 111.86 2056.3 111.44 2103.6 110.98 + 2117.9 110.82 2123.5 110.74 2135.9 110.54 2179.5 109.75 2208.7 109.32 + 2241.1 109.31 2274.4 109.47 2294 109.52 2302.7 109.58 2318.8 109.6 + 2360.3 109.4 2388.5 109.1 2417.7 108.75 2460.6 108.27 2475 108.26 + 2484.7 108.56 2532.3 112.28 2535.6 112.75 2580.9 118.66 2589.6 119.65 + 2602.4 121.59 2646.9 131.01 2677.1 139.62 2704.2 146.91 2744.1 157.82 + 2761.5 161.01 2773.3 162.62 2818.8 164.05 2834.9 162.82 2869.5 160.88 + 2876.1 160.02 2885.9 159.66 2933.4 158.78 2965.7 161.31 2990.7 165.11 + 3027.6 168.29 3048 169.49 3061.9 169.99 3105.3 171 3158.1 172.17 + 3162.7 172.42 3169.4 172.84 3220 176.19 3254.3 177.81 3277.3 178.31 + 3311.2 178.83 3334.6 179.11 3350.5 179.14 3391.9 179.14 3446.7 179.02 + 3449.2 179 3452.9 178.93 3506.5 177.67 3542.9 176.7 3594.7 175.5 + 3621.1 175 3639 174.81 3678.4 174.81 3736.4 175.29 3793 176.46 + 3831.4 177.37 3850.3 178.32 3878.2 180.45 3907.7 183.69 3927.6 186.69 + 3965 192.09 4020 196.65 4022.3 196.83 4023.8 196.95 4032 197.58 + 4079.6 201.18 4120 204.66 4136.9 207.46 4161.7 211.34 4194.2 215.68 + 4216.2 217.87 4251.5 2214264.121 222.16 +#Mann= 4 ,-1,0 + 0 .4 0 1255.6 .03 0 1952.9 .4 0 +4264.121 .4 0 +Bank Sta=1255.6,1952.9 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=98.27,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,25199.6*,973.35,973.35,973.35 +XS GIS Cut Line=4 +1455267.29968284726331.9548579891456042.83407779 727502.8830065 +1457270.19440112728307.3742538031459076.76980224729957.095778063 +Node Last Edited Time=Jan/09/2025 15:17:50 +#Sta/Elev= 216 + 0 232.28 17.42 230.98 35.96 229.55 49.49 228.37 66.21 226.72 + 79.05 222.55 90.62 218.19 102.02 214.28 115.03 210.14 127.11 207.69 + 139.44 204.7 163.83 200.76 195.49 195.65 212.65 192.85 226.68 190.59 + 261.44 185.32 285.85 181.58 304.58 179.18 320.16 177.61 330.8 176.39 + 351.32 173.26 366.9 170.54 380.72 168.21 398.06 165.44 413.64 163.06 + 423.8 161.59 436.48 159.78 448.5 158.04 481.08 157 522.69 155.77 + 544.49 155.06 596.19 153.97 609.19 153.66 631.75 153.27 647.33 152.95 + 725.47 151.65 749.51 151.11 768.58 150.64 798.33 151.11 826.52 151.59 + 847.12 152.86 896.63 155.91 920.35 157.21 930.58 157.63 974.53 155.9 + 990.02 155.27 1014.55 154.05 1036.85 152.97 1066.76 151.69 1091.17 150.58 + 1113.34 147.25 1132.77 144.39 1188.78 135.01 1199.53 133.24 1213.19 131.53 + 1237.57 128.37 1251.97 126.67 1286.39 125.48 1296.59 125.15 1310.8 124.83 + 1328.81 124.61 1348.47 124.29 1359.32 124.06 1371.9 123.84 1390.6 123.44 + 1410.79 123.2 1441.95 122.94 1456.06 122.86 1481.62 122.63 1504.27 122.41 + 1530.41 122.06 1551.01 121.87 1579.23 121.65 1660.07 120.83 1753.57 119.8 + 1766.49 119.67 1784.73 119.48 1800.31 119.26 1823.25 119.27 1847.66 119.41 + 1864.46 119.31 1878.21 119.05 1889.04 118.82 1906.17 118.79 1919.45 118.94 + 1932.15 119.1 1951.55 119.16 1965.88 119.09 2002.85 118.75 2018.43 118.61 + 2034.01 118.51 2061.43 118.36 2067.3 118.3 2081.87 117.96 2114.6 116.61 + 2127.13 116.2 2164.72 114.22 2182.67 112.03 2243.19 104.92 2278.11 102.55 + 2306.63 100.77 2330.42 99.37 2366.46 98.73 2383.84 98.57 2413.28 98.2 + 2426.08 98.52 2454.09 99.53 2466.28 100.02 2493.72 100.98 2505.86 101.26 + 2532.11 102.16 2561 103 2594.12 104.08 2612.64 104.99 2627.07 105.74 + 2656.2 107.6 2679.31 109.12 2691.88 109.76 2704.19 110 2759.22 110.76 + 2780.35 111.22 2828.84 110.93 2893.13 110.54 2921.01 110.29 2954.74 110.11 + 2967.92 110.02 2982.94 109.84 3042.56 108.94 3076.35 108.52 3113.85 108.49 + 3152.38 108.68 3175.06 108.77 3185.13 108.85 3202.34 108.89 3251.78 108.69 + 3312.24 108.15 3367.85 107.62 3384.51 107.59 3395.73 107.83 3450.81 111.01 + 3461.93 112.13 3506.37 116.49 3517.12 117.43 3530.57 118.97 3551.79 122.3 + 3581.73 127.09 3611.67 133.48 3624.38 136.13 3649.73 141.3 3671.28 145.77 + 3695.9 150.83 3716.04 153.6 3729.69 155.01 3782.34 156.26 3800.97 155.2 + 3837.58 153.64 3848.65 152.74 3859.99 152.44 3881.1 152.27 3905.71 151.98 + 3920.42 152.12 3952.33 153.96 3981.26 157.22 4023.96 159.92 4047.57 160.94 + 4060.72 161.29 4174.97 163.24 4187.08 163.78 4246.6 166.79 4286.29 168.23 + 4312.91 168.71 4352.13 169.26 4379.21 169.58 4421.55 169.72 4445.52 169.76 + 4500.04 169.73 4511.82 169.69 4535.25 169.26 4578.13 168.49 4620.25 167.64 + 4680.19 166.67 4710.74 166.28 4731.46 166.14 4777.05 166.19 4843.54 166.64 + 4909.66 167.73 4954.09 168.56 4975.97 169.41 4988.82 170.19 5008.25 171.45 + 5018.76 172.41 5031.11 173.5 5042.39 174.57 5065.41 177.55 5075.81 178.86 + 5108.57 183.24 5124.92 184.46 5138.51 185.62 5162.55 187.05 5175 187.93 + 5186.22 188.94 5198.38 190.07 5218.68 191.52 5241.3 193.58 5258.25 195.53 + 5288.05 199.29 5307.61 202.81 5318.13 204.46 5336.31 206.94 5348.06 208.41 + 5359.39 209.92 5373.92 211.69 5399.37 213.99 5410.96 214.88 5437.93 216.69 + 5454.83 217.89 +#Mann= 3 ,-1,0 + 0 .4 0 2067.3 .03 0 5454.83 .4 0 +Bank Sta=2067.3,2780.35 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=98.54,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,24226.2*,973.35,973.35,973.35 +XS GIS Cut Line=4 +1454542.63292863726462.0695869241455457.58526596 727907.5799735 + 1456784.6449285729082.8467049871458778.59021509731283.543153604 +Node Last Edited Time=Jan/09/2025 15:17:50 +#Sta/Elev= 240 + 0 231.37 33.59 229.79 50.08 228.93 68.92 227.71 92.21 225.82 + 103.87 221.38 120.37 213.9 142.07 204.53 160.2 197.61 177.01 194 + 194.19 190.24 207.16 188.9 228.15 186.77 272.25 182.34 296.14 179.9 + 315.68 177.96 330.13 176.59 398.09 170.27 410.16 169.33 424.17 168.64 + 445.86 168.11 460.69 167.47 489.26 164.68 500.03 163.27 510.95 161.8 + 530.2 159.38 554.35 156.65 568.02 155.21 590.2 153.14 602.01 152.1 + 624.59 150.05 662.83 149.26 703.96 148.55 727.92 148.14 737.95 147.95 + 758.27 147.51 771.32 147.32 814.71 146.81 839.9 146.46 889.2 145.77 + 901.5 145.59 941.85 145.26 1010.32 144.68 1031.72 144.37 1070.36 143.7 + 1151.05 144.55 1205.29 146.61 1248.69 148.26 1262.26 148.82 1281.71 149.44 + 1295.96 149.83 1357.17 148.44 1370.43 148.12 1383.66 147.76 1412.9 146.6 + 1443.96 145.64 1485.61 144.66 1519.6 143.73 1530.75 142.7 1550.47 140.82 + 1574.14 138.7 1595.84 136.53 1621.55 133.86 1655.54 130.41 1670.51 128.93 + 1689.53 127.53 1704.36 126.2 1723.49 124.52 1743.54 123.06 1791.48 121.98 + 1805.68 121.7 1825.47 121.44 1850.55 121.5 1877.93 121.39 1893.04 121.23 + 1910.55 121.06 1921.33 120.92 1936.61 120.7 1964.72 120.46 1986.42 120.35 + 2008.11 120.29 2029.81 120.29 2067.3 120.1 2094.9 119.93 2138.3 119.42 + 2159.99 119.34 2181.69 119.28 2301.25 118.65 2369.23 118.2 2442.09 117.69 + 2471.18 117.52 2485.48 117.37 2505.17 117.1 2520.16 117.05 2539.13 117.14 + 2550.57 117.22 2573.13 117.31 2593.97 117.08 2607.12 116.85 2630.75 116.2 + 2641.11 116.03 2654.6 116.25 2673.1 116.62 2690.79 116.96 2702.45 117.05 + 2717.81 117.1 2732.95 117.07 2745.85 117.01 2767.54 116.85 2789.24 116.72 + 2810.94 116.61 2832.63 116.57 2870.83 116.56 2879 116.5 2893.14 116.21 + 2924.9 115.03 2937.06 114.68 2973.54 112.95 2990.96 111.05 3049.69 104.82 + 3083.58 102.68 3111.25 101.08 3134.35 99.82 3169.32 99.19 3186.19 99.01 + 3214.75 98.63 3229.54 98.92 3259.45 99.9 3272.47 100.41 3301.76 101.43 + 3314.73 101.72 3342.75 102.6 3373.59 103.3 3412.42 104.3 3444.14 105.61 + 3475.24 107.2 3499.92 108.52 3510.11 109.03 3526.49 109.3 3541.52 109.49 + 3585.24 109.95 3607.8 110.32 3735.89 109.6 3769.9 109.31 3803.9 109.24 + 3820.84 109.19 3848.32 108.87 3868.06 108.6 3905.63 108.14 3944.01 107.72 + 3973.92 107.67 3986.59 107.68 4056.12 108.03 4067.56 108.11 4087.1 108.18 + 4143.26 107.98 4211.94 107.48 4275.09 106.97 4294.02 106.91 4306.77 107.1 + 4353.42 109.04 4369.33 109.74 4381.95 110.7 4406.7 112.5 4432.43 114.4 + 4444.64 115.2 4459.92 116.52 4484.02 119.38 4518.02 123.48 4559.65 130.21 + 4595.26 135.7 4619.74 139.54 4647.71 143.85 4670.58 146.2 4686.09 147.39 + 4745.89 148.48 4767.05 147.57 4790.05 146.85 4808.62 146.23 4821.2 145.47 + 4832.79 145.24 4858.06 145.22 4886 145.04 4896.51 144.85 4938.96 146.61 + 4971.82 149.33 5020.32 151.56 5047.13 152.39 5062.08 152.68 5191.84 154.31 + 5205.6 154.77 5273.2 157.38 5300.1 158.12 5318.28 158.65 5348.51 159.12 + 5423.83 160.05 5467.03 160.29 5525.14 160.41 5561.06 160.42 5571.16 160.4 + 5601.06 159.99 5649.76 159.31 5697.6 158.59 5738.18 158.12 5765.69 157.84 + 5800.38 157.56 5823.91 157.47 5875.7 157.58 5951.22 158 6026.32 159 + 6076.79 159.75 6101.63 160.51 6116.23 161.21 6138.3 162.44 6150.23 163.37 + 6164.27 164.38 6177.07 165.45 6215.04 169.73 6252.24 174.41 6270.82 175.66 + 6286.25 177.01 6313.55 178.15 6324.09 178.68 6337.83 180.02 6354.25 181.77 + 6377.31 183.33 6388.26 184.5 6403.01 185.97 6422.26 188.62 6456.11 193.91 + 6478.32 198.16 6490.27 200.05 6501.62 201.32 6524.27 204.12 6537.14 205.84 + 6553.63 207.71 6582.55 210.1 6595.71 211 6626.34 212.55 6645.53 213.63 +#Mann= 3 ,-1,0 + 0 .4 0 2879 .03 0 6645.53 .4 0 +Bank Sta=2879,3607.8 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=98.81,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,23252.8*,973.35,973.35,973.35 +XS GIS Cut Line=4 +1454193.15848995726244.7840915311454872.33652752728312.276889746 +1456299.09551677729858.3190589171458480.41066534732609.990362792 +Node Last Edited Time=Jan/14/2025 14:48:07 +#Sta/Elev= 263 + 0 230.46 43.05 229.1 64.2 228.31 74.68 227.89 88.35 227.05 + 98.68 226.48 118.21 224.91 133.15 218.61 154.31 208.01 182.13 194.77 + 205.37 185.09 218.08 182.13 237.75 177.77 248.95 175.78 265.57 174.61 + 292.48 172.77 349.01 169.03 379.63 166.95 404.69 165.33 448.88 162.63 + 468.83 161.47 510.32 158.96 525.8 158.28 543.76 158.09 571.57 158.62 + 590.57 158.56 602.77 158.34 627.2 156.1 641.01 154.62 655.01 153.07 + 679.68 150.56 710.64 147.86 728.17 146.5 738.45 145.8 756.6 144.69 + 771.75 143.81 800.69 142.07 833.57 141.58 858.85 141.25 902.43 140.82 + 933.15 140.52 946.01 140.36 960.97 140.11 972.06 139.96 988.78 139.79 + 1033.12 139.5 1064.36 139.24 1076.7 139.11 1087.57 138.97 1100.04 138.86 + 1139.9 138.4 1155.67 138.22 1295.16 137.71 1307.74 137.59 1372.13 136.76 + 1475.57 137.5 1545.11 139.23 1555.92 139.47 1600.74 140.6 1618.14 141.11 + 1643.08 141.68 1661.34 142.03 1739.81 140.98 1767.46 140.54 1811.25 139.16 + 1823.25 138.82 1851.07 138.3 1904.45 137.63 1948.03 136.88 1962.32 136 + 1987.61 134.39 2022.3 132.4 2078.72 128.64 2122.3 125.8 2141.49 124.62 + 2165.88 123.53 2184.88 122.26 2209.41 120.68 2235.11 119.46 2296.57 118.47 + 2314.77 118.25 2340.15 118.05 2351.77 118.12 2372.29 118.38 2383.68 118.57 + 2426.76 118.39 2449.21 118.29 2463.02 118.17 2482.61 117.96 2518.65 117.72 + 2546.46 117.64 2574.28 117.64 2599.47 117.73 2645.1 117.61 2680.06 117.48 + 2741.16 116.85 2796.79 116.8 2824.61 116.72 2963.68 116.33 3037.21 116.03 + 3064.74 115.93 3130.61 115.58 3153.67 115.5 3167.9 115.44 3186.24 115.27 + 3211.48 114.93 3230.69 114.9 3255.01 115.01 3269.68 115.1 3298.59 115.21 + 3328.57 114.78 3342.17 114.51 3353.12 114.15 3372.46 113.58 3385.75 113.34 + 3403.03 113.7 3426.74 114.31 3449.42 114.81 3464.38 114.95 3492.19 115.07 + 3503.48 115.03 3520.01 114.98 3547.82 114.81 3575.63 114.7 3603.45 114.61 + 3631.26 114.64 3659.08 114.73 3680.22 114.75 3690.7 114.71 3704.41 114.45 + 3735.21 113.45 3747 113.15 3782.36 111.67 3799.25 110.073849.365105.3613 + 3856.19 104.72 3889.05 102.82 3915.88 101.4 3938.27 100.27 3958.33 99.88 + 3972.18 99.64 3988.53 99.45 4016.22 99.06 4033 99.31 4064.81 100.27 + 4078.65 100.81 4109.8 101.88 4123.59 102.17 4148.08 102.87 4227.48 104.41 + 4261.21 105.49 4294.28 106.79 4320.52 107.93 4331.36 108.37 4348.78 108.61 + 4364.77 108.77 4379.79 108.87 4411.26 109.13 4435.25 109.43 4578.66 108.65 +4593.915108.5252 4614.12 108.36 4673.77 108.35 4686.29 108.24 4733.35 107.68 + 4768.69 107.33 4811.66 106.93 4831.98 106.86 4852.64 106.85 4908.34 107.11 + 4937.18 107.28 4949.98 107.38 4971.87 107.47 5034.74 107.27 5182.34 106.32 + 5203.53 106.24 5217.8 106.37 5253.15 107.39 5287.84 108.47 5301.98 109.26 + 5329.68 110.74 5358.5 112.3 5372.16 112.98 5389.26 114.08 5448.91 119.39 + 5463.77 120.98 5492.39 124.49 5540.8 130.09 5568.2 133.31 5599.51 136.86 + 5625.11 138.79 5642.48 139.78 5709.43 140.69 5733.12 139.95 5779.67 138.83 + 5793.75 138.19 5806.72 138.01 5835.01 138.17 5866.3 138.1 5878.07 137.88 + 5925.6 139.25 5962.38 141.43 6016.68 143.19 6045.24 143.8 6063.43 144.07 + 6208.72 145.38 6225.34 145.8 6299.8 147.98 6343.34 148.91 6384.12 149.52 + 6411.53 149.81 6434 150.11 6468.44 150.52 6516.81 150.86 6552.75 150.99 + 6581.86 151.07 6622.08 151.11 6633.39 151.08 6666.87 150.71 6721.39 150.13 + 6748.74 149.79 6774.95 149.53 6820.38 149.19 6851.18 149.01 6890.03 148.84 + 6916.37 148.8 6974.34 148.96 7058.9 149.36 7118.55 150 7167.5 150.57 + 7178.19 150.68 7199.48 150.94 7227.3 151.6 7237.84 151.97 7253.94 152.69 + 7268.35 153.44 7281.71 154.33 7297.42 155.26 7311.76 156.34 7357.07 160.87 + 7395.92 165.58 7416.71 166.86 7433.99 168.4 7464.56 169.25 7476.36 169.71 + 7491.75 171.31 7510.13 173.47 7535.94 175.15 7548.2 176.59 7564.71 178.37 + 7586.27 181.71 7624.16 188.54 7649.03 193.52 7662.41 195.63 7675.12 196.87 + 7685.52 198.14 7700.47 199.83 7714.88 201.76 7733.35 203.72 7765.72 206.22 + 7776.61 206.96 7814.75 208.42 7836.24 209.36 +#Mann= 3 ,-1,0 + 0 .4 0 3690.7 .03 0 7836.24 .4 0 +Bank Sta=3849.365,4593.915 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=99.08,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,22279.5*,973.35,973.35,973.35 +XS GIS Cut Line=6 +1453190.57147844725152.050104585 1453187.5159881725812.472642779 +1453298.68405467726548.9610837641454287.08764229728716.973907499 +1455813.54598326730633.791607354 1458182.2310408733936.437904686 +Node Last Edited Time=Jan/14/2025 14:47:59 +#Sta/Elev= 285 + 0 229.54 37.94 228.74 52.52 228.41 78.32 227.69 91.1 227.3 + 107.78 226.38 120.39 225.79 144.21 224.01 154.32 219.99 172.15 210.84 + 188.25 202.13 222.18 185.02 250.53 172.57 266.05 168.88 276.83 166.61 + 290.04 163.6 303.7 161.32 323.97 160.32 356.8 158.77 425.77 155.72 + 463.13 154 493.69 152.7 547.61 150.53 569.39 149.72 622.56 147.65 + 641.44 147.24 663.34 147.55 675.72 148.11 697.28 149.13 720.46 149.64 + 731.21 149.9 765.14 147.52 781.99 145.98 799.07 144.33 829.17 141.73 + 866.93 139.08 888.31 137.79 900.86 137.16 923 136.23 934.79 135.77 + 950.61 135.15 976.79 134.08 1016.89 133.65 1047.74 133.38 1100.91 133.1 + 1138.38 132.9 1154.07 132.78 1172.31 132.54 1185.84 132.41 1206.24 132.25 + 1260.34 132.08 1298.45 131.87 1313.5 131.76 1326.77 131.63 1341.97 131.51 + 1390.59 131.04 1409.83 130.85 1472.93 130.83 1486.18 130.8 1580.01 130.75 + 1613.48 130.48 1676.75 129.8 1800.1 130.46 1844.95 131.19 1884.93 131.85 + 1898.12 132.03 1952.79 132.95 1974.01 133.4 2004.44 133.91 2026.73 134.22 + 2057.55 134.04 2122.45 133.52 2156.17 133.18 2209.6 131.71 2224.24 131.38 + 2258.17 130.97 2270.14 130.86 2323.3 130.59 2376.47 130.03 2429.63 127.75 + 2461.76 126.61 2495.69 125.2 2535.9 123.41 2589.06 121.2 2612.47 120.31 + 2642.22 119.54 2665.41 118.32 2695.33 116.83 2706.31 116.53 2726.68 115.86 + 2748.49 115.58 2767.2 115.39 2801.65 114.97 2823.86 114.8 2854.82 114.66 + 2868.99 114.81 2902.92 115.44 2936.86 115.59 2960.48 115.55 2987.87 115.51 + 3004.72 115.42 3028.61 115.21 3072.58 114.97 3106.51 114.92 3140.44 114.98 + 3171.18 115.16 3226.84 115.11 3269.49 115 3280 114.93 3333.11 114.37 + 3344.03 114.28 3377.96 114.29 3411.89 114.32 3445.82 114.26 3457.15 114.26 + 3598.86 114.11 3705.19 113.86 3717.33 113.86 3832.61 113.44 3864.62 113.36 + 3886.99 113.16 3917.78 112.76 3941.21 112.75 3970.89 112.87 3988.78 112.99 + 4024.05 113.11 4056.65 112.58 4077.21 112.16 4090.58 111.7 4114.17 110.96 + 4124.51 110.68 4151.47 111.16 4180.39 111.99 4208.06 112.67 4226.3 112.86 + 4260.23 113.03 4274 112.99 4294.16 112.95 4328.1 112.77 4362.03 112.67 + 4395.96 112.61 4429.89 112.7 4463.82 112.87 4489.62 112.95 4502.4 112.91 + 4515.68 112.69 4545.51 111.87 4556.93 111.62 4591.18 110.39 4607.54 109.09 + 4627.42 107.51 4662.69 104.62 4694.52 102.95 4742.19 100.72 4761.63 100.33 + 4775.03 100.1 4790.88 99.9 4817.7 99.49 4836.46 99.71 4870.17 100.64 + 4889.35 101.37 4917.84 102.33 4932.45 102.63 4958.4 103.31 5038.64 104.47 + 5078.28 105.36 5100.1 105.98 5113.33 106.38 5141.13 107.34 5152.62 107.71 + 5171.07 107.91 5188.01 108.05 5237.28 108.31 5262.7 108.54 5421.43 107.71 + 5460.68 107.39 5505.7 107.49 5526.7 107.52 5540.55 107.41 5589.97 106.87 + 5631.76 106.52 5679.32 106.13 5701.8 106.04 5724.67 106.03 5790.69 106.34 + 5818.24 106.53 5832.41 106.64 5856.64 106.76 5884.92 106.71 5922.65 106.57 +5965.733 106.366 6011.33 106.15 6089.58 105.67 6113.03 105.56 6128.83 105.64 + 6186.65 106.75 6206.36 107.2 6222 107.82 6252.67 108.98 6284.56 110.21 + 6299.68 110.76 6320.53 111.72 6390.62 116.27 6401.08 117.17 6432.75 120 + 6486.33 124.48 6516.66 127.08 6551.31 129.87 6579.65 131.39 6598.87 132.17 + 6672.98 132.91 6699.2 132.326726.033131.8775 6727.7 131.85 6750.72 131.42 + 6766.3 130.92 6780.66 130.78 6811.97 131.12 6846.6 131.15 6859.62 130.92 + 6912.23 131.9 6952.95 133.54 7013.04 134.83 7044.65 135.26 7068.91 135.49 + 7106.92 135.65 7225.59 136.44 7242.63 136.76 7326.4 138.57 7359.73 139.09 + 7374.59 139.35 7419.73 139.93 7440.61 140.12 7506.63 140.92 7566.58 141.43 + 7638.59 141.72 7683.11 141.8 7695.63 141.77 7705.72 141.73 7732.67 141.43 + 7781.16 141.06 7823.29 140.66 7865.43 140.4 7902.59 140.26 7949.7 140.16 + 7968.6 140.15 7979.67 140.12 8008.82 140.13 8072.99 140.35 8166.58 140.71 + 8286.78 141.81 8298.62 141.89 8322.18 142.13 8352.96 142.7 8364.63 143.01 + 8382.45 143.68 8398.4 144.44 8413.19 145.29 8430.58 146.14 8446.45 147.22 + 8496.6 151.74 8539.6 156.75 8562.61 158.07 8581.73 159.79 8615.57 160.35 + 8628.63 160.74 8645.66 162.6 8666 165.17 8694.57 166.96 8708.14 168.67 + 8726.42 170.77 8750.27 174.8 8760.59 177.26 8792.22 183.17 8819.74 188.87 + 8834.54 191.21 8848.61 192.41 8860.13 193.74 8876.68 195.54 8892.62 197.67 + 8913.07 199.74 8948.9 202.33 8960.95 203.11 9003.16 204.28 9026.94 205.1 +#Mann= 3 ,-1,0 + 0 .4 0 4502.4 .03 0 9026.94 .4 0 +Bank Sta=5965.733,6726.033 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=105.56,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,21306.1*,973.35,973.35,973.35 +XS GIS Cut Line=5 +1452340.84055847725045.9327083911452881.80380506727229.865491466 +1453701.83875706729121.6709252531455327.99644975731409.264155792 +1457884.05141626 735262.88544658 +Node Last Edited Time=Jan/14/2025 14:47:46 +#Sta/Elev= 291 + 0 228.63 44.78 227.99 61.99 227.72 92.44 227.07 107.53 226.71 + 127.21 225.72 142.09 225.1 170.21 223.1 182.14 218.18 203.19 206.94 + 222.19 196.24 232.95 190.02 262.24 175.27 295.7 160.04 314.01 155.62 + 326.74 152.91 342.33 149.42 358.45 146.86 382.38 146.02 421.13 144.77 + 502.53 142.41 546.62 141.05 582.69 140.07 646.33 138.43 734.79 136.34 + 757.08 136.19 782.93 137.01 797.54 137.95 822.98 139.64 850.34 140.73 + 863.03 141.26 903.08 138.94 922.97 137.33 943.13 135.59 978.65 132.9 + 1023.22 130.29 1048.46 129.08 1063.27 128.53 1089.4 127.78 1103.32 127.42 + 1152.88 126.1 1200.22 125.72 1223.47 125.57 1236.63 125.51 1299.38 125.37 + 1310.97 125.37 1343.61 125.28 1362.13 125.19 1383.66 124.97 1423.71 124.72 + 1487.55 124.66 1532.54 124.51 1583.9 124.17 1641.29 123.67 1664 123.49 + 1675.73 123.48 1738.47 123.61 1754.11 123.61 1864.86 123.78 1904.36 123.53 + 1979.03 122.86 2124.62 123.41 2224.75 124.47 2240.31 124.58 2304.84 125.29 + 2329.89 125.68 2365.81 126.15 2392.11 126.42 2428.49 126.36 2505.09 126.06 + 2544.89 125.81 2607.96 124.27 2625.23 123.94 2665.28 123.63 2679.41 123.58 + 2742.15 123.56 2804.9 123.18 2825.47 122.61 2861.89 121.53 2911.84 120.42 + 2945.62 119.53 2993.07 118.19 3055.82 116.59 3083.46 116 3118.57 115.54 + 3145.93 114.38 3181.25 112.98 3194.21 112.78 3218.26 112.26 3243.99 112 + 3266.07 111.84 3306.74 111.47 3346.17 111.3 3369.49 111.27 3386.22 111.51 + 3415.78 112.15 3426.27 112.4 3466.32 112.69 3494.2 112.72 3526.53 112.74 + 3546.41 112.66 3574.62 112.47 3626.51 112.23 3666.56 112.21 3706.61 112.33 + 3745.83 112.61 3808.58 112.6 3858.92 112.52 3871.33 112.44 3934.01 111.81 + 3946.9 111.71 3986.95 111.76 4026.99 111.83 4067.04 111.81 4080.42 111.83 + 4247.67 111.85 4373.17 111.69 4387.5 111.7 4523.55 111.34 4547.69 111.32 + 4561.34 111.28 4587.74 111.05 4610.65 110.74 4624.09 110.58 4634.31 110.57 + 4686.77 110.74 4707.89 110.88 4749.51 111.02 4787.98 110.33 4812.26 109.82 + 4828.03 109.26 4855.87 108.34 4868.08 108 4899.9 108.61 4934.04 109.67 + 4966.69 110.52 4988.23 110.76 5016.57 110.93 5028.27 110.98 5044.53 110.94 + 5068.32 110.92 5108.37 110.73 5148.42 110.65 5188.47 110.6 5228.52 110.76 + 5251.35 110.93 5299.01 111.15 5314.1 111.11 5326.95 110.93 5355.81 110.29 + 5366.86 110.1 5400 109.12 5415.83 108.11 5435.06 106.87 5469.19 104.53 + 5499.99 103.09 5546.12 101.17 5564.92 100.78 5577.89 100.55 5593.22 100.34 + 5619.18 99.93 5639.92 100.11 5675.53 101.01 5691.02 101.6 5725.88 102.78 + 5741.32 103.09 5768.73 103.74 5779.16 103.97 5853.48 104.6 5895.35 105.23 + 5932.37 105.97 5973.87 107.05 5993.37 107.22 6011.26 107.34 6028.07 107.37 + 6063.3 107.49 6078.42 107.59 6090.15 107.64 6188.17 107.11 6264.2 106.77 + 6295.76 106.5 6307.23 106.42 6379.62 106.69 6402.8 106.51 6451.93 106.01 + 6494.82 105.71 6546.97 105.33 6571.63 105.22 6596.71 105.2 6669.09 105.55 + 6699.3 105.79 6726.21 105.98 6741.4 106.06 6772.42 106.01 6813.79 105.85 + 6911.02 105.48 6994.01105.0255 6996.83 105.01 7022.54 104.89 7039.87 104.91 + 7082.77 105.36 7103.26 105.61 7124.87 105.93 7210.62 108.12 7227.2 108.53 + 7247.96 109.19 7320.35 112.36 7338.38 113.35 7373.11 115.51 7383.46 116.1 + 7431.86 118.88 7465.12 120.85 7503.12 122.88 7534.19 123.98 7555.26 124.55 + 7636.52 125.12 7665.27 124.7 7696.53 124.36 7721.76 124.02 7738.85 123.64 + 7754.59 123.55 7770.06123.7843 7788.93 124.07 7826.9 124.21 7841.18 123.95 + 7898.86 124.55 7927.53 125.24 7943.51 125.65 8009.41 126.46 8044.07 126.72 + 8070.66 126.86 8112.34 126.92 8242.46 127.51 8262.64 127.77 8353 129.17 + 8389.55 129.58 8405.85 129.79 8455.33 130.33 8488.6 130.62 8557.66 131.46 + 8616.36 132 8659.99 132.22 8695.32 132.38 8744.13 132.49 8757.86 132.46 + 8768.93 132.42 8798.48 132.15 8851.64 131.86 8897.85 131.53 8944.05 131.37 + 8984.79 131.33 9101.28 131.46 9171.64 131.73 9274.26 132.07 9376.3 132.82 + 9406.06 133.05 9419.04 133.11 9444.87 133.32 9478.63 133.79 9491.42 134.04 + 9510.97 134.68 9528.45 135.43 9544.67 136.25 9563.73 137.02 9581.13 138.1 + 9616.67 140.99 9632.72 142.33 9683.27 147.92 9708.51 149.27 9729.47 151.18 + 9766.58 151.46 9780.9 151.77 9799.57 153.9 9821.88 156.87 9853.21 158.78 + 9868.08 160.76 9888.12 163.16 9914.28 167.88 9925.59 170.83 9960.27 177.8 + 9990.45 184.2210006.68 186.7910022.11 187.9610034.74 189.3410052.88 191.25 +10070.37 193.5910092.78 195.7510132.07 198.4510142.68 199.1810191.57 200.15 +10217.65 200.83 +#Mann= 3 ,-1,0 + 0 .4 0 5314.1 .03 010217.65 .4 0 +Bank Sta=6994.01,7770.06 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=104.89,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,20332.7*,973.35,973.35,973.35 +XS GIS Cut Line=5 +1451690.28575774725145.1674351551452284.27544728727438.305616273 +1453116.58987183729526.3679430071454842.44691623 732184.73670423 +1459454.11291036739692.774846709 +Node Last Edited Time=Jan/14/2025 14:47:19 +#Sta/Elev= 298 + 0 227.72 71.46 227.04 106.56 226.45 123.95 226.12 146.64 225.06 + 163.79 224.41 196.2 222.2 209.96 216.37 234.23 203.04 256.12 190.35 + 268.54 182.98 302.29 165.52 313.36 160.5 340.87 147.52 361.97 142.36 + 376.64 139.21 394.62 135.25 413.2 132.4 440.79 131.73 485.45 130.78 + 579.28 129.11 630.11 128.1 671.69 127.44 745.05 126.34 774.7 125.99 + 847.03 125.03 872.72 125.15 902.52 126.47 919.36 127.79 948.69 130.15 + 980.23 131.81 991.69 132.5 1041.02 130.35 1063.94 128.69 1087.18 126.85 + 1128.13 124.07 1179.52 121.5 1208.61 120.37 1225.68 119.9 1255.8 119.33 + 1271.85 119.07 1293.37 118.73 1328.98 118.11 1383.55 117.78 1410.34 117.67 + 1425.52 117.64 1497.85 117.64 1511.21 117.67 1548.84 117.65 1570.18 117.6 + 1595.01 117.4 1641.17 117.19 1714.77 117.23 1766.63 117.14 1825.83 116.82 + 1872 116.48 1894.29 116.28 1918.17 116.12 1931.68 116.13 2004.02 116.4 + 2022.04 116.43 2149.71 116.81 2195.24 116.59 2277.45 115.95 2287.57 115.91 + 2449.15 116.36 2564.56 117.08 2582.51 117.14 2656.9 117.64 2727.17 118.38 + 2757.49 118.62 2799.42 118.68 2887.72 118.6 2915.94 118.53 2933.61 118.45 + 2944.09 118.35 2980.05 117.43 3016.42 116.59 3072.39 116.3 3088.67 116.29 + 3161 116.53 3210.88 116.36 3233.33 116.32 3257.05 115.91 3299.02 115.1 + 3356.6 114.42 3395.55 113.87 3450.25 112.97 3522.58 111.98 3534.12 111.89 + 3554.44 111.69 3594.91 111.54 3626.45 110.44 3667.16 109.13 3682.1 109.03 + 3709.83 108.65 3739.5 108.42 3764.95 108.29 3811.83 107.97 3857.28 107.87 + 3884.16 107.88 3903.45 108.2 3937.52 109.04 3949.61 109.36 3995.78 109.78 + 4027.92 109.88 4065.18 109.96 4088.11 109.91 4180.44 109.49 4226.61 109.5 + 4272.77 109.68 4317.99 110.05 4398.71 110.09 4448.34 110.03 4462.65 109.95 + 4534.9 109.25 4549.77 109.14 4595.93 109.23 4607.24 109.28 4642.1 109.35 + 4688.26 109.36 4703.68 109.39 4896.48 109.58 5041.15 109.52 5057.67 109.55 + 5214.5 109.24 5242.33 109.24 5258.06 109.2 5288.49 108.94 5314.9 108.59 + 5330.39 108.41 5342.17 108.41 5402.64 108.61 5426.99 108.77 5474.98 108.92 + 5519.32 108.09 5547.31 107.48 5565.49 106.81 5597.58 105.72 5611.65 105.31 + 5648.33 106.07 5687.69 107.35 5725.33 108.38 5750.15 108.67 5796.32 108.94 + 5815.05 108.9 5842.48 108.89 5853 108.82 5888.65 108.7 5934.81 108.62 + 5980.98 108.6 6027.15 108.82 6053.47 109.04 6108.41 109.35 6125.8 109.32 + 6138.22 109.18 6156.64 108.86 6176.79 108.57 6208.83 107.84 6224.12 107.13 + 6242.71 106.22 6275.7 104.43 6305.46 103.22 6350.04 101.63 6368.21 101.23 + 6380.75 101.01 6420.65 100.36 6443.38 100.51 6480.88 101.38 6502.23 102.18 + 6533.92 103.23 6550.18 103.55 6579.05 104.18 6590.04 104.39 6668.32 104.72 + 6712.42 105.1 6736.7 105.37 6751.41 105.57 6795.13 106.38 6834.51 106.62 + 6852.22 106.62 6889.31 106.68 6917.6 106.75 7024.25 106.18 7056.7 106.06 + 7106.96 105.83 7153.79 105.45 7207.5 105.73 7232.55 105.86 7308.04 105.2 + 7357.89 104.91 7414.63 104.53 7441.45 104.41 7458.84 104.38 7477.58 104.42 + 7547.5 104.77 7580.37 105.04 7609.64 105.26 7626.17 105.35 7659.91 105.31 + 7704.93 105.147803.108104.8337 7810.71 104.81 7904.07 104.36 7932.05 104.22 + 7950.9 104.18 8019.87 104.46 8043.39 104.66 8062.05 104.95 8098.63 105.45 + 8136.68 106.03 8154.72 106.31 8177.31 106.74 8256.06 108.85 8275.69 109.54 + 8313.48 111.01 8324.74 111.39 8334.82 111.71 8413.58 114.62 8454.92 115.9 + 8488.73 116.58 8511.66 116.948594.899117.3167 8600.06 117.34 8631.35 117.08 + 8665.35 116.86 8692.81 116.61 8711.4 116.37 8728.53 116.33 8765.89 117.02 + 8807.2 117.27 8822.73 116.98 8885.49 117.2 8916.69 117.54 8934.07 117.76 + 9005.77 118.1 9043.48 118.18 9072.41 118.24 9117.76 118.2 9259.33 118.58 + 9279.67 118.74 9379.6 119.76 9419.37 120.06 9437.1 120.23 9527.13 121.03 + 9602.28 121.93 9666.14 122.57 9752.05 123.04 9805.15 123.18 9820.09 123.15 + 9830.8 123.13 9864.29 122.88 9922.13 122.66 9972.4 122.410022.67 122.35 +10066.99 122.3910083.26 122.46 10123.2 122.5610145.75 122.6610193.73 122.79 +10270.29 123.1210303.27 123.1910381.94 123.4310525.34 124.2910539.46 124.33 +10567.57 124.5110604.29 124.8910618.22 125.0810639.48 125.67 10658.5 126.43 +10676.14 127.2110696.89 127.910715.82 128.9810726.41 129.6410771.95 133.2 +10826.95 139.0910854.41 140.4710877.22 142.5810917.58 142.5610933.17 142.81 +10953.48 145.1910977.75 148.5711011.84 150.5911028.02 152.84 11056.6 156.41 +11078.29 160.97 11090.6 164.411128.33 172.4211169.35 181.3511195.61 183.5 +11209.35 184.9411229.09 186.9611248.11 189.51 11272.5 191.7611315.25 194.56 +11326.79 195.3411379.98 196.0111408.36 196.56 +#Mann= 3 ,-1,0 + 0 .4 0 6125.8 .03 011408.36 .4 0 +Bank Sta=7803.108,8594.899 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=104.18,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,19359.3*,973.35,973.35,973.35 +XS GIS Cut Line=5 +1450794.23481004 726251.09076469 1452531.3409866729931.064960761 +1454356.89738272732960.2092526671457639.57476115738040.361990942 +1458214.09272188739382.581408638 +Node Last Edited Time=Jan/14/2025 14:47:28 +#Sta/Elev= 299 + 0 226.81 80.93 226.35 120.68 225.83 140.38 225.52 166.07 224.4 + 185.5 223.72 222.2 221.29 237.78 214.56 265.26 199.13 290.06 184.47 + 304.12 175.94 342.35 155.76 354.88 149.98 386.03 134.99 409.94 129.1 + 426.55 125.52 446.91 121.07 467.95 117.94 499.19 117.44 549.78 116.78 + 656.04 115.8 713.61 115.15 843.78 114.24 877.35 114.12 959.26 113.72 + 969.83 113.78 988.36 114.1 1022.11 115.92 1041.18 117.62 1074.39 120.66 + 1110.11 122.9 1123.1 123.81 1178.96 121.77 1204.92 120.04 1231.24 118.11 + 1277.62 115.25 1298.92 114.3 1335.81 112.72 1368.75 111.66 1388.09 111.26 + 1422.2 110.87 1440.37 110.72 1450.67 110.66 1505.08 110.13 1566.87 109.85 + 1614.41 109.76 1696.33 109.92 1711.46 109.98 1754.07 110.03 1778.24 110.01 + 1806.35 109.82 1858.64 109.66 1941.98 109.81 2000.71 109.78 2023.9 109.7 + 2067.77 109.48 2120.05 109.12 2145.3 108.91 2172.33 108.76 2187.64 108.78 + 2269.56 109.18 2289.97 109.24 2434.55 109.85 2486.12 109.64 2579.23 109.01 + 2590.69 108.97 2842.79 109.52 2904.38 109.7 2924.7 109.69 3008.95 109.98 + 3088.54 110.62 3113.51 110.75 3170.36 111 3270.36 111.14 3302.32 111.13 + 3322.33 111.08 3334.19 110.99 3374.93 110.02 3416.11 109.13 3427.21 109.06 + 3479.49 108.96 3497.94 109 3579.85 109.49 3636.34 109.45 3662.13 109.47 + 3688.62 109.22 3736.16 108.67 3793.19 108.47 3845.47 108.2 3907.42 107.74 + 3989.34 107.38 4025.42 107.38 4035.64 107.4 4071.26 107.54 4106.98 106.5 + 4153.08 105.28 4170 105.28 4201.4 105.05 4211.54 105.01 4235 104.84 + 4263.83 104.75 4316.91 104.46 4368.39 104.44 4398.83 104.49 4420.67 104.9 + 4459.26 105.92 4472.96 106.31 4525.24 106.88 4561.64 107.04 4603.84 107.19 + 4629.8 107.15 4734.37 106.74 4786.65 106.79 4838.94 107.03 4886.29 107.46 + 4972.06 107.59 5037.77 107.55 5048.07 107.51 5135.8 106.69 5152.63 106.57 + 5204.92 106.7 5217.72 106.76 5257.2 106.87 5309.48 106.9 5326.94 106.95 + 5545.29 107.32 5675.55 107.31 5727.83 107.39 5905.45 107.14 5936.96 107.15 + 5954.78 107.12 5989.25 106.84 6036.7 106.23 6050.04 106.24 6118.52 106.47 + 6146.1 106.65 6200.44 106.82 6250.66 105.84 6282.35 105.13 6302.94 104.36 + 6339.29 103.1 6355.23 102.63 6396.77 103.52 6407.51 103.79 6441.33 105.04 + 6483.96 106.23 6512.08 106.57 6564.36 106.9 6585.58 106.86 6616.64 106.86 + 6628.55 106.79 6668.92 106.66 6721.21 106.6 6773.49 106.6 6825.77 106.89 + 6855.58 107.16 6917.8 107.54 6937.5 107.52 6949.49 107.42 6976.41 107.13 + 6986.72 107.05 7017.65 106.56 7032.41 106.15 7050.35 105.57 7082.2 104.33 + 7110.93 103.36 7127.22 102.89 7153.97 102.08 7171.51 101.67 7183.61 101.46 + 7222.13 100.79 7246.84 100.91 7286.24 101.75 7303.38 102.39 7341.96 103.68 + 7389.38 104.61 7400.92 104.82 7483.16 104.85 7555 105.07 7570.46 105.16 + 7616.38 105.72 7657.75 105.91 7676.36 105.86 7732.08 105.87 7745.05 105.85 +7759.874105.7728 7860.32 105.25 7949.73 104.88 7986.85 104.57 8000.35 104.48 + 8010.67 104.51 8085.47 105.02 8112.73 104.84 8170.51 104.34 8220.95 104.1 + 8311.28 103.59 8330.07 103.56 8340.77 103.56 8425.9 103.98 8461.43 104.3 + 8493.07 104.54 8510.93 104.64 8547.41 104.6 8566.79104.5323 8596.06 104.43 + 8710.41 104.15 8819.08 103.68 8841.56 103.54 8861.93 103.44 8912.39 103.33 + 8936.49 103.32 8961.9 103.38 8982.08 103.51 9021.62 103.69 9062.74 103.93 + 9082.24 104.08 9109.13 104.32 9191.78 105.34 9202.58 105.5 9213 105.72 + 9253.84 106.52 9266.01 106.69 9276.91 106.82 9362.04 108.39 9406.72 108.91 + 9416.84 108.97 9443.27 109.17 9468.05 109.33 9532.21 109.44 9563.61 109.55 + 9634.18 109.37 9663.85 109.21 9683.95 109.09 9702.46 109.1 9742.84 109.97 + 9787.5 110.32 9804.29 110.02 9872.13 109.85 9905.84 109.83 9924.63 109.87 +10042.89 109.6310068.85 109.6210123.18 109.48 10276.2 109.6510298.18 109.74 +10468.35 110.6710565.67 111.4310638.61 112.3110715.92 113.1510808.77 113.69 +10866.18 113.8710882.32 113.84 10893.9 113.8310930.09 113.610992.61 113.47 +11046.95 113.2711101.28 113.32 11149.2 113.4611166.78 113.5711372.95 114.52 +11404.58 114.5711489.62 114.7811535.95 115.0411574.75 115.1811644.62 115.53 +11659.88 115.5411690.26 115.711729.96 115.9811745.01 116.1111767.99 116.67 +11807.62 118.1711830.04 118.7811850.51 119.8611861.96 120.511911.17 124.07 +11970.62 130.26 12000.3 131.6812024.96 133.9712068.59 133.6612079.29 133.88 +12091.19 134.5312107.39 136.4912133.63 140.2712170.47 142.4112187.96 144.93 +12218.85 148.912242.29 154.06 12255.6 157.9712296.38 167.0512340.73 176.89 +12350.96 177.96 12369.1 179.05 12405.3 182.6712425.86 185.4212452.21 187.78 +12498.42 190.6812510.89 191.4912568.39 191.8812599.06 192.3 +#Mann= 3 ,-1,0 + 0 .4 0 6937.5 .03 012599.06 .4 0 +Bank Sta=7759.874,8566.79 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=103.56,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,18386 ,4248.1,4248.1,4248.1 +XS GIS Cut Line=2 +1450194.63240335 727242.757960541456989.51269223739242.227406849 +Node Last Edited Time=Jan/14/2025 14:50:48 +#Sta/Elev= 269 + 0 225.9 32 225.79 65.3 225.75 90.4 225.66 134.8 225.21 + 148.8 225.04 185.5 223.74 207.2 223.03 248.2 220.39 265.6 212.75 + 296.3 195.23 324 178.58 339.7 168.9 382.4 146.01 396.4 139.46 + 431.2 122.47 457.9 115.84 499.2 106.9 522.7 103.48 557.6 103.15 + 614.1 102.78 732.8 102.49 797.1 102.2 942.5 102.14 1071.5 102.41 + 1083.3 102.56 1104 103.06 1141.7 105.38 1163 107.46 1200.1 111.17 + 1240 113.98 1254.5 115.12 1265.6 115.32 1316.9 113.19 1345.9 111.4 + 1375.3 109.37 1427.1 106.42 1437.4 105.96 1450.9 105.49 1492.1 103.93 + 1528.9 102.95 1550.5 102.63 1588.6 102.42 1608.9 102.37 1620.4 102.37 + 1725.7 101.98 1784.1 101.88 1803.3 101.89 1894.8 102.19 1911.7 102.28 + 1959.3 102.41 1986.3 102.42 2017.7 102.25 2076.1 102.13 2169.2 102.39 + 2234.8 102.41 2260.7 102.35 2309.7 102.13 2396.3 101.54 2426.5 101.39 + 2443.6 101.43 2535.1 101.97 2557.9 102.05 2719.4 102.88 2777 102.7 + 2881 102.07 2893.8 102.02 3244.2 102.32 3266.9 102.25 3361 102.33 + 3449.9 102.85 3527.1 103.23 3541.3 103.32 3653 103.68 3688.7 103.73 + 3711.4 103.72 3724.3 103.64 3769.8 102.61 3815.8 101.68 3828.2 101.62 + 3886.6 101.63 3907.2 101.71 3998.7 102.46 4061.8 102.54 4090.2 102.62 + 4120.2 102.52 4173.3 102.24 4295.4 102.54 4364.6 102.52 4456.1 102.77 + 4547.6 103.54 4587.5 102.56 4639 101.43 4657.9 101.53 4704.3 101.42 + 4730.5 101.26 4762.7 101.2 4822 100.96 4879.5 101.01 4913.5 101.1 + 4937.9 101.59 4981 102.81 4996.3 103.27 5054.7 103.98 5142.5 104.41 + 5171.5 104.4 5288.3 104 5346.7 104.08 5405.1 104.38 5462.3 104.93 + 5580.3 105.09 5627.2 105.07 5638.7 105.03 5736.7 104.13 5755.5 104 + 5813.9 104.17 5828.2 104.25 5872.3 104.39 5930.7 104.45 6194.1 105.05 + 6377.1 105.18 6398 105.24 6596.4 105.04 6631.6 105.07 6651.5 105.04 + 6690 104.73 6743 104.06 6757.9 104.07 6834.4 104.34 6865.2 104.54 + 6925.9 104.72 6982 103.59 7017.4 102.79 7040.4 101.91 7081 100.48 + 7098.8 99.95 7108.9 99.92 7145.2 100.98 7157.2 101.29 7200.3 102.92 + 7215.6 103.32 7242.6 104.09 7274 104.48 7332.4 104.86 7356.1 104.82 + 7390.8 104.83 7404.1 104.75 7449.2 104.62 7566 104.6 7624.4 104.95 + 7657.7 105.27 7727.2 105.74 7749.2 105.72 7799.6 105.51 7840.7 105.17 + 7858 104.92 7888.7 104.23 7916.4 103.49 7932.1 103.15 7974.8 102.12 + 7988.8 101.88 8023.6 101.22 8050.3 101.31 8091.6 102.12 8115.1 102.99 + 8150 104.13 8199.7 105.05 8211.8 105.24 8373.3 104.76 8389.5 104.75 + 8442.1 105.09 8481 105.19 8500.5 105.11 8558.9 105.01 8572.5 104.96 + 8696.4 104.32 8734.1 104.19 8792.5 103.94 8832.4 103.61 8846.9 103.51 + 8858 103.55 8938.4 104.19 8967.7 104.01 9026.1 103.53 9181.1 102.77 + 9212.8 102.74 9304.3 103.2 9376.5 103.82 9395.7 103.93 9434.9 103.9 + 9610.1 103.48 9726.9 103.03 9827.2 102.32 9853.1 102.17 9944.6 101.93 + 9988.8 101.84 10019 101.87 10036 101.85 10127.5 101.83 10194.2 102.03 + 10219 101.94 10310.5 102.16 10401.9 101.75 10427.8 101.71 10603 101.87 + 10634.9 101.8 10661.4 101.82 10676.4 101.87 10719.8 102.92 10730.5 102.98 + 10767.8 103.38 10778.2 103.17 10796.5 102.89 10859.3 102.49 10895 102.13 + 11042.3 101.09 11128.6 100.76 11316.7 100.73 11479 101.03 11499.6 101.11 + 11604.2 101.84 11765.7 103.72 11865.5 104.35 11927.2 104.56 11946.3 104.52 + 11957 104.53 11995.9 104.32 12063.1 104.27 12121.5 104.14 12179.9 104.29 + 12231.4 104.53 12250.3 104.68 12471.9 105.91 12505.9 105.94 12530.3 106.02 + 12597.3 106.14 12647.1 106.37 12688.8 106.48 12763.9 106.77 12780.3 106.76 + 12871.8 107.15 12896.5 107.66 12939.1 109.13 12963.2 109.66 12997.5 111.35 + 13050.4 114.94 13114.3 121.43 13146.2 122.88 13172.7 125.36 13219.6 124.76 + 13231.1 124.95 13261.3 127.78 13289.5 131.97 13329.1 134.22 13347.9 137.01 + 13381.1 141.39 13406.3 147.15 13420.6 151.54 13464.7 161.74 13512.1 172.43 + 13523.1 173.54 13542.6 174.59 13581.5 178.38 13603.6 181.34 13639.9 184.48 + 13683.1 186.88 13695 187.65 13756.8 187.7413789.77 188.03 +#Mann= 4 ,-1,0 + 0 .4 0 7749.2 .03 0 8572.5 .4 0 +13789.77 .4 0 +Bank Sta=6925.9,7332.4 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=101.22,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,14138 ,5049.5,5049.5,5049.5 +XS GIS Cut Line=4 +1448488.68373508 731522.086823321451553.60846113733430.436181046 +1453808.93042935735107.4704651091455775.10855549739733.771938385 +Node Last Edited Time=Jan/09/2025 15:13:45 +#Sta/Elev= 361 + 0 206.15 12.6 206.22 25 206.26 70.4 207.28 118.7 208.55 + 128.2 208.84 143.5 209.24 186 210.48 212.5 211.15 243.8 212.1 + 301.6 213.46 306.3 213.54 326.4 213.3 359.4 213.32 400 211.16 + 417.1 207.35 444.6 197.46 474.9 184.2 493.8 174.19 532.7 149.93 + 574.9 126.86 587.6 119.7 590.5 118.81 595.2 118.06 648.3 113.72 + 681.3 112.63 706.1 112.57 745.8 111.37 763.9 110.56 775.1 110.23 + 821.7 110.66 868.9 111.92 879.4 111.68 896.4 111.66 937.2 111.58 + 962.6 111.87 995 112.28 1047 113.22 1110.6 113.14 1150.2 113.18 + 1168.4 113.26 1197.6 113.46 1226.2 113.73 1243.9 113.99 1284 114.91 + 1320.3 117.21 1337.7 118.15 1341.7 117.85 1348.2 117.17 1399.5 111.04 + 1431.5 106.65 1457.3 105.58 1498.8 103.75 1515.1 103.5 1525.2 102.8 + 1568.8 102.77 1572.9 102.78 1619 102.21 1649.4 102.22 1688.5 102.67 + 1712.8 102.28 1746.2 102.3 1800 102.3 1806.5 102.53 1817.3 103.25 + 1861.8 106.44 1900.3 108.32 1919.6 110.43 1950.6 113.35 1977.4 118.16 + 1994.1 120.12 2035.2 120.35 2065.8 117.68 2087.8 116.24 2093 115.68 + 2101.2 114.6 2150.8 107.03 2181.6 104.42 2208.5 104.46 2251.8 104.43 + 2266.3 104.37 2275.4 104.2 2314.3 102.39 2324.1 101.89 2369.1 100.36 + 2381.9 100.25 2402.4 100.21 2439.7 99.88 2462.9 99.78 2497.5 99.93 + 2555.3 101.02 2556.7 101.09 2562.7 101.21 2613 102.66 2650.4 102.42 + 2670.8 102.2 2703.6 102.22 2728.6 102.52 2744.2 102.81 2786.4 103.12 + 2811.2 102.91 2838 102.77 2844.2 102.7 2854.2 102.64 2902 102.61 + 2931.7 102.97 2959.8 103.41 3004.8 103.87 3017.6 103.93 3025.5 103.93 + 3119.3 104.19 3133.1 104.17 3155.4 104.16 3190.9 104.18 3213 104.21 + 3248.7 104.37 3306.8 104.75 3364.3 104.81 3400.6 104.78 3479.9 103.89 + 3494.3 103.77 3537.6 103.91 3556.7 104.03 3595.4 104.24 3686 104.03 + 3709.4 103.88 3740.9 103.66 3766.3 103.56 3785.2 103.58 3823.2 103.36 + 3884.4 102.71 3937 102.78 3983.6 102.75 3993.9 102.8 4050.8 102.85 + 4082.8 102.72 4107.7 102.83 4141.1 103.01 4164.6 103.2 4182 103.27 + 4281.2 103.18 4335.2 102.8 4380.4 102.64 4392.1 102.72 4407.9 102.74 + 4449 102.87 4479.6 102.93 4505.9 103.23 4541.3 103.75 4562.8 104.08 + 4578.8 104.3 4619.7 104.62 4677.9 104.87 4733.5 104.77 4777.1 104.58 + 4790.4 104.51 4808.1 104.47 4876.3 103.83 4904.1 103.41 4941.5 103.26 + 4961 103.32 4975.5 103.43 5017.9 104.08 5074.9 106.53 5131.7 107.56 + 5173.9 108.41 5188.6 108.46 5208.3 108.6 5245.5 108.45 5273.1 108.59 + 5302.4 108.19 5341.7 107.72 5359.3 107.42 5372.3 107.43 5416.1 106.93 + 5461 105.31 5471.5 104.97 5473 104.97 5475.1 104.98 5529.9 104.56 + 5570.7 104.21 5586.8 104.02 5608.5 104.37 5643.7 104.67 5669.9 104.66 + 5700.6 103.91 5741.9 104.34 5757.5 104.45 5769.1 104.61 5814.4 103.93 + 5847.8 103.78 5871.3 103.64 5928.2 102.63 5967.5 101.54 6008.7 101.56 + 6041.9 101.86 6066.7 101.93 6098.8 102.59 6142.1 103.68 6155.7 104.05 + 6165.8 104.28 6212.6 104.28 6265 104.1 6275.5 104.1 6326.4 104.06 + 6421 103.92 6441.5 103.87 6499.6 103.66 6562.8 103.68 6623.5 103.77 + 6643.8 103.67 6672.6 103.61 6684.2 103.5 6711.6 103.29 6744.9 103.12 + 6805.6 102.99 6845.6 102.95 6866.3 102.97 6915.1 102.96 7018.6 102.77 + 7048.4 102.77 7105.1 102.86 7191.6 102.74 7278 102.73 7291.2 102.72 + 7322.1 102.64 7364.5 102.46 7412.6 102.23 7451 102.07 7473.3 102.17 + 7525.6 102.39 7534 102.44 7537.5 102.46 7594.6 102.6 7624 102.64 + 7655.3 102.83 7710.5 103.09 7729.1 103.11 7776.7 103.13 7797 103.05 + 7837.4 103.42 7847.2 103.59 7883.5 104.12 7898.1 106.64 7932.6 113.39 + 7958.8 118.47 7970 120.38 7997.6 121.87 8019.5 123.01 8056.4 125.1 + 8080.2 125.68 8136.1 127.25 8142.9 127.46 8201.6 128.19 8229.4 128.4 + 8262.3 128.22 8298.4 127.95 8315.9 127.83 8323 127.81 8339.6 127.73 + 8383.7 127.6 8402.4 127.61 8444.4 127.56 8488.9 127.3 8505.1 127.1 + 8543.1 126.53 8565.8 126.22 8575.4 126.08 8626.4 125.42 8661.9 124.97 + 8687.1 124.72 8749.7 123.89 8808.5 123.27 8834.8 122.84 8869.2 120.91 + 8900.1 118.22 8921.3 116.63 8929.9 115.87 8950.1 113.65 8990.6 109.6 + 9007.8 108.15 9051.3 105.11 9094.3 101.92 9112 101.28 9153.6 100.8 + 9172.7 100.83 9180.8 100.79 9200.9 100.79 9233.4 100.76 9294.1 100.82 + 9351.3 100.93 9415.5 101.03 9440.3 101.14 9526.8 101.44 9536.9 101.53 + 9560.6 101.62 9597.6 101.67 9613.3 101.68 9658.3 101.66 9699.7 101.71 + 9718.9 101.8 9872.7 102.62 9901 102.75 9953 103.19 9959.2 103.23 + 10022.4 102.91 10045.7 102.93 10083.1 103.03 10103.4 103.14 10132.2 103.26 + 10143.8 103.44 10171.1 103.96 10204.5 104.65 10218.7 105.07 10253.8 106.62 + 10265.2 107.08 10305.2 109.05 10325.9 110.45 10374.6 115.21 10386.6 116.2 + 10391.7 116.66 10404.2 118.24 10447.3 123.26 10478.1 127.56 10508 132.58 + 10554.7 142.35 10564.6 144.27 10568.7 145.05 10578.1 147.61 10629.4 162.14 + 10651.1 166.56 10690.1 174.19 10705.1 176.58 10737.6 182.25 10750.7 181.95 + 10781.7 184.43 10811.4 184.7 10824.1 184.73 10855.5 183.39 10872.1 182.22 + 10910.6 182.15 10932.8 181.43 10985.2 184.07 10993.5 183.98 10997.1 184.01 + 11005.9 184.16 11054.2 184.76 11083.6 185.46 11114.9 186.95 11156.3 187.64 + 11170.1 188.04 11175.6 187.95 11236.3 187.52 11256.6 187.55 11297 187.33 + 11306.7 187.3 11343 187.15 11357.7 187.11 11392.2 186.99 11429.5 186.8 +11447.76 186.8 +#Mann= 4 ,-1,0 + 0 .4 0 1341.7 .03 0 1977.4 .4 0 +11447.76 .4 0 +Bank Sta=1341.7,1977.4 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=102.21,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,9089 ,5453.1,5453.1,5453.1 +XS GIS Cut Line=5 +1448401.94058246732765.4053442631450281.37555597734529.182780949 +1450975.32077697735136.3848493171453230.64274519736264.045833428 +1455312.47840816740138.573317296 +Node Last Edited Time=Jan/09/2025 15:13:45 +#Sta/Elev= 272 + 0 237.08 38.9 233.59 95.1 228.74 148 225.7 151.4 225.47 + 155 225.3 207.7 222.97 257.2 221.66 264 221.23 271.3 220.31 + 320.3 206.29 366.3 194.86 376.7 191.72 387.7 188.55 433 177.59 + 475.5 168.41 489.3 167.03 504 165.23 545.6 161.66 584.7 156.62 + 601.9 153.36 620.3 150.66 658.2 146 693.8 141.49 714.5 136.39 + 736.6 132.57 770.9 125.28 803 116.56 827.2 113.21 852.9 111.5 + 883.5 112.77 912.1 113.28 939.8 116.19 969.3 118.49 996.1 120.8 + 1021.3 121.21 1052.4 116.38 1108.7 107.38 1130.5 104.05 1165 103.51 + 1201.9 103.18 1221.4 103.06 1239.6 102.97 1277.7 102.85 1334 102.89 + 1390.3 103.25 1434.5 103.59 1446.6 103.65 1457.9 103.68 1550.9 103.35 + 1615.6 103.26 1676.3 103.31 1783.5 103.62 1840.8 103.69 1894.6 103.67 + 1953.4 103.52 2009.7 103.54 2066.1 103.49 2122.4 103.57 2178.7 103.58 + 2222.1 103.55 2291.3 103.68 2331.2 103.71 2365.1 103.81 2440.4 103.99 + 2460.3 103.96 2516.6 103.78 2549.6 103.76 2577.4 103.8 2598.5 103.8 + 2629.3 103.9 2685.7 104.2 2719.4 104.32 2742.1 104.32 2762 104.25 + 2798.5 103.56 2840.3 103 2854.9 102.77 2867.7 102.63 2911.3 102.86 + 2961.2 103.2 2973.5 103.33 3024.1 103.95 3080.6 104.41 3137 104.4 + 3185 104.22 3249.8 103.78 3290.8 103.78 3306.2 103.84 3362.6 103.97 + 3396.6 103.98 3419 103.96 3475.4 103.96 3499.5 103.99 3590.9 103.95 + 3652.2 104.02 3679.9 104.01 3711.5 104.07 3774.7 104.23 3830.2 104.21 + 3857.9 104.32 3889.5 104.35 3948.8 104.5 3952.7 104.49 4008.1 104.15 + 4035.9 104.04 4124.9 103.4 4130.7 103.37 4213.8 103.05 4245.5 102.99 + 4308.7 102.94 4391.8 103.08 4423.5 103.1 4486.7 103.26 4542.1 103.33 + 4569.8 103.36 4601.4 103.41 4653 103.38 4664.7 103.39 4720.1 102.24 + 4747.8 101.49 4779.4 100.72 4842.7 99.06 4898.1 98.74 4925.8 98.6 + 5014.8 98.22 5020.6 98.17 5076.1 98.84 5103.8 99.22 5135.4 99.84 + 5198.6 100.96 5254.1 102.04 5281.8 102.47 5313.4 102.84 5370.8 103.74 + 5376.6 103.86 5432.1 103.74 5459.8 103.52 5491.4 103.16 5548.8 102.6 + 5550.7 102.59 5610 102.56 5637.8 102.52 5669.4 102.52 5720.9 102.16 + 5726.7 102.14 5732.6 102.11 5788 102.15 5847.4 102.04 5904.7 102.19 + 5966 102.11 6021.1 102.13 6055.3 102.22 6084.1 102.26 6145.7 102.48 + 6155.1 102.42 6201.6 102.18 6236.1 101.78 6260.4 102.04 6305.8 102.98 + 6326.4 103.45 6378 108.19 6416.8 111.71 6495.5 117.66 6507.1 118.52 + 6554.3 119.63 6597.5 120.66 6613.1 120.85 6642.1 121.24 6687.9 121.92 + 6730.7 122.23 6778.2 122.43 6810.3 122.3 6907 121.64 6959 121.32 + 7024.5 121.21 7049.3 121.14 7083.3 121 7139.7 120.8 7146.6 120.75 + 7200.9 120.58 7259.7 120.31 7320.4 120.07 7377.2 119.95 7410.8 119.95 + 7483 119.72 7501.1 119.62 7522.2 119.44 7553.6 119.21 7591.5 118.8 + 7612.3 118.66 7651.1 118.35 7671.1 118.2 7681.8 118.13 7729.9 117.89 + 7772.2 117.76 7788.7 117.66 7819.3 117.41 7847.5 117.13 7862.6 116.85 + 7906.2 114.35 7912.8 113.72 7952.9 110.33 7965 108.94 7987.5 106.79 + 8023.8 103.59 8043.3 102.42 8082.6 101.52 8108.1 101.19 8133.7 100.78 + 8224 100.71 8258.9 100.64 8314.4 100.47 8323.8 100.47 8376.5 100.51 + 8435.2 100.68 8492 100.78 8552.8 100.68 8611.6 100.67 8729.1 100.74 + 8766.2 100.79 8828.4 101.09 8856.5 101.17 8964.2 101.63 8996.5 101.87 + 9023 102.04 9037.3 102.21 9081.8 102.84 9140.6 103.95 9164.7 104.55 + 9199.4 106.01 9218 107.24 9258.1 112.85 9279.9 116.61 9308.4 121.26 + 9316.9 122.69 9332.9 125.16 9375.7 131.5 9398.7 134.43 9434.5 137.98 + 9475.2 140.29 9489.1 141.25 9493.3 141.39 9501 141.29 9552 140.41 + 9579.4 139.55 9610.8 138.74 9670.5 138.53 9728.4 138.19 9760.2 138.05 + 9787.2 139.71 9837.4 146.06 9845.9 147.27 9850.5 148.32 9904.7 163.65 + 9940.9 173.83 9963.5 179.27 10005.6 184.6 10022.3 186.57 10031.2 187.02 + 10121.6 186.36 10139.8 186.3 10173.7 186.14 10198.6 186.2 10256.4 186.17 + 10257.4 186.17 10302.3 186.08 10316.2 186.05 10341.9 185.95 10374.9 186.03 + 10392.7 186.0310419.47 186.08 +#Mann= 4 ,-1,0 + 0 .4 0 4601.4 .03 0 5370.8 .4 0 +10419.47 .4 0 +Bank Sta=4601.4,5370.8 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=98.67,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,3636 ,2790.9,2790.9,2790.9 +XS GIS Cut Line=3 +1446956.22137206735078.5560809011452537.82456487741642.261546746 +1452460.31165715743938.133106764 +Node Last Edited Time=Jan/14/2025 14:45:37 +#Sta/Elev= 256 + 0 166.58 29.4 166 44.6 165.51 61.1 165.11 100.9 164.05 + 137.4 162.99 157.2 162.72 178.9 162.37 213.6 161.93 245.4 161.46 + 269.9 160.92 296.7 159.58 326.3 157.97 353.3 155.79 382.6 151.96 + 414.5 147.27 438.9 144.27 461.3 141.47 495.3 136.35 532.4 131.78 + 551.6 128.27 569.3 125.76 608 120.86 650.2 115.83 664.3 114.11 + 677.2 112.61 720.6 108.65 768 104.59 777 104.04 785.2 104.14 + 833.3 108.15 885.8 114.08 889.6 114.58 893.2 114.94 946 116.97 + 973.4 115.38 1001.1 113.9 1002.3 113.72 1003.6 113.48 1058.7 103.44 + 1109.1 98.25 1115 98.04 1121.5 97.96 1171.3 98.251216.16498.18128 + 1217 98.18 1227.7 98.29 1239.3 98.54 1284 99.97 1325 100.26 + 1340.4 100.25 1357.1 100 1396.7 99.28 1433 98.93 1453 98.92 + 1509.4 99.1 1565.7 99.71 1592.7 100.14 1622 100.49 1648.9 101.03 + 1678.4 101.01 1710.6 100.5 1734.7 100.28 1756.9 100.31 1791.1 101.12 + 1828.4 101.68 1847.4 101.77 1864.8 101.68 1903.7 101.67 1946.2 101.57 + 1972.8 101.72 2016.4 102.49 2064 103.45 2072.8 103.67 2080.8 103.8 + 2129.1 103.54 2181.8 102.85 2185.4 102.82 2188.7 102.8 2241.8 102.93 + 2296.7 102.84 2354.4 102.45 2404.7 102.13 2417.5 102.07 2523.5 101.94 + 2579.8 101.68 2620.6 101.52 2636.1 101.47 2653.1 101.38 2692.5 100.68 + 2728.5 100.11 2748.8 99.87 2770.9 99.74 2805.2 100.1 2861.5 100.67 + 2888.8 101.04 2917.8 101.18 2974.2 101.28 3006.6 101.25 3052.4 101.25 +3141.041101.1426 3143.2 101.14 3160.4 101.13 3199.5 100.98 3242.2 100.85 + 3268.4 100.74 3312.2 100.52 3360 100.21 3368.5 100.19 3376.3 100.14 + 3424.9 99.81 3477.9 99.37 3537.6 99.13 3592.3 98.72 3595.7 98.71 + 3650.2 98.98 3700.2 99.16 3706.6 99.16 3713.5 99.13 3762.9 99 + 3808.2 98.98 3819.2 99.02 3875.6 99.14 3916.2 99.19 3988.3 99.43 + 4024.1 99.5 4044.6 99.59 4067 99.61 4132.1 99.2 4157.3 99.06 + 4184.8 99.08 4213.6 99.15 4240 99.24 4270 99.38 4302.6 99.47 + 4348 99.56 4382.6 99.57 4456 99.52 4495.3 99.47 4563.9 99.29 + 4608 99.23 4656.1 99.19 4671.9 99.22 4720.7 99.34 4773.9 99.41 + 4833.3 99.22 4889.7 99.55 4946 99.49 5002.4 99.59 5009.5 99.62 + 5058.7 99.7 5103.8 99.84 5127.3 99.84 5171.4 99.6 5211.7 99.44 + 5245.2 99.13 5319.7 98.68 5363 98.65 5480.8 98.8 5622.1 98.62 + 5678.4 98.45 5716.4 98.32 5734.8 98.31 5751.5 98.28 5791.1 98.26 + 5847.4 98.28 5903.8 98.5 5960.1 98.6 6016.4 98.84 6069.9 98.96 + 6129.1 98.99 6183.4 99.09 6241.8 99.03 6305.5 99.12 6354.5 99.13 + 6423.4 99.32 6467.2 99.38 6507.3 99.48 6541.2 99.52 6579.8 99.5 + 6636.2 99.43 6692.5 99.39 6723.2 99.35 6748.8 99.3 6776.8 99.31 + 6861.5 99.47 6917.9 99.5 6939.1 99.47 7012.5 99.43 7086.9 99.45 + 7130.3 99.4 7248.1 99.2 7263 99.22 7312.2 99.36 7365.9 99.38 + 7424.9 99.34 7479 99.38 7537.6 99.31 7586.9 99.3 7593.9 99.31 + 7601.6 99.33 7650.3 99.5 7706.6 99.66 7719.4 99.63 7762.9 99.4 + 7819.3 99.28 7837.2 99.27 7932 99.48 7955 99.51 7988.3 99.48 + 8044.6 99.49 8101 99.61 8234.7 99.78 8270 99.79 8342.7 99.89 + 8382.7 99.97 8439 100.11 8495.3 100.18 8544.1 100.31 8608 100.57 + 8664.4 100.75 8717.4 100.88 8779.8 101.01 8833.4 101.21 8897.6 101.41 + 8946 101.47 8990.5 101.57 9015.4 101.57 9058.7 101.64 9171.4 101.89 + 9206.4 101.99 9251 102.18 9368.9 102.55 9422.3 102.76 9486.7 103.14 + 9530.3 103.42 9604.5 103.83 9722.3 104.25 9746.2 104.4 9791.1 104.77 + 9840.1 105.39 9847.5 106.53 9903.8 116.07 9958 125.53 9960.1 126.23 + 9962.1 126.85 10016.5 145.73 10070.1 163.07 10072.8 164.02 10075.8 164.89 + 10129.2 170.45 10178.1 173.29 10185.5 173.68 10193.6 173.83 10286 173.65 +10314.37 173.61 +#Mann= 4 ,-1,0 + 0 .4 0 1217 .03 0 3143.2 .4 0 +10314.37 .4 0 +Bank Sta=1216.164,3141.041 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=98.46,1, 75 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +Type RM Length L Ch R = 1 ,845 ,,, +XS GIS Cut Line=2 + 1446377.9336879735570.1006124361449009.14265082 740659.03223304 +Node Last Edited Time=Jan/09/2025 15:13:45 +#Sta/Elev= 183 + 0 157.69 98.3 157.25 111.1 157.25 135.8 157.18 187.9 156.85 + 229.2 156.68 277.6 156.4 288.3 156.28 309.1 155.96 347.4 155.58 + 367.2 155.31 406.4 154.61 429.3 154.06 456.8 153.45 482.4 152.79 + 524.6 151.8 546.4 151.35 583.6 150.71 636 149.88 655.7 149.64 + 701.8 149.28 725.6 149.21 760.9 149.3 800.4 148.92 819.9 148.81 + 829 148.83 879 148.35 904.8 147.07 938.1 144.42 986 139.29 + 994.4 138.45 1002.3 137.55 1056.2 132.07 1084 130.36 1115.3 129.46 + 1171.5 129.58 1174.3 129.55 1233.4 126.92 1263.3 125.93 1292.5 124.53 + 1352.9 123.27 1357 123 1410.6 118.86 1442.5 117.7 1469.7 115.59 + 1522.3 113.77 1528.7 113.38 1532.1 113.25 1542.6 112.12 1587.8 107.59 + 1621.7 103.49 1646.9 102.94 1695.6 101.41 1705.9 101.37 1711.3 101.15 + 1728.1 101.04 1765 101.03 1800.9 100.28 1824.1 100.46 1890.5 101.03 + 1913.7 101.54 1942.2 102.37 1980.1 102.64 2001.3 102.46 2042.2 102.33 + 2069.7 102.27 2119.4 102.06 2159.3 101.83 2178.5 101.67 2215.5 101.46 + 2249 101.2 2338.6 100.73 2355.7 100.7 2388.8 100.54 2414.8 100.52 + 2473.8 100.65 2532.9 100.64 2562.1 100.67 2592 100.83 2607.4 100.95 + 2697 101.99 2710.1 102.12 2735.4 102.27 2769.2 102.2 2786.6 102.03 + 2828.2 101.39 2876.2 100.75 2887.3 100.66 2908.8 100.62 2946.4 100.68 + 2965.8 100.56 3005.4 100.19 3064.5 99.6 3123.6 99.09 3145 98.95 + 3182.6 98.8 3212.5 98.75 3234.7 98.7 3241.7 98.65 3255.4 98.52 + 3300.8 97.97 3324.3 97.82 3359.9 97.78 3428.7 97.74 3478 98.02 + 3503.5 98.54 3537.1 99.39 3583.6 100.76 3593.1 101.03 3596.1 101.11 + 3602 101.16 3655.2 100.88 3714.3 99.99 3769.1 99.9 3772.3 99.88 + 3832.4 99.03 3861.9 98.86 3891.5 98.74 3948.6 98.64 4009.6 98.27 + 4041.1 98.16 4068.7 98.02 4127.7 97.53 4130.8 97.52 4186.8 97.8 + 4245.9 98.24 4295.2 98.66 4304.9 98.9 4310 99.08 4325.7 100.46 + 4364 103.47 4399.6 107.23 4423.1 110.77 4468.5 118.6 4482.2 121.06 + 4489.2 122.17 4511.3 125.42 4541.2 129.76 4578.8 135.47 4600.3 138.43 + 4641.9 142.77 4659.4 145.53 4668.4 146.85 4696.8 154.15 4718.4 159.93 + 4758 169.18 4777.5 173.84 4815.2 181.27 4836.6 184.52 4847.6 185.59 + 4895.6 189.82 4937.2 193.41 4954.7 194.38 4988.5 196.46 5013.8 198.27 + 5026.8 199.02 5067.9 202.96 5072.8 203.4 5116.5 208.05 5131.9 209.9 + 5161.8 213.31 5191 216.4 5206.1 217.93 5250 223.27 5295.7 229.19 + 5309.1 231.32 5335.1 236.54 5368.2 243.48 5385.3 247.99 5427.2 252.55 + 5439 253.23 5474.9 255.88 5486.3 255.79 5508.4 255.47 5545.4 254.22 + 5564.5 253.63 5604.4 251.88 5624.6 250.85 5654.1 249.41 5663.5 248.94 + 5681.7 247.84 5722.6 244.935728.917 244.45 +#Mann= 4 ,-1,0 + 0 .4 0 2249 .03 0 4186.8 .4 0 +5728.917 .4 0 +Bank Sta=2249,4186.8 +XS Rating Curve= 0 ,0 +XS HTab Starting El and Incr=98.02,1, 100 +XS HTab Horizontal Distribution= 5 , 5 , 5 +Exp/Cntr(USF)=0,0 +Exp/Cntr=0.3,0.1 + +LCMann Time=Dec/30/1899 00:00:00 +LCMann Region Time=Dec/30/1899 00:00:00 +LCMann Table=0 +Chan Stop Cuts=-1 + + + +Use User Specified Reach Order=0 +GIS Ratio Cuts To Invert=-1 +GIS Limit At Bridges=0 +Composite Channel Slope=5 \ No newline at end of file diff --git a/tests/winooski/winooski.p01 b/tests/winooski/winooski.p01 new file mode 100644 index 0000000..d75a63f --- /dev/null +++ b/tests/winooski/winooski.p01 @@ -0,0 +1,216 @@ +Plan Title=winooski +Program Version=6.50 +Short Identifier=win +Simulation Date=,,, +Geom File=g01 +Flow File=f01 +Subcritical Flow +K Sum by GR= 0 +Std Step Tol= 0.01 +Critical Tol= 0.01 +Num of Std Step Trials= 20 +Max Error Tol= 0.3 +Flow Tol Ratio= 0.001 +Split Flow NTrial= 30 +Split Flow Tol= 0.02 +Split Flow Ratio= 0.02 +Log Output Level= 0 +Friction Slope Method= 1 +Unsteady Friction Slope Method= 2 +Unsteady Bridges Friction Slope Method= 1 +Parabolic Critical Depth +Global Vel Dist= 0 , 0 , 0 +Global Log Level= 0 +CheckData=True +Encroach Param=-1 ,0,0, 0 +Flow Ratio Target= +Flow Ratio Tolerance=0.1 +Flow Ratio Initial Ratio= +Flow Ratio Min Ratio=0.5 +Flow Ratio Max Ratio=4 +Flow Ratio Max Iterations= 10 +Flow Ratio Reference= +Computation Interval=1MIN +Output Interval=1HOUR +Instantaneous Interval=1HOUR +Mapping Interval=1HOUR +Computation Time Step Use Courant= 0 +Computation Time Step Use Time Series= 0 +Computation Time Step Max Courant= +Computation Time Step Min Courant= +Computation Time Step Count To Double=0 +Computation Time Step Max Doubling=0 +Computation Time Step Max Halving=0 +Computation Time Step Residence Courant=0 +Run HTab= 0 +Run UNet= 0 +Run Sediment= 0 +Run PostProcess= 0 +Run WQNet= 0 +Run RASMapper=-1 +UNET Theta= 1 +UNET Theta Warmup= 1 +UNET ZTol= 0.02 +UNET ZSATol= 0.02 +UNET QTol= +UNET MxIter= 20 +UNET Max Iter WO Improvement= 0 +UNET MaxInSteps= 0 +UNET DtIC= 0 +UNET DtMin= 0 +UNET MaxCRTS= 20 +UNET WFStab= 2 +UNET SFStab= 1 +UNET WFX= 1 +UNET SFX= 1 +UNET Gravity=32.17405 +UNET 1D Methodology=Finite Difference +UNET DSS MLevel= 4 +UNET Pardiso=0 +UNET DZMax Abort= 100 +UNET Use Existing IB Tables=-1 +UNET Froude Reduction=False +UNET Froude Limit= 0.8 +UNET Froude Power= 4 +UNET D1 Cores= 0 +UNET WindReference=Eulerian +UNET WindDragFormulation=Hsu (1988) +UNET D2 Coriolis=0 +UNET D2 Cores= 0 +UNET D2 Theta= 1 +UNET D2 Theta Warmup= 1 +UNET D2 Z Tol= 0.01 +UNET D2 Volume Tol= 0.01 +UNET D2 Max Iterations= 20 +UNET D2 Equation= 0 +UNET D2 TotalICTime= +UNET D2 RampUpFraction=0.1 +UNET D2 TimeSlices= 1 +UNET D2 Turbulence Formulation=None +UNET D2 Eddy Viscosity=0.3 +UNET D2 Transverse Eddy Viscosity=0.1 +UNET D2 Smagorinsky Mixing=0.05 +UNET D2 BCVolumeCheck=0 +UNET D2 Latitude= +UNET D2 Cores=0 +UNET D2 SolverType=PARDISO (Direct) +UNET D2 Minimum Iterations= 3 +UNET D2 Maximum Iterations= 30 +UNET D2 Restart Number= 10 +UNET D2 Relaxation Coeff=1.3 +UNET D2 SOR Precondition Iterations= 10 +UNET D2 ILUT Maximum Fill= 8 +UNET D2 ILUT Tolerance=1E-08 +UNET D2 Convergence Tolerance=0.00001 +PS Theta= 1 +PS WS Tol= 0.01 +PS Volume Tol= 0.01 +PS Max Iterations= 20 +PS Time Slices= 1 +PS Iterate With 2D=0 +PS Cores=0 +UNET D1D2 MaxIter= 0 +UNET D1D2 ZTol=0.01 +UNET D1D2 QTol=0.1 +UNET D1D2 MinQTol=1 +Write IC File= 0 +Write IC File at Fixed DateTime=0 +IC Time=,, +Write IC File Reoccurance= +Write IC File at Sim End=0 +Echo Input=False +Echo Parameters=False +Echo Output=False +Write Detailed= 0 +HDF Write Warmup=0 +HDF Write Time Slices=0 +HDF Flush=0 +HDF Compression= 1 +HDF Chunk Size= 1 +HDF Spatial Parts= 1 +HDF Use Max Rows=0 +HDF Fixed Rows= 1 +Calibration Method= 0 +Calibration Iterations= 20 +Calibration Max Change=0.05 +Calibration Tolerance=0.2 +Calibration Maximum=1.5 +Calibration Minimum=0.5 +Calibration Optimization Method= 1 +Calibration Window=,,, +WQ AD Non Conservative +WQ ULTIMATE=-1 +WQ Max Comp Step=1HOUR +WQ Output Interval=15MIN +WQ Output Selected Increments= 0 +WQ Create Restart=0 +WQ Fixed Restart=0 +WQ Restart Simtime= +WQ Restart Date= +WQ Restart Hour= +WQ System Summary=0 +WQ Write To DSS=0 +Sorting and Armoring Iterations= 10 +XS Update Threshold= 0.02 +Bed Roughness Predictor= 0 +Hydraulics Update Threshold= 0.02 +Energy Slope Method= 1 +Volume Change Method= 1 +Sediment Retention Method= 0 +Sediment TS Multiplier= 1 +Warm Up Method= 0 +Warm Up Duration= +Warm Up Duration - Concentration= +Warm Up Duration - Gradation= +Warm Up Duration - Bathymetry= +XS Weighting Method= 0 +Number of US Weighted Cross Sections= 1 +Number of DS Weighted Cross Sections= 1 +Upstream XS Weight=0 +Main XS Weight=1 +Downstream XS Weight=0 +Number of DS XS's Weighted with US Boundary= 1 +Upstream Boundary Weight= 1 +Weight of XSs Associated with US Boundary= 0 +Number of US XS's Weighted with DS Boundary= 1 +Downstream Boundary Weight= 0.5 +Weight of XSs Associated with DS Boundary= 0.5 +Percentile Method= 0 +Sediment Output Level= 3 +Mass or Volume Output= 0 +Output Increment Type= 1 +Profile and TS Output Increment= 1 +Transport Output Increment 1 +XS Output Flag= 0 +XS Output Increment= 10 +Read HDF5 Sediment Hotstart= 0 +Sediment Hotstart Type= 0 +Sediment Hotstart File= +Sediment Hotstart Date= +Sediment Hotstart Time= +Write Gradation File= 0 +Read Gradation Hotstart= 0 +Gradation File Name= +Write HDF5 File= 1 +Write Binary Output= 1 +Write DSS Sediment File= 0 +DSS Sediment Output Type= 1 +DSS Location= +Summary Reach= +SV Curve= 0 +Specific Gage Flag= 0 +Subcell Erosion Methods= 0 +Subcell Deposition Methods= 0 +Advection Scheme= 1 +Matrix Solver= 0 +Implicit Weighting Factor= 1 +Maximum Outer Loop Convergence Iterations= 5 +Convergence Maximum Absolute= 0.001 +Convergence RMSE= 0.0001 +Grain Fractions Max Abs Error= 0.001 +Max Subgrid Regions= 1 +Max Subgrid Length Scale= 3.402823E+38 +Initial Layer Thickness= 3 +Min Layer Thickness= 0.1 +Max Layer Thickness= 6 +Number of Layers= 5 diff --git a/uv.lock b/uv.lock index 5651e1b..7da437c 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,163 @@ version = 1 revision = 1 requires-python = ">=3.12" +[[package]] +name = "affine" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/98/d2f0bb06385069e799fc7d2870d9e078cfa0fa396dc8a2b81227d0da08b9/affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea", size = 17132 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/f7/85273299ab57117850cc0a936c64151171fac4da49bc6fba0dad984a7c5f/affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92", size = 15662 }, +] + +[[package]] +name = "aiodns" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycares" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/84/41a6a2765abc124563f5380e76b9b24118977729e25a84112f8dfb2b33dc/aiodns-3.2.0.tar.gz", hash = "sha256:62869b23409349c21b072883ec8998316b234c9a9e36675756e8e317e8768f72", size = 7823 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/14/13c65b1bd59f7e707e0cc0964fbab45c003f90292ed267d159eeeeaa2224/aiodns-3.2.0-py3-none-any.whl", hash = "sha256:e443c0c27b07da3174a109fd9e736d69058d808f144d3c9d56dbd1776964c5f5", size = 5735 }, +] + +[[package]] +name = "aiofiles" +version = "24.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, +] + +[[package]] +name = "aiohttp" +version = "3.11.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/d9/1c4721d143e14af753f2bf5e3b681883e1f24b592c0482df6fa6e33597fa/aiohttp-3.11.16.tar.gz", hash = "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", size = 7676826 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/38/100d01cbc60553743baf0fba658cb125f8ad674a8a771f765cdc155a890d/aiohttp-3.11.16-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", size = 704881 }, + { url = "https://files.pythonhosted.org/packages/21/ed/b4102bb6245e36591209e29f03fe87e7956e54cb604ee12e20f7eb47f994/aiohttp-3.11.16-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", size = 464564 }, + { url = "https://files.pythonhosted.org/packages/3b/e1/a9ab6c47b62ecee080eeb33acd5352b40ecad08fb2d0779bcc6739271745/aiohttp-3.11.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb", size = 456548 }, + { url = "https://files.pythonhosted.org/packages/80/ad/216c6f71bdff2becce6c8776f0aa32cb0fa5d83008d13b49c3208d2e4016/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", size = 1691749 }, + { url = "https://files.pythonhosted.org/packages/bd/ea/7df7bcd3f4e734301605f686ffc87993f2d51b7acb6bcc9b980af223f297/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", size = 1736874 }, + { url = "https://files.pythonhosted.org/packages/51/41/c7724b9c87a29b7cfd1202ec6446bae8524a751473d25e2ff438bc9a02bf/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", size = 1786885 }, + { url = "https://files.pythonhosted.org/packages/86/b3/f61f8492fa6569fa87927ad35a40c159408862f7e8e70deaaead349e2fba/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", size = 1698059 }, + { url = "https://files.pythonhosted.org/packages/ce/be/7097cf860a9ce8bbb0e8960704e12869e111abcd3fbd245153373079ccec/aiohttp-3.11.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", size = 1626527 }, + { url = "https://files.pythonhosted.org/packages/1d/1d/aaa841c340e8c143a8d53a1f644c2a2961c58cfa26e7b398d6bf75cf5d23/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", size = 1644036 }, + { url = "https://files.pythonhosted.org/packages/2c/88/59d870f76e9345e2b149f158074e78db457985c2b4da713038d9da3020a8/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", size = 1685270 }, + { url = "https://files.pythonhosted.org/packages/2b/b1/c6686948d4c79c3745595efc469a9f8a43cab3c7efc0b5991be65d9e8cb8/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", size = 1650852 }, + { url = "https://files.pythonhosted.org/packages/fe/94/3e42a6916fd3441721941e0f1b8438e1ce2a4c49af0e28e0d3c950c9b3c9/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", size = 1704481 }, + { url = "https://files.pythonhosted.org/packages/b1/6d/6ab5854ff59b27075c7a8c610597d2b6c38945f9a1284ee8758bc3720ff6/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", size = 1735370 }, + { url = "https://files.pythonhosted.org/packages/73/2a/08a68eec3c99a6659067d271d7553e4d490a0828d588e1daa3970dc2b771/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", size = 1697619 }, + { url = "https://files.pythonhosted.org/packages/61/d5/fea8dbbfb0cd68fbb56f0ae913270a79422d9a41da442a624febf72d2aaf/aiohttp-3.11.16-cp312-cp312-win32.whl", hash = "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", size = 411710 }, + { url = "https://files.pythonhosted.org/packages/33/fb/41cde15fbe51365024550bf77b95a4fc84ef41365705c946da0421f0e1e0/aiohttp-3.11.16-cp312-cp312-win_amd64.whl", hash = "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", size = 438012 }, + { url = "https://files.pythonhosted.org/packages/52/52/7c712b2d9fb4d5e5fd6d12f9ab76e52baddfee71e3c8203ca7a7559d7f51/aiohttp-3.11.16-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", size = 698005 }, + { url = "https://files.pythonhosted.org/packages/51/3e/61057814f7247666d43ac538abcd6335b022869ade2602dab9bf33f607d2/aiohttp-3.11.16-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", size = 461106 }, + { url = "https://files.pythonhosted.org/packages/4f/85/6b79fb0ea6e913d596d5b949edc2402b20803f51b1a59e1bbc5bb7ba7569/aiohttp-3.11.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", size = 453394 }, + { url = "https://files.pythonhosted.org/packages/4b/04/e1bb3fcfbd2c26753932c759593a32299aff8625eaa0bf8ff7d9c0c34a36/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", size = 1666643 }, + { url = "https://files.pythonhosted.org/packages/0e/27/97bc0fdd1f439b8f060beb3ba8fb47b908dc170280090801158381ad7942/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", size = 1721948 }, + { url = "https://files.pythonhosted.org/packages/2c/4f/bc4c5119e75c05ef15c5670ef1563bbe25d4ed4893b76c57b0184d815e8b/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", size = 1774454 }, + { url = "https://files.pythonhosted.org/packages/73/5b/54b42b2150bb26fdf795464aa55ceb1a49c85f84e98e6896d211eabc6670/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", size = 1677785 }, + { url = "https://files.pythonhosted.org/packages/10/ee/a0fe68916d3f82eae199b8535624cf07a9c0a0958c7a76e56dd21140487a/aiohttp-3.11.16-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", size = 1608456 }, + { url = "https://files.pythonhosted.org/packages/8b/48/83afd779242b7cf7e1ceed2ff624a86d3221e17798061cf9a79e0b246077/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", size = 1622424 }, + { url = "https://files.pythonhosted.org/packages/6f/27/452f1d5fca1f516f9f731539b7f5faa9e9d3bf8a3a6c3cd7c4b031f20cbd/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", size = 1660943 }, + { url = "https://files.pythonhosted.org/packages/d6/e1/5c7d63143b8d00c83b958b9e78e7048c4a69903c760c1e329bf02bac57a1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", size = 1622797 }, + { url = "https://files.pythonhosted.org/packages/46/9e/2ac29cca2746ee8e449e73cd2fcb3d454467393ec03a269d50e49af743f1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", size = 1687162 }, + { url = "https://files.pythonhosted.org/packages/ad/6b/eaa6768e02edebaf37d77f4ffb74dd55f5cbcbb6a0dbf798ccec7b0ac23b/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", size = 1718518 }, + { url = "https://files.pythonhosted.org/packages/e5/18/dda87cbad29472a51fa058d6d8257dfce168289adaeb358b86bd93af3b20/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", size = 1675254 }, + { url = "https://files.pythonhosted.org/packages/32/d9/d2fb08c614df401d92c12fcbc60e6e879608d5e8909ef75c5ad8d4ad8aa7/aiohttp-3.11.16-cp313-cp313-win32.whl", hash = "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", size = 410698 }, + { url = "https://files.pythonhosted.org/packages/ce/ed/853e36d5a33c24544cfa46585895547de152dfef0b5c79fa675f6e4b7b87/aiohttp-3.11.16-cp313-cp313-win_amd64.whl", hash = "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", size = 436395 }, +] + +[[package]] +name = "aiohttp-client-cache" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "attrs" }, + { name = "itsdangerous" }, + { name = "url-normalize" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/6b/2c09e4a0dd7d8f1b23ad0afac1ebdb200ed59445057f6caca3f653e7510a/aiohttp_client_cache-0.13.0.tar.gz", hash = "sha256:dc5cd62340adbee18e0fedc7b0c37542692df08f8ed9945d751b7292a0433853", size = 61883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/b5/f0a011dd20fad83c9aa1c75b3a640e2e4f05dbc9ee13e723c34fe25802f0/aiohttp_client_cache-0.13.0-py3-none-any.whl", hash = "sha256:89211544e9f290de42ef85f545cdae8eb34d1af6e51dcc8b2cf956dd539d2f39", size = 32932 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, +] + +[[package]] +name = "aiosqlite" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/7d/8bca2bf9a247c2c5dfeec1d7a5f40db6518f88d314b8bca9da29670d2671/aiosqlite-0.21.0.tar.gz", hash = "sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3", size = 13454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/10/6c25ed6de94c49f88a91fa5018cb4c0f3625f31d5be9f771ebe5cc7cd506/aiosqlite-0.21.0-py3-none-any.whl", hash = "sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0", size = 15792 }, +] + +[[package]] +name = "async-retriever" +version = "0.19.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiodns" }, + { name = "aiofiles" }, + { name = "aiohttp" }, + { name = "aiohttp-client-cache" }, + { name = "aiosqlite" }, + { name = "brotli" }, + { name = "cytoolz" }, + { name = "multidict" }, + { name = "orjson" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/25/7e1e31dbe75ea867ce844b769ada515fc50883e2d632a3e6bfe363902003/async_retriever-0.19.3.tar.gz", hash = "sha256:22da28f4861f4182240e2a598e93ac3d94af5c3692b566016ff228056267f15b", size = 35423 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/b5/d1a4dca5fe9ce5b083ee79ac272c6ffe8199f98910b702eecb310a5d060d/async_retriever-0.19.3-py3-none-any.whl", hash = "sha256:45498ca4a7db428f72ea384a26adc2d4de6d63642ca70b8aa9e02d315781fe5e", size = 18601 }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, +] + [[package]] name = "boto3" version = "1.37.28" @@ -30,6 +187,56 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ea/c3/29ffcb4c90492bcfcff1b7e5ddb5529846acc0e627569432db9842c47675/botocore-1.37.28-py3-none-any.whl", hash = "sha256:c26b645d7b125bf42ffc1671b862b47500ee658e3a1c95d2438cb689fc85df15", size = 13467675 }, ] +[[package]] +name = "brotli" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693 }, + { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489 }, + { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081 }, + { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244 }, + { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505 }, + { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152 }, + { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252 }, + { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955 }, + { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304 }, + { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452 }, + { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751 }, + { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757 }, + { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146 }, + { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055 }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102 }, + { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029 }, + { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276 }, + { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255 }, + { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681 }, + { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475 }, + { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173 }, + { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803 }, + { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946 }, + { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707 }, + { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231 }, + { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157 }, + { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122 }, + { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206 }, + { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804 }, + { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517 }, +] + +[[package]] +name = "cattrs" +version = "24.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/7b/da4aa2f95afb2f28010453d03d6eedf018f9e085bd001f039e15731aba89/cattrs-24.1.3.tar.gz", hash = "sha256:981a6ef05875b5bb0c7fb68885546186d306f10f0f6718fe9b96c226e68821ff", size = 426684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/ee/d68a3de23867a9156bab7e0a22fb9a0305067ee639032a22982cf7f725e7/cattrs-24.1.3-py3-none-any.whl", hash = "sha256:adf957dddd26840f27ffbd060a6c4dd3b2192c5b7c2c0525ef1bd8131d8a83f5", size = 66462 }, +] + [[package]] name = "certifi" version = "2025.1.31" @@ -39,24 +246,445 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "cftime" +version = "1.6.4.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/c8/1155d1d58003105307c7e5985f422ae5bcb2ca0cbc553cc828f3c5a934a7/cftime-1.6.4.post1.tar.gz", hash = "sha256:50ac76cc9f10ab7bd46e44a71c51a6927051b499b4407df4f29ab13d741b942f", size = 54631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/81/0bb28d54088a61592f61a11e7fcabcea6d261c47af79e18d0f9cbcd940ae/cftime-1.6.4.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a590f73506f4704ba5e154ef55bfbaed5e1b4ac170f3caeb8c58e4f2c619ee4e", size = 226615 }, + { url = "https://files.pythonhosted.org/packages/f3/1e/38dbbf8a828dfb5e0e6e5c912818b77aacf2e7bcb97b262ac6126beeb29f/cftime-1.6.4.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:933cb10e1af4e362e77f513e3eb92b34a688729ddbf938bbdfa5ac20a7f44ba0", size = 209193 }, + { url = "https://files.pythonhosted.org/packages/9b/60/0db884c76311ecaaf31f628aa9358beae5fcb0fbbdc2eb0b790a93aa258f/cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf17a1b36f62e9e73c4c9363dd811e1bbf1170f5ac26d343fb26012ccf482908", size = 1320215 }, + { url = "https://files.pythonhosted.org/packages/8d/7d/2d5fc7af06da4f3bdea59a204f741bf7a30bc5019355991b2f083e557e4e/cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e18021f421aa26527bad8688c1acf0c85fa72730beb6efce969c316743294f2", size = 1367426 }, + { url = "https://files.pythonhosted.org/packages/5d/ab/e8b26d05323fc5629356c82a7f64026248f121ea1361b49df441bbc8f2d7/cftime-1.6.4.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5835b9d622f9304d1c23a35603a0f068739f428d902860f25e6e7e5a1b7cd8ea", size = 1385593 }, + { url = "https://files.pythonhosted.org/packages/af/7b/ca72a075a3f660315b031d62d39a3e9cfef71f7929da2621d5120077a75f/cftime-1.6.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:7f50bf0d1b664924aaee636eb2933746b942417d1f8b82ab6c1f6e8ba0da6885", size = 178918 }, + { url = "https://files.pythonhosted.org/packages/da/d8/81f086dbdc6f5a4e0bb068263471f1d12861b72562fe8c18df38268e4e29/cftime-1.6.4.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5c89766ebf088c097832ea618c24ed5075331f0b7bf8e9c2d4144aefbf2f1850", size = 223418 }, + { url = "https://files.pythonhosted.org/packages/4a/cc/60a825d92a4023655e330470758280a31e7b82665ef77d0e2a0fe71ea958/cftime-1.6.4.post1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f27113f7ccd1ca32881fdcb9a4bec806a5f54ae621fc1c374f1171f3ed98ef2", size = 207395 }, + { url = "https://files.pythonhosted.org/packages/ca/90/f5b26949899decce262fc76a1e64915b92050473114e0160cd6f7297f854/cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da367b23eea7cf4df071c88e014a1600d6c5bbf22e3393a4af409903fa397e28", size = 1318113 }, + { url = "https://files.pythonhosted.org/packages/c3/f8/6f13d37abb7ade46e65a08acc31af776a96dde0eb569e05d4c4b01422ba6/cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6579c5c83cdf09d73aa94c7bc34925edd93c5f2c7dd28e074f568f7e376271a0", size = 1366034 }, + { url = "https://files.pythonhosted.org/packages/fa/08/335cb17f3b708f9a24f96ca4abb00889c7aa20b0ae273313e7c11faf1f97/cftime-1.6.4.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b731c7133d17b479ca0c3c46a7a04f96197f0a4d753f4c2284c3ff0447279b4", size = 1390156 }, + { url = "https://files.pythonhosted.org/packages/f3/2d/980323fb5ec1ef369604b61ba259a41d0336cc1a85b639ed7bd210bd1290/cftime-1.6.4.post1-cp313-cp313-win_amd64.whl", hash = "sha256:d2a8c223faea7f1248ab469cc0d7795dd46f2a423789038f439fee7190bae259", size = 178496 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "click-plugins" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/1d/45434f64ed749540af821fd7e42b8e4d23ac04b1eda7c26613288d6cd8a8/click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", size = 8164 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/da/824b92d9942f4e472702488857914bdd50f73021efea15b4cad9aca8ecef/click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8", size = 7497 }, +] + +[[package]] +name = "cligj" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/0d/837dbd5d8430fd0f01ed72c4cfb2f548180f4c68c635df84ce87956cff32/cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", size = 9803 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/86/43fa9f15c5b9fb6e82620428827cd3c284aa933431405d1bcf5231ae3d3e/cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df", size = 7069 }, +] + +[[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 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, +] + +[[package]] +name = "coverage" +version = "7.15.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/c3/4f2195f512fb172aa425a8803a874b2baa9ba7f80ff7b6080998761fc701/coverage-7.15.4.tar.gz", hash = "sha256:0548198fff07ccf4faf469520bce1c2eceb1ce3e62891921138dec10907f9d00", size = 936952 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/48/bc8d4ba7b37551a767bd863f15b3f80182b271c2f55975356f5f7dbe94c2/coverage-7.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4fedd1f7f428f9fe83b1ead5e7cc87a43427be31aadafbac3ac0636dc7abb22", size = 222543 }, + { url = "https://files.pythonhosted.org/packages/20/dd/88d6f83f1fffc974a3691a34a97951c5b12df7512a6782c5963883cbc058/coverage-7.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37e2f0cdf58e2e1fed4e4d5a8f8786ae2f7eb80b478016876667dc4a01d60a97", size = 222905 }, + { url = "https://files.pythonhosted.org/packages/bd/5c/54ee0d4748585bb0acab9891cd8d92f2d3593165b4e59fc9de113bfb3140/coverage-7.15.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fb55d0e70bb15f2e81477613627286581414693d74ac7963c93a790dd453ca9d", size = 254407 }, + { url = "https://files.pythonhosted.org/packages/8c/3f/f0642a372f494bd0d7dad3b497083b910194a5f1c88be2c94fef707c3b59/coverage-7.15.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:899b9da30f3c6c336566e3707495bb23e8302d39d862f01fa78c48b99b9437e2", size = 257145 }, + { url = "https://files.pythonhosted.org/packages/71/17/8b46d0ed68251016002ec972c8fc0119961a765d0984cafb8bf317c43758/coverage-7.15.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d15715e8c46552827e5e4f30a35575a2dbcad14454cf3284c54483946bd16931", size = 258257 }, + { url = "https://files.pythonhosted.org/packages/30/b8/8498a0e72d0adbe15477dd07463d2b3bb2c9f6a4815e8589e50939e2c3ae/coverage-7.15.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:002a438859f7b430bc99afeaf01a6d187dad1d0dc907b64cdeffc632a5db8fd8", size = 260517 }, + { url = "https://files.pythonhosted.org/packages/41/e1/7dce19c3bdb1e3dd63e769508216500edad81bd5f69a26d724e32aceaf78/coverage-7.15.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4193a04b518f7968f3099755f5509ee7cccc6dc2b92a6b14841934d22e222c9", size = 254785 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/e1494703c675a2561723cd9b89f45c9168782c31280c611b1f767851e57c/coverage-7.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e98dcc55d572b38e69d117da7e8e8efb8500f1f5eaf81ecd460a63220790b839", size = 256176 }, + { url = "https://files.pythonhosted.org/packages/73/76/a5629d270fb638a43a4b10466f51e2f49d532c1aa4da2913cbbb150bbe0a/coverage-7.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:af6c538498ce66c10d3fd541c2a8d5b03da5850355add34e6cba564210cb9e72", size = 254321 }, + { url = "https://files.pythonhosted.org/packages/ff/4f/9c44447218435d5766b911534f9d798144a5560f85e9a54ebe5f3f5d19f9/coverage-7.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d10025d96ea89fc2f73714dbc4cbd433fe012c1ac9e23f895d7728b238b6e52", size = 258390 }, + { url = "https://files.pythonhosted.org/packages/de/36/c1e127616fb3fa18a9ff71e76c417f2fd7424332a4870015ac224ef4c039/coverage-7.15.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d802e1947603162ded419bff83ac7489820355d2b856dfb09206574e3a37ac0c", size = 253894 }, + { url = "https://files.pythonhosted.org/packages/e9/b9/fdb92c8ae7a8bb9b850cc253b7b3b9c8526f68130002048b5671cd510d09/coverage-7.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c2de40895718f91951b86712b4c5b694acaf9a0a49be13874896f599a1eed3f4", size = 255763 }, + { url = "https://files.pythonhosted.org/packages/6f/c0/a7d51b2587c7bdb76e71b0896d2565bf7d60436b5122fc83e511adb1f7cd/coverage-7.15.4-cp312-cp312-win32.whl", hash = "sha256:5c3431b2161279b7db5c2a1aa58ae02e5cb8c3c42d93a5094be3f5537bd5b11b", size = 224597 }, + { url = "https://files.pythonhosted.org/packages/49/b9/5c5f80cc55f5acaaca6dee677626bfcec8c87204a7809b438b08e84f4571/coverage-7.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:6befeab5fb2b51c958ca4ac6c5d141a1e8240f4f76e46350f1911963deda49cd", size = 225135 }, + { url = "https://files.pythonhosted.org/packages/47/e4/2a4561f89ff6bf7c925c287d0f2cce8bdf139c3a33735c87e3203401cf94/coverage-7.15.4-cp312-cp312-win_arm64.whl", hash = "sha256:67bc345491ab55b837277d76f5775d057e8c7f1ac44d890d8c2c82adde258c6f", size = 224515 }, + { url = "https://files.pythonhosted.org/packages/f1/84/651a9310859673aaa3b3203f1aa1641ca60fcf2494683e1c9474c7172780/coverage-7.15.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c705b28feb2775dc82a25f1d473a370bc37ff93f5177f4e29ce2425f560f6921", size = 222565 }, + { url = "https://files.pythonhosted.org/packages/82/f9/4dcf700137e8af550670f4d74d1b63828ce93e1e2b05e5f10710eb2ea987/coverage-7.15.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ff205ab5e3ecc670f6a4dd19d9cbf12ede53dd41cfc1e15716ec961ea6d314e", size = 222936 }, + { url = "https://files.pythonhosted.org/packages/07/4a/612ff1e780b3fbfd637486f542f84adc5503873d8b5d279dec1ffeef9414/coverage-7.15.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5172326e861a38b48b48befca15e0f477a26b283337a33a739c8fed229934e36", size = 253926 }, + { url = "https://files.pythonhosted.org/packages/b0/04/d1cff1c2ead4708a6a79c01d3736b6a25bd38a36678398f72a8dd33dfad9/coverage-7.15.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:12b59c90084e3234fb11184886bf4a40f4f16a8c8f867be2e087b81f8e8868d4", size = 256523 }, + { url = "https://files.pythonhosted.org/packages/b9/80/d34e13fb4b293cbdb9665838cf5522077b8ad14ef947550631a4bced36a5/coverage-7.15.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349062d66f00b40fa2c1c222438bad25fabf755631b5d82937fe985c8008615c", size = 257759 }, + { url = "https://files.pythonhosted.org/packages/0f/e7/2c5fe7636fdb0732fe0f09f308a5b066864078b7fc61f6678e8478554f2e/coverage-7.15.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4256ced708e598e05209bc1a8ab4074e04a51dba4c62fb45926a229af675ace7", size = 259890 }, + { url = "https://files.pythonhosted.org/packages/92/28/9689f0858dfff59c2ea688938ab9fa2925631235df67126a42b6c5c70ae1/coverage-7.15.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d80f974b20782d9612c8b4c9beeca867074c7cf4079d1419843fa25a26428b25", size = 254121 }, + { url = "https://files.pythonhosted.org/packages/f9/e2/785077c230c157243eb5aa9a26c3be260ecd02001bead54a3cada3df8e03/coverage-7.15.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e179f19bfe1d31f8eeeaa12990194d761c4f62f0759661000bca6cd8729f40b", size = 255891 }, + { url = "https://files.pythonhosted.org/packages/d4/90/e20371b17b40f912f21305c2db2f30efa3de306f7320fc916804872c85a4/coverage-7.15.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8bc16bb47b7679670eceff71d78bfb7d6e5b143f6c2cd117487ec7c75e0d4b78", size = 253859 }, + { url = "https://files.pythonhosted.org/packages/05/49/25371987ee459a5f67c0427fb75c74f9358e65f2c71fe75bf41c1b6c5fcb/coverage-7.15.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd685005cd2c4200adfc14cf39a603b9320efab3f18a8f7f156d20c9cc3345f", size = 258011 }, + { url = "https://files.pythonhosted.org/packages/30/6e/32e67467f6154bf4f1c4f63b05acc5097cba4237d45bbeeea446b52e8ac1/coverage-7.15.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:337399ad2c93b3acd2a937627dae8b3e86b66707cd3d3e856347999aadf1ef8d", size = 253676 }, + { url = "https://files.pythonhosted.org/packages/03/c1/8b24192e89286399765155251f99ee9f070a9d637109018ac23d99b99f6f/coverage-7.15.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:96e257121228ec5cd2bb919276e94ac11074471bc37d68dbae0e8308cce15fff", size = 255453 }, + { url = "https://files.pythonhosted.org/packages/16/6f/8b41ebdf67c87854e17c035336a90f1cfbad0c14c2a584301be6ff148718/coverage-7.15.4-cp313-cp313-win32.whl", hash = "sha256:c65a9e0dfc6143491879da4e13b5e30f8be192055de508d737fb14601edbd22c", size = 224605 }, + { url = "https://files.pythonhosted.org/packages/e0/e2/2946c7f0b42b152ecb21ff1bdad72e3d301e790c0c487e4a86e8c9f69347/coverage-7.15.4-cp313-cp313-win_amd64.whl", hash = "sha256:2ff8f5e9b8f7a94f0c11c45631eee103dbcb7d63274edd12c56efe1be690b3b4", size = 225148 }, + { url = "https://files.pythonhosted.org/packages/9e/83/3f4a69957f48ae7a0aba76c34743f88963d607b19e03f3f8e66f91cae0f9/coverage-7.15.4-cp313-cp313-win_arm64.whl", hash = "sha256:6e0a8a5083b096487d6cfced94cdd514d8f5db6f113610fb36c0620edb1028cf", size = 224536 }, + { url = "https://files.pythonhosted.org/packages/ea/ac/748cf29eeb2d6be34a3176ce26a4f49e38085ee08e8935f05f6f26ed7e0f/coverage-7.15.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:770e9325ab5ea6d56f77e59b29ecfe0ac20b57a82a601876f90494a4dda0386f", size = 222608 }, + { url = "https://files.pythonhosted.org/packages/0b/02/1abbf5c984677b0aa439cdacaccbf38d248939d8ef8fe1cc7a50d73edb77/coverage-7.15.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d12b33a3a50a1676b7784dc8d00a0c6d66a9f2add4b85a041c19b6a7e53ef23c", size = 222940 }, + { url = "https://files.pythonhosted.org/packages/eb/e1/ff8f9f53d9fcf586125b55d0b1f04ec1c14955fee41e83d5814bee141bb5/coverage-7.15.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5669c8378ebde86f5def7a25d29586631b58acc27ffde04399f678f3dfc6e082", size = 253985 }, + { url = "https://files.pythonhosted.org/packages/a1/26/595759762e514e81be1d7d01ed03444303bcd152226a6529998d253f9201/coverage-7.15.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff97a14362eef486483ed44042ca2027ea257df6ff768e62358ee0c9776925ac", size = 256492 }, + { url = "https://files.pythonhosted.org/packages/24/68/b79aabac54d482be23b5fcdd4f4662bff24a78edc4ee29201726929936d5/coverage-7.15.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a325e815318638aed1655d9c06e6d7c2d3d46c09231ce988070428a8762d734", size = 257837 }, + { url = "https://files.pythonhosted.org/packages/09/0f/bf7f297885a5bf6fd71e5782404e0ff059ca09e8711ceb3a08544abde45a/coverage-7.15.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:474223409d88eb20d2d6a0d37ea60e8647a65a90cc008dc1f0410af5f64f1e0d", size = 260152 }, + { url = "https://files.pythonhosted.org/packages/fd/f1/296744e854ff8368542343457414380465e9ceefb9192342feb9d3bc461d/coverage-7.15.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f2f62ae3cd189dd2e13aece758c57b3eecbd27be070dbd4cbd10936049e5dbf", size = 253978 }, + { url = "https://files.pythonhosted.org/packages/55/b0/bbdb2e9057493e66220a2e149ca2d301ba0e3a58a83bd6b90de9826d16f3/coverage-7.15.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39ece820e29e0a2ba34b3ecb3be83c27e997eed8926f2ba6fe7ce7a0bda5843b", size = 255846 }, + { url = "https://files.pythonhosted.org/packages/96/e4/38015b2b6d21258713bd17e76b59d033b191efb5703589cffd037dfbca20/coverage-7.15.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f21b56dcace11dfe013014201f577dcd592b2a9b72182d930361b47cf6f73f25", size = 253808 }, + { url = "https://files.pythonhosted.org/packages/0b/64/0d515c1e60ee6fbfd1a0e79c07cd87d388a233b7adc37758735677203808/coverage-7.15.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:93a3a0b662abcc10c73a47cbc72cd60f63618d6989fb2d1286e50eacd974f303", size = 258081 }, + { url = "https://files.pythonhosted.org/packages/91/71/04d9e7a3642146c6351338aef4ef85ab11dbbb54744c13245caba1aad1c0/coverage-7.15.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:141fae2cabf5569b782c10afc4c850ce10f618c13f8db54765cba99cc839da1f", size = 253624 }, + { url = "https://files.pythonhosted.org/packages/b4/a7/6c28b74c81ebff66987b0e2522ba5cffa3e90b0c33cb6a2eb264d4ee8cf1/coverage-7.15.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:81294c7e6ab30c5f74c0353b11b2fd6320e72d9bee6ac73b357caa8b916323a5", size = 255280 }, + { url = "https://files.pythonhosted.org/packages/52/af/bc19996a7014b98d7bbb0f0939453c67074af65784a3aa16a789a07381fa/coverage-7.15.4-cp314-cp314-win32.whl", hash = "sha256:7bbd7d6418e0dab31a206af5203bd43ae36edb8e7fba1940b055d3e9249290d7", size = 224768 }, + { url = "https://files.pythonhosted.org/packages/ee/90/219484e476d6e101ba0a444852579e05f5b75c37c611a42ed1190f73ef62/coverage-7.15.4-cp314-cp314-win_amd64.whl", hash = "sha256:f0204ed122758782970526057093f448051a39db9d810d4e344bb87a3546f425", size = 225259 }, + { url = "https://files.pythonhosted.org/packages/b7/66/fa77daf4e383e5f776dac62c2409b6af81910ae6fe326bd5170dba74cc63/coverage-7.15.4-cp314-cp314-win_arm64.whl", hash = "sha256:9e71e7bc71c686a123347ae47a0de33a175e797a85bb57b791492adf4eec8ed8", size = 224684 }, + { url = "https://files.pythonhosted.org/packages/58/5b/f03bf0ce362bbf3f785fa5219620d00778d4ac6fc9e407734828e9c672f6/coverage-7.15.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7c922735321eef3f87c280a3d39afff6b646723a2880b862cda4ac7a093b8aa8", size = 223338 }, + { url = "https://files.pythonhosted.org/packages/0f/76/e77d0ae22501831cc9f92193e8a957a5caa1dd177f90a6d1d9b106242d92/coverage-7.15.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f41c17c4668a655ce96d090d8d5ffdc24ef64b5a02f9753884d08483e8a4a41a", size = 223609 }, + { url = "https://files.pythonhosted.org/packages/82/1a/b1f089da8d38ac612fa2dd6dc7f4a1a7657d12f3e261d2996edd3a838d0b/coverage-7.15.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46822e9b6ff1c6a72b518c162c44a8f45a61a1d609c51084bf5b16c023c5037b", size = 264970 }, + { url = "https://files.pythonhosted.org/packages/bf/31/e66d98d6e9c7fcc88470f1e234eaf6b1950dc0dfbf797f7282c1c861da24/coverage-7.15.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d6f4955b73b5445271379a59e3792b0d978f42d4a01e0cf7a67d9c33a3bb0a5", size = 267088 }, + { url = "https://files.pythonhosted.org/packages/59/a1/ae94eb2c541add426378408379f233591e069040b1e2cdb33df9498a0682/coverage-7.15.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3fc9e047706fb4a9abb54f719d3aa643e80e5bb3818182c40aee01ac0f0247ba", size = 269508 }, + { url = "https://files.pythonhosted.org/packages/9c/c7/88a10694a1c6a213569766aba9f25847b28155d4ac731b13226db216356d/coverage-7.15.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05e491d4f3165d62d4f5c8fd48dfeabf2ae8f42cbbd484319af33ea851b78982", size = 270629 }, + { url = "https://files.pythonhosted.org/packages/b3/34/d8b8232e5e55169933b59aabcef2fedfa4b9d8897361bb80fcbda146505f/coverage-7.15.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:226c66e80ec0598d3b9b4874123df167ccca342aca8714f77cac6829688ee09c", size = 264043 }, + { url = "https://files.pythonhosted.org/packages/7e/35/58b009dbf8c471c7224716478b9fed4a7e1af15320e1ed41660978504663/coverage-7.15.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac41cc14bebda0dbfb0628036b7f75706935c95bcc07fefe9a0f93614aa60a57", size = 266963 }, + { url = "https://files.pythonhosted.org/packages/62/aa/57fbda1b42c892968273c56b6ee9dc0f1310850859230a507bc7873b1f65/coverage-7.15.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8af623e5cd92080acddd02b38f2f406a2c3a0893c38950b211890361448fbf26", size = 264569 }, + { url = "https://files.pythonhosted.org/packages/98/8a/360e6e7f24d477b7e889703af0afa878d15b6d4d8d2a822b2835c169a879/coverage-7.15.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07545711d4f0f32852a18f18ad11f76f0109909d09e78b9008b4cfc67e829429", size = 268299 }, + { url = "https://files.pythonhosted.org/packages/4e/89/6f701261aee21b6b5fa8f7872229406dc917e125069448292223bf213606/coverage-7.15.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a0865421cfdc53654b342d515e5a233187590882d20b95752150e53f65460017", size = 263413 }, + { url = "https://files.pythonhosted.org/packages/3f/0f/6f04036edc260ed425af83e834f627fad48941ce97b50bfe6edd8b6fa623/coverage-7.15.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:460115e32ee40566476db5048f9bec1e842c127ad8e6f8be745aad3ac9cbc839", size = 265725 }, + { url = "https://files.pythonhosted.org/packages/c4/ce/d19b5d4d5c49a7bfb925fd74310fee7d28bc99520ac3367ccbc54e662518/coverage-7.15.4-cp314-cp314t-win32.whl", hash = "sha256:cbde877ef9dd7baf272b9bfef2b8a25edd45d9170fc326951dd20eb480335e85", size = 225079 }, + { url = "https://files.pythonhosted.org/packages/26/bb/7aa1b3b173faee0679037ca950bbbe1247273656697994d8d13f80f8d4b4/coverage-7.15.4-cp314-cp314t-win_amd64.whl", hash = "sha256:3da9e92d1c551fd7563833e9ade686efb0c4b7363ab7681a94283958c950bf5e", size = 225911 }, + { url = "https://files.pythonhosted.org/packages/81/1c/4ea9e47426d80038d9222db3c4534cb6021a74b237d3ff97ffd33b6600dd/coverage-7.15.4-cp314-cp314t-win_arm64.whl", hash = "sha256:3a54f5a0d85050c73a38f6793090ee83974531e67fe5e57a1da9bee11398aa5e", size = 225219 }, + { url = "https://files.pythonhosted.org/packages/2b/c4/dc5d2ac8f9142e7ec7de66e7bf0591db29d78955a040bd915870d9c0e657/coverage-7.15.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:2c9872e4d9dc5d3cf616bf4b382f5a00359305a5be666a3dd0b5cdb4e49597f9", size = 222604 }, + { url = "https://files.pythonhosted.org/packages/70/39/33e63df81fe2ee100897451841c821467635923e58e37c6bd4b46dd8106c/coverage-7.15.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:e101dbb4b9b72f0cddd8cdc8c9c5b47f456766f5e0ac82dbfb75e5c55409b78a", size = 222944 }, + { url = "https://files.pythonhosted.org/packages/99/1f/ef3ffb5557febc75a0d97aa459d0266d7d741110265121cc6d8539343d44/coverage-7.15.4-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7d1abebdb047729e852b9c77a00497dfbeb11eb3a117e037d7dbc3ac8e5f5c54", size = 254050 }, + { url = "https://files.pythonhosted.org/packages/6f/f5/1f0f6f77698c3601ca0ae7431e34b24c62ca2f06fecb23b73ed1f651d2be/coverage-7.15.4-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d28a4a899354d0ea6214cc59b4fa19eefbce1b9ff1688ab579acf49e894bd3fb", size = 256967 }, + { url = "https://files.pythonhosted.org/packages/03/7a/2ed9bed79925f4367c83c77f66a89e5ca7229c288d2d19ad5f36d1ca0070/coverage-7.15.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffb3c2aacea411cc7e1d27712490c11108e2de1d39019ae32915493a59a8b9ed", size = 258587 }, + { url = "https://files.pythonhosted.org/packages/45/8c/fa34044f71b7cc4ecb6da9c2408770959b0591fa9b5fb6fb6bca38f94298/coverage-7.15.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9447978a92f405d301123cfd39ff49895490efb769a758fe2734c7f631bf8ce", size = 260785 }, + { url = "https://files.pythonhosted.org/packages/4f/54/d5727ce36b4524a7394ab9f5f1df378e1f23affcdab01037dc8655185cc7/coverage-7.15.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:050467a7983b8e2fe7dd41a78bb30c3e7f8c0b8cafda14b1c46f8b5e3cf2dd3c", size = 254545 }, + { url = "https://files.pythonhosted.org/packages/dc/e6/6e3783e576719590194bdffb6dd6d85490801785b7c331e35a245d8cb8b5/coverage-7.15.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d003b7a5708ddad5c206c79607a6b92abb6fc13c57d99d8a4468cc03a2941ced", size = 256682 }, + { url = "https://files.pythonhosted.org/packages/dc/f2/bacdbde18b69ed2de424fcf64d9fb0a4913753d4f0eca8bae9daad69f4bd/coverage-7.15.4-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c38efe30fd74e5c19e9433f11fb1f5dc9c6522770971b7c6145bbaa413dc8800", size = 254560 }, + { url = "https://files.pythonhosted.org/packages/6c/a3/1fb927196e3477c1b48831169ab58ba08f451ba87ae311ff1de68b26a616/coverage-7.15.4-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:1f4f826d70f772ab8b0c052329580d7fe8b8abd191e4ce0c8f81aec6614665d3", size = 258792 }, + { url = "https://files.pythonhosted.org/packages/41/58/30d4c149c69053de0edfe325614c1d28d508f62b1783e0e4a234d2e49136/coverage-7.15.4-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4a4bf917c9953f57c957be31c1cd504e3bd2f34d4a352b9d391a3025336f6768", size = 253968 }, + { url = "https://files.pythonhosted.org/packages/89/e4/77f639371b918aad30dda4051f95404b43578f7f2e2f87ba73e02ed1ff37/coverage-7.15.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:1c9bf40ebef178a45192c75c4964760bb261b0e6ad725da5fc4c93f674f19753", size = 255893 }, + { url = "https://files.pythonhosted.org/packages/5c/62/13be29b3ddab35f14c87967a4820a05106d2a3eccb4fa4ff550bf30b75e0/coverage-7.15.4-cp315-cp315-win32.whl", hash = "sha256:43619d04c3671792d2c4706ae8bf45e265dc87bbd4078189ef8b847ea1e74be2", size = 224768 }, + { url = "https://files.pythonhosted.org/packages/a1/70/af0c6be0f964af6954f6b74bc109b0dbca02824696d2520fb17fe1ab06e3/coverage-7.15.4-cp315-cp315-win_amd64.whl", hash = "sha256:be619439dbcd31a2eab10b32de9fff62c26ed4bab69dc32b8363fdaaa0882809", size = 225242 }, + { url = "https://files.pythonhosted.org/packages/4f/2d/f3bd3aab899fc9efc18b53133ee68f5f98574ef480649b23e12962226387/coverage-7.15.4-cp315-cp315-win_arm64.whl", hash = "sha256:def597967dafc2e8d97c9097ea453c464e0bb8ed38f193a43070f10dc623bb6d", size = 224674 }, + { url = "https://files.pythonhosted.org/packages/f5/ca/f69251cd63eabc6438321aea22148754cce758a26bde07dd490e3fe7cfc5/coverage-7.15.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c7dbc748ac8a1e3e59a2b28bea47675e6e778081dbbf081bde0d75def2fcbe1d", size = 223333 }, + { url = "https://files.pythonhosted.org/packages/a7/a7/037b53b2885b0d8447064432491a4d5a1014cd9f97a594d53acd0c04541a/coverage-7.15.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:2413074a5ecbb61a01a7888fc72db0ca324d13588c5b38bc0dd8564cdcdfea26", size = 223630 }, + { url = "https://files.pythonhosted.org/packages/80/4f/152b8a4779ae90da11bb24f7467df8a59f0be48a5c52acb856325ca48289/coverage-7.15.4-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4e6f6f632b7b2f714bf7a1346e8f97b650ee71f3c298aaad42a2ab60f0f07645", size = 264489 }, + { url = "https://files.pythonhosted.org/packages/10/2d/84b4b9e0e1dd6528a51920ff7031f35b789382e467a28ec6a5a578cb8812/coverage-7.15.4-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8df457da2249d3c75ca2e5e835d59c725abfe92d27fdff6cd99eed85b51d5e9a", size = 267567 }, + { url = "https://files.pythonhosted.org/packages/53/fc/ba01cc25299f9f8a2c8b02d3b28c53f3543d9fbfbe4e74fa2760b48f163e/coverage-7.15.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:050f66a08805acb5b8a23c6d4a517b1ecf82c08e81ed0e4bd727df065e5c6624", size = 270123 }, + { url = "https://files.pythonhosted.org/packages/cf/d0/db2647cbf40b14f8c308f94ff7bf89c06d564e59f396906edf50086ec788/coverage-7.15.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1587fb771d1ccceef708fdde1e5af8c7ed24b486b61d13a321acb7d8145390aa", size = 271107 }, + { url = "https://files.pythonhosted.org/packages/70/ff/4d2d17924552c458bb4f77dd631f0e3bc92fbbdf2d2d916cd4b33bbfd5b1/coverage-7.15.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8b4f1c3a69ca580f3fbd6b2046915f536d7f586874f25c1bb23add2a3c88d50f", size = 264955 }, + { url = "https://files.pythonhosted.org/packages/ee/de/dc010c7a3691f396d93bbc26bfcafa1c2a3a351cd520470f15faf5795bd5/coverage-7.15.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:ffb58d7eff5b7f6ecc6fa21d6288ab7f968a212cb67d682c269c09b9eba3b66f", size = 267949 }, + { url = "https://files.pythonhosted.org/packages/78/ea/dc96a11375e83c045c2f7c61fb6918277cfe9401db7c0f7b1d111a84b2e5/coverage-7.15.4-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:d9df165544774574ee004b953023d1bebada1894a80b1052a43d798b0f676e67", size = 264421 }, + { url = "https://files.pythonhosted.org/packages/c8/86/b77131a0f9503ce461cd577076147d7a9040f0c5dda772686f729e2cc9cb/coverage-7.15.4-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:f9de0a24a4079b53e523b5c5e2c5945ec251ab486652659955187cf255a259bc", size = 269121 }, + { url = "https://files.pythonhosted.org/packages/24/24/944bc35007862955e7ebf05754e645419dcf5d7526c52735cfa2715e8ebf/coverage-7.15.4-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:150089274bdc9f940628552cb92844e0223c987f1902ab8efe9f45a2ec758d88", size = 264565 }, + { url = "https://files.pythonhosted.org/packages/c7/cc/a3bb9f93e7e740659163e2ea584f8196ddcd2c456a5dbe15f6c50105fec1/coverage-7.15.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:a58a94fed5da6997d258e8f7668c1e195fbd04a691d781b7558f1e468f9e68bc", size = 266522 }, + { url = "https://files.pythonhosted.org/packages/49/dd/e0e40f3560d878d888c580698ff5ad1179f5e1c3ac949684ef66b41a3817/coverage-7.15.4-cp315-cp315t-win32.whl", hash = "sha256:ebd5a6d8466ff30836572f3ba2cae8a5e8f85029b1c6d5e2ed338dc472a5166a", size = 225068 }, + { url = "https://files.pythonhosted.org/packages/c6/7e/37732ea80eebc30e976e4cdab15c190bc42d96959a42e38ddf6f8c60468f/coverage-7.15.4-cp315-cp315t-win_amd64.whl", hash = "sha256:288bde2a2d7ab6b6c2d7252fcde8b524387f2d970bdba9658fc6f8bbcaef0f9b", size = 225895 }, + { url = "https://files.pythonhosted.org/packages/c6/08/1e00f7923eaaba45fb3d51dd794125fc766304b1df264f3a9c6557bfb30e/coverage-7.15.4-cp315-cp315t-win_arm64.whl", hash = "sha256:68be5e1de60ff13c9095bbec0e5a7fa45b33b101752215b91345ea1f61c4a278", size = 225213 }, + { url = "https://files.pythonhosted.org/packages/b4/d9/e70c286c979378f061d8266e279b686ab0b0b688e1fe0af864684f23a77d/coverage-7.15.4-py3-none-any.whl", hash = "sha256:964730a1e9de9c0cf11be6a1a3c79ce419c34882842abd256086ba4698705e84", size = 214332 }, +] + [[package]] name = "crs-inference" -version = "0.1.0" -source = { virtual = "." } +source = { editable = "." } dependencies = [ { name = "boto3" }, { name = "geopandas" }, { name = "obstore" }, + { name = "psutil" }, + { name = "python-dotenv" }, { name = "shapely" }, ] +[package.optional-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, +] +ops = [ + { name = "matplotlib" }, + { name = "pympler" }, + { name = "pynhd" }, + { name = "pystac" }, +] + [package.metadata] requires-dist = [ { name = "boto3", specifier = ">=1.37.28" }, { name = "geopandas", specifier = ">=1.0.1" }, + { name = "matplotlib", marker = "extra == 'ops'", specifier = ">=3.10.1" }, { name = "obstore", specifier = ">=0.6.0" }, + { name = "psutil", specifier = ">=7.0.0" }, + { name = "pympler", marker = "extra == 'ops'", specifier = ">=1.1" }, + { name = "pynhd", marker = "extra == 'ops'", specifier = ">=0.19.3" }, + { name = "pystac", marker = "extra == 'ops'", specifier = ">=1.15.2" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5" }, + { name = "python-dotenv", specifier = ">=1.2.2" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.9" }, { name = "shapely", specifier = ">=2.1.0" }, ] +provides-extras = ["dev", "ops"] + +[[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 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + +[[package]] +name = "cytoolz" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "toolz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/f9/3243eed3a6545c2a33a21f74f655e3fcb5d2192613cd3db81a93369eb339/cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6", size = 626652 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/e8/218098344ed2cb5f8441fade9b2428e435e7073962374a9c71e59ac141a7/cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4", size = 414121 }, + { url = "https://files.pythonhosted.org/packages/de/27/4d729a5653718109262b758fec1a959aa9facb74c15460d9074dc76d6635/cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662", size = 390904 }, + { url = "https://files.pythonhosted.org/packages/72/c0/cbabfa788bab9c6038953bf9478adaec06e88903a726946ea7c88092f5c4/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3", size = 2090734 }, + { url = "https://files.pythonhosted.org/packages/c3/66/369262c60f9423c2da82a60864a259c852f1aa122aced4acd2c679af58c0/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1", size = 2155933 }, + { url = "https://files.pythonhosted.org/packages/aa/4e/ee55186802f8d24b5fbf9a11405ccd1203b30eded07cc17750618219b94e/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8", size = 2171903 }, + { url = "https://files.pythonhosted.org/packages/a1/96/bd1a9f3396e9b7f618db8cd08d15630769ce3c8b7d0534f92cd639c977ae/cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d", size = 2125270 }, + { url = "https://files.pythonhosted.org/packages/28/48/2a3762873091c88a69e161111cfbc6c222ff145d57ff011a642b169f04f1/cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f", size = 1973967 }, + { url = "https://files.pythonhosted.org/packages/e4/50/500bd69774bdc49a4d78ec8779eb6ac7c1a9d706bfd91cf2a1dba604373a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7", size = 2021695 }, + { url = "https://files.pythonhosted.org/packages/e4/4e/ba5a0ce34869495eb50653de8d676847490cf13a2cac1760fc4d313e78de/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126", size = 2010177 }, + { url = "https://files.pythonhosted.org/packages/87/57/615c630b3089a13adb15351d958d227430cf624f03b1dd39eb52c34c1f59/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0", size = 2154321 }, + { url = "https://files.pythonhosted.org/packages/7f/0f/fe1aa2d931e3b35ecc05215bd75da945ea7346095b3b6f6027164e602d5a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b", size = 2188374 }, + { url = "https://files.pythonhosted.org/packages/de/fa/fd363d97a641b6d0e2fd1d5c35b8fd41d9ccaeb4df56302f53bf23a58e3a/cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d", size = 2077911 }, + { url = "https://files.pythonhosted.org/packages/d9/68/0a22946b98ae5201b54ccb4e651295285c0fb79406022b6ee8b2f791940c/cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9", size = 321903 }, + { url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b", size = 364490 }, + { url = "https://files.pythonhosted.org/packages/aa/2e/a9f069db0107749e9e72baf6c21abe3f006841a3bcfdc9b8420e22ef31eb/cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0", size = 407365 }, + { url = "https://files.pythonhosted.org/packages/a9/9b/5e87dd0e31f54c778b4f9f34cc14c1162d3096c8d746b0f8be97d70dd73c/cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a", size = 385233 }, + { url = "https://files.pythonhosted.org/packages/63/00/2fd32b16284cdb97cfe092822179bc0c3bcdd5e927dd39f986169a517642/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242", size = 2062903 }, + { url = "https://files.pythonhosted.org/packages/85/39/b3cbb5a9847ba59584a263772ad4f8ca2dbfd2a0e11efd09211d1219804c/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296", size = 2139517 }, + { url = "https://files.pythonhosted.org/packages/ea/39/bfcab4a46d50c467e36fe704f19d8904efead417787806ee210327f68390/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b", size = 2154849 }, + { url = "https://files.pythonhosted.org/packages/fd/42/3bc6ee61b0aa47e1cb40819adc1a456d7efa809f0dea9faddacb43fdde8f/cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b", size = 2102302 }, + { url = "https://files.pythonhosted.org/packages/00/66/3f636c6ddea7b18026b90a8c238af472e423b86e427b11df02213689b012/cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266", size = 1960872 }, + { url = "https://files.pythonhosted.org/packages/40/36/cb3b7cdd651007b69f9c48e9d104cec7cb8dc53afa1d6a720e5ad08022fa/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5", size = 2014430 }, + { url = "https://files.pythonhosted.org/packages/88/3f/2e9bd2a16cfd269808922147551dcb2d8b68ba54a2c4deca2fa6a6cd0d5f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3", size = 2003127 }, + { url = "https://files.pythonhosted.org/packages/c4/7d/08604ff940aa784df8343c387fdf2489b948b714a6afb587775ae94da912/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296", size = 2142369 }, + { url = "https://files.pythonhosted.org/packages/d2/c6/39919a0645bdbdf720e97cae107f959ea9d1267fbc3b0d94fc6e1d12ac8f/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140", size = 2180427 }, + { url = "https://files.pythonhosted.org/packages/d8/03/dbb9d47556ee54337e7e0ac209d17ceff2d2a197c34de08005abc7a7449b/cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581", size = 2069785 }, + { url = "https://files.pythonhosted.org/packages/ea/f8/11bb7b8947002231faae3ec2342df5896afbc19eb783a332cce6d219ff79/cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9", size = 320685 }, + { url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297", size = 362898 }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + +[[package]] +name = "fonttools" +version = "4.57.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824 }, + { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072 }, + { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020 }, + { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096 }, + { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356 }, + { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546 }, + { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776 }, + { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175 }, + { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583 }, + { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437 }, + { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431 }, + { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011 }, + { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679 }, + { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833 }, + { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799 }, + { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605 }, +] + +[[package]] +name = "frozenlist" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, + { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, + { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, + { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, + { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, + { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, + { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, + { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, + { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, + { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, + { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, + { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, + { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, + { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, + { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, +] [[package]] name = "geopandas" @@ -75,6 +703,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/64/7d344cfcef5efddf9cf32f59af7f855828e9d74b5f862eddf5bfd9f25323/geopandas-1.0.1-py3-none-any.whl", hash = "sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6", size = 323587 }, ] +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484 }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, +] + [[package]] name = "jmespath" version = "1.0.1" @@ -84,6 +739,242 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, ] +[[package]] +name = "joblib" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, +] + +[[package]] +name = "lxml" +version = "5.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/61/d3dc048cd6c7be6fe45b80cedcbdd4326ba4d550375f266d9f4246d0f4bc/lxml-5.3.2.tar.gz", hash = "sha256:773947d0ed809ddad824b7b14467e1a481b8976e87278ac4a730c2f7c7fcddc1", size = 3679948 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/7e/c749257a7fabc712c4df57927b0f703507f316e9f2c7e3219f8f76d36145/lxml-5.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:16b3897691ec0316a1aa3c6585f61c8b7978475587c5b16fc1d2c28d283dc1b0", size = 8193212 }, + { url = "https://files.pythonhosted.org/packages/a8/50/17e985ba162c9f1ca119f4445004b58f9e5ef559ded599b16755e9bfa260/lxml-5.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8d4b34a0eeaf6e73169dcfd653c8d47f25f09d806c010daf074fba2db5e2d3f", size = 4451439 }, + { url = "https://files.pythonhosted.org/packages/c2/b5/4960ba0fcca6ce394ed4a2f89ee13083e7fcbe9641a91166e8e9792fedb1/lxml-5.3.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cd7a959396da425022e1e4214895b5cfe7de7035a043bcc2d11303792b67554", size = 5052146 }, + { url = "https://files.pythonhosted.org/packages/5f/d1/184b04481a5d1f5758916de087430752a7b229bddbd6c1d23405078c72bd/lxml-5.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cac5eaeec3549c5df7f8f97a5a6db6963b91639389cdd735d5a806370847732b", size = 4789082 }, + { url = "https://files.pythonhosted.org/packages/7d/75/1a19749d373e9a3d08861addccdf50c92b628c67074b22b8f3c61997cf5a/lxml-5.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29b5f7d77334877c2146e7bb8b94e4df980325fab0a8af4d524e5d43cd6f789d", size = 5312300 }, + { url = "https://files.pythonhosted.org/packages/fb/00/9d165d4060d3f347e63b219fcea5c6a3f9193e9e2868c6801e18e5379725/lxml-5.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13f3495cfec24e3d63fffd342cc8141355d1d26ee766ad388775f5c8c5ec3932", size = 4836655 }, + { url = "https://files.pythonhosted.org/packages/b8/e9/06720a33cc155966448a19677f079100517b6629a872382d22ebd25e48aa/lxml-5.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e70ad4c9658beeff99856926fd3ee5fde8b519b92c693f856007177c36eb2e30", size = 4961795 }, + { url = "https://files.pythonhosted.org/packages/2d/57/4540efab2673de2904746b37ef7f74385329afd4643ed92abcc9ec6e00ca/lxml-5.3.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:507085365783abd7879fa0a6fa55eddf4bdd06591b17a2418403bb3aff8a267d", size = 4779791 }, + { url = "https://files.pythonhosted.org/packages/99/ad/6056edf6c9f4fa1d41e6fbdae52c733a4a257fd0d7feccfa26ae051bb46f/lxml-5.3.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:5bb304f67cbf5dfa07edad904732782cbf693286b9cd85af27059c5779131050", size = 5346807 }, + { url = "https://files.pythonhosted.org/packages/a1/fa/5be91fc91a18f3f705ea5533bc2210b25d738c6b615bf1c91e71a9b2f26b/lxml-5.3.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:3d84f5c093645c21c29a4e972b84cb7cf682f707f8706484a5a0c7ff13d7a988", size = 4909213 }, + { url = "https://files.pythonhosted.org/packages/f3/74/71bb96a3b5ae36b74e0402f4fa319df5559a8538577f8c57c50f1b57dc15/lxml-5.3.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bdc13911db524bd63f37b0103af014b7161427ada41f1b0b3c9b5b5a9c1ca927", size = 4987694 }, + { url = "https://files.pythonhosted.org/packages/08/c2/3953a68b0861b2f97234b1838769269478ccf872d8ea7a26e911238220ad/lxml-5.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ec944539543f66ebc060ae180d47e86aca0188bda9cbfadff47d86b0dc057dc", size = 4862865 }, + { url = "https://files.pythonhosted.org/packages/e0/9a/52e48f7cfd5a5e61f44a77e679880580dfb4f077af52d6ed5dd97e3356fe/lxml-5.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:59d437cc8a7f838282df5a199cf26f97ef08f1c0fbec6e84bd6f5cc2b7913f6e", size = 5423383 }, + { url = "https://files.pythonhosted.org/packages/17/67/42fe1d489e4dcc0b264bef361aef0b929fbb2b5378702471a3043bc6982c/lxml-5.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e275961adbd32e15672e14e0cc976a982075208224ce06d149c92cb43db5b93", size = 5286864 }, + { url = "https://files.pythonhosted.org/packages/29/e4/03b1d040ee3aaf2bd4e1c2061de2eae1178fe9a460d3efc1ea7ef66f6011/lxml-5.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:038aeb6937aa404480c2966b7f26f1440a14005cb0702078c173c028eca72c31", size = 5056819 }, + { url = "https://files.pythonhosted.org/packages/83/b3/e2ec8a6378e4d87da3af9de7c862bcea7ca624fc1a74b794180c82e30123/lxml-5.3.2-cp312-cp312-win32.whl", hash = "sha256:3c2c8d0fa3277147bff180e3590be67597e17d365ce94beb2efa3138a2131f71", size = 3486177 }, + { url = "https://files.pythonhosted.org/packages/d5/8a/6a08254b0bab2da9573735725caab8302a2a1c9b3818533b41568ca489be/lxml-5.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:77809fcd97dfda3f399102db1794f7280737b69830cd5c961ac87b3c5c05662d", size = 3817134 }, + { url = "https://files.pythonhosted.org/packages/19/fe/904fd1b0ba4f42ed5a144fcfff7b8913181892a6aa7aeb361ee783d441f8/lxml-5.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77626571fb5270ceb36134765f25b665b896243529eefe840974269b083e090d", size = 8173598 }, + { url = "https://files.pythonhosted.org/packages/97/e8/5e332877b3ce4e2840507b35d6dbe1cc33b17678ece945ba48d2962f8c06/lxml-5.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78a533375dc7aa16d0da44af3cf6e96035e484c8c6b2b2445541a5d4d3d289ee", size = 4441586 }, + { url = "https://files.pythonhosted.org/packages/de/f4/8fe2e6d8721803182fbce2325712e98f22dbc478126070e62731ec6d54a0/lxml-5.3.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6f62b2404b3f3f0744bbcabb0381c5fe186fa2a9a67ecca3603480f4846c585", size = 5038447 }, + { url = "https://files.pythonhosted.org/packages/a6/ac/fa63f86a1a4b1ba8b03599ad9e2f5212fa813223ac60bfe1155390d1cc0c/lxml-5.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea918da00091194526d40c30c4996971f09dacab032607581f8d8872db34fbf", size = 4783583 }, + { url = "https://files.pythonhosted.org/packages/1a/7a/08898541296a02c868d4acc11f31a5839d80f5b21d4a96f11d4c0fbed15e/lxml-5.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c35326f94702a7264aa0eea826a79547d3396a41ae87a70511b9f6e9667ad31c", size = 5305684 }, + { url = "https://files.pythonhosted.org/packages/0b/be/9a6d80b467771b90be762b968985d3de09e0d5886092238da65dac9c1f75/lxml-5.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3bef90af21d31c4544bc917f51e04f94ae11b43156356aff243cdd84802cbf2", size = 4830797 }, + { url = "https://files.pythonhosted.org/packages/8d/1c/493632959f83519802637f7db3be0113b6e8a4e501b31411fbf410735a75/lxml-5.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52fa7ba11a495b7cbce51573c73f638f1dcff7b3ee23697467dc063f75352a69", size = 4950302 }, + { url = "https://files.pythonhosted.org/packages/c7/13/01aa3b92a6b93253b90c061c7527261b792f5ae7724b420cded733bfd5d6/lxml-5.3.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ad131e2c4d2c3803e736bb69063382334e03648de2a6b8f56a878d700d4b557d", size = 4775247 }, + { url = "https://files.pythonhosted.org/packages/60/4a/baeb09fbf5c84809e119c9cf8e2e94acec326a9b45563bf5ae45a234973b/lxml-5.3.2-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:00a4463ca409ceacd20490a893a7e08deec7870840eff33dc3093067b559ce3e", size = 5338824 }, + { url = "https://files.pythonhosted.org/packages/69/c7/a05850f169ad783ed09740ac895e158b06d25fce4b13887a8ac92a84d61c/lxml-5.3.2-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:87e8d78205331cace2b73ac8249294c24ae3cba98220687b5b8ec5971a2267f1", size = 4899079 }, + { url = "https://files.pythonhosted.org/packages/de/48/18ca583aba5235582db0e933ed1af6540226ee9ca16c2ee2d6f504fcc34a/lxml-5.3.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bf6389133bb255e530a4f2f553f41c4dd795b1fbb6f797aea1eff308f1e11606", size = 4978041 }, + { url = "https://files.pythonhosted.org/packages/b6/55/6968ddc88554209d1dba0dca196360c629b3dfe083bc32a3370f9523a0c4/lxml-5.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b3709fc752b42fb6b6ffa2ba0a5b9871646d97d011d8f08f4d5b3ee61c7f3b2b", size = 4859761 }, + { url = "https://files.pythonhosted.org/packages/2e/52/d2d3baa1e0b7d04a729613160f1562f466fb1a0e45085a33acb0d6981a2b/lxml-5.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:abc795703d0de5d83943a4badd770fbe3d1ca16ee4ff3783d7caffc252f309ae", size = 5418209 }, + { url = "https://files.pythonhosted.org/packages/d3/50/6005b297ba5f858a113d6e81ccdb3a558b95a615772e7412d1f1cbdf22d7/lxml-5.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98050830bb6510159f65d9ad1b8aca27f07c01bb3884ba95f17319ccedc4bcf9", size = 5274231 }, + { url = "https://files.pythonhosted.org/packages/fb/33/6f40c09a5f7d7e7fcb85ef75072e53eba3fbadbf23e4991ca069ab2b1abb/lxml-5.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ba465a91acc419c5682f8b06bcc84a424a7aa5c91c220241c6fd31de2a72bc6", size = 5051899 }, + { url = "https://files.pythonhosted.org/packages/8b/3a/673bc5c0d5fb6596ee2963dd016fdaefaed2c57ede82c7634c08cbda86c1/lxml-5.3.2-cp313-cp313-win32.whl", hash = "sha256:56a1d56d60ea1ec940f949d7a309e0bff05243f9bd337f585721605670abb1c1", size = 3485315 }, + { url = "https://files.pythonhosted.org/packages/8c/be/cab8dd33b0dbe3af5b5d4d24137218f79ea75d540f74eb7d8581195639e0/lxml-5.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:1a580dc232c33d2ad87d02c8a3069d47abbcdce974b9c9cc82a79ff603065dbe", size = 3814639 }, +] + +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488 }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264 }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048 }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111 }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771 }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742 }, + { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112 }, + { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931 }, + { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422 }, + { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819 }, + { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782 }, + { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812 }, + { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021 }, + { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782 }, + { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901 }, + { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864 }, + { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487 }, + { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, +] + +[[package]] +name = "multidict" +version = "6.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019 }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925 }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008 }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374 }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869 }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949 }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032 }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517 }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291 }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982 }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823 }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714 }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739 }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809 }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934 }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242 }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635 }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831 }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888 }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852 }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644 }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446 }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070 }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956 }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599 }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136 }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139 }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251 }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868 }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106 }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163 }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906 }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238 }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799 }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642 }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028 }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424 }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178 }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617 }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919 }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097 }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706 }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728 }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276 }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069 }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858 }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988 }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435 }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494 }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775 }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946 }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400 }, +] + +[[package]] +name = "netcdf4" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "cftime" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/ed/4d27fcfa40ebfdad3d2088a3de7ee48dbff7f35163e815ec1870d2a7398c/netcdf4-1.7.2.tar.gz", hash = "sha256:a4c6375540b19989896136943abb6d44850ff6f1fa7d3f063253b1ad3f8b7fce", size = 835064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/7f/3a0f18a39efca0e093b54d634b66573c25ecab5c482d73138ae14aa55c6d/netCDF4-1.7.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:e73e3baa0b74afc414e53ff5095748fdbec7fb346eda351e567c23f2f0d247f1", size = 2952127 }, + { url = "https://files.pythonhosted.org/packages/ed/c4/8aac0f8ca95a41bdf1364d34ff4e9bcc24494bfe69a1157301d884c2e392/netCDF4-1.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a51da09258b31776f474c1d47e484fc7214914cdc59edf4cee789ba632184591", size = 2460781 }, + { url = "https://files.pythonhosted.org/packages/2d/1a/32b7427aaf62fed3d4e4456f874b25ce39373dbddf6cfde9edbcfc2417fc/netCDF4-1.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb95b11804fe051897d1f2044b05d82a1847bc2549631cdd2f655dde7de77a9c", size = 9377415 }, + { url = "https://files.pythonhosted.org/packages/fd/bf/5e671495c8bdf6b628e091aa8980793579474a10e51bc6ba302a3af6a778/netCDF4-1.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d8a848373723f41ef662590b4f5e1832227501c9fd4513e8ad8da58c269977", size = 9260579 }, + { url = "https://files.pythonhosted.org/packages/d4/57/0a0bcdebcfaf72e96e7bcaa512f80ee096bf71945a3318d38253338e9c25/netCDF4-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:568ea369e00b581302d77fc5fd0b8f78e520c7e08d0b5af5219ba51f3f1cd694", size = 6991523 }, + { url = "https://files.pythonhosted.org/packages/e6/7a/ce4f9038d8726c9c90e07b2d3a404ae111a27720d712cfcded0c8ef160e8/netCDF4-1.7.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:205a5f1de3ddb993c7c97fb204a923a22408cc2e5facf08d75a8eb89b3e7e1a8", size = 2948911 }, + { url = "https://files.pythonhosted.org/packages/58/3e/5736880a607edabca4c4fc49f1ccf9a2bb2485f84478e4cd19ba11c3b803/netCDF4-1.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:96653fc75057df196010818367c63ba6d7e9af603df0a7fe43fcdad3fe0e9e56", size = 2455078 }, + { url = "https://files.pythonhosted.org/packages/71/96/d5d8859a6dac29f8ebc815ff8e75770bd513db9f08d7a711e21ae562a948/netCDF4-1.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30d20e56b9ba2c48884eb89c91b63e6c0612b4927881707e34402719153ef17f", size = 9378149 }, + { url = "https://files.pythonhosted.org/packages/d1/80/b9c19f1bb4ac6c5fa6f94a4f278bc68a778473d1814a86a375d7cffa193a/netCDF4-1.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6bfd38ba0bde04d56f06c1554714a2ea9dab75811c89450dc3ec57a9d36b80", size = 9254471 }, + { url = "https://files.pythonhosted.org/packages/66/b5/e04550fd53de57001dbd5a87242da7ff784c80790adc48897977b6ccf891/netCDF4-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:5c5fbee6134ee1246c397e1508e5297d825aa19221fdf3fa8dc9727ad824d7a5", size = 6990521 }, + { url = "https://files.pythonhosted.org/packages/84/0a/182bb4fe5639699ba39d558b553b8e6f04fbfea6cf78404c0f21ef149bf7/netcdf4-1.7.2-cp311-abi3-macosx_13_0_x86_64.whl", hash = "sha256:7e81c3c47f2772eab0b93fba8bb05b17b58dce17720e1bed25e9d76551deecd0", size = 2751391 }, + { url = "https://files.pythonhosted.org/packages/2d/1f/54ac27c791360f7452ca27ed1cb2917946bbe1ea4337c590a5abcef6332d/netcdf4-1.7.2-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:cb2791dba37fc98fd1ac4e236c97822909f54efbcdf7f1415c9777810e0a28f4", size = 2387513 }, + { url = "https://files.pythonhosted.org/packages/5c/5e/9bf3008a9e45c08f4c9fedce4d6f722ef5d970f56a9c5eb375a200dd2b66/netcdf4-1.7.2-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf11480f6b8a5b246818ffff6b4d90481e51f8b9555b41af0c372eb0aaf8b65f", size = 9621674 }, + { url = "https://files.pythonhosted.org/packages/a1/75/46871e85f2bbfb1efe229623d25d7c9daa17e2e968d5235572b2c8bb53e8/netcdf4-1.7.2-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ccc05328a8ff31921b539821791aeb20b054879f3fdf6d1d505bf6422824fec", size = 9453759 }, + { url = "https://files.pythonhosted.org/packages/cd/10/c52f12297965938d9b9be666ea1f9d8340c2aea31d6909d90aa650847248/netcdf4-1.7.2-cp311-abi3-win_amd64.whl", hash = "sha256:999bfc4acebf400ed724d5e7329e2e768accc7ee1fa1d82d505da782f730301b", size = 7148514 }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, +] + [[package]] name = "numpy" version = "2.2.4" @@ -155,6 +1046,57 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/54/969edfbb288b58e096e3089d02535a83715617e62255fb83909989434b00/obstore-0.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:bec5e38903ea6e8f24a327c07db45b3d3ce8979a98170e6097636bb5dfc07f75", size = 3925354 }, ] +[[package]] +name = "orjson" +version = "3.10.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325 }, + { url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621 }, + { url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270 }, + { url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346 }, + { url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845 }, + { url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078 }, + { url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712 }, + { url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136 }, + { url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258 }, + { url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326 }, + { url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800 }, + { url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516 }, + { url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759 }, + { url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944 }, + { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289 }, + { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640 }, + { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286 }, + { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307 }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739 }, + { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076 }, + { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643 }, + { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168 }, + { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271 }, + { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444 }, + { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737 }, + { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482 }, + { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714 }, + { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 }, +] + +[[package]] +name = "owslib" +version = "0.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, + { name = "python-dateutil" }, + { name = "pyyaml" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/6c/0c91125cf23bf6416bc142c11940f5aae3ffbe5ff25e78175b052b35137b/owslib-0.33.0.tar.gz", hash = "sha256:261c76c1a1dd066b011cddac451e3f9a00d3328c7af90d5592c089b5fc590766", size = 245992 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/8a/e6afe0fee383db8fa22f0a1645a33e0f606349125f943e0c5223e19d252c/owslib-0.33.0-py3-none-any.whl", hash = "sha256:bcfeb8527a601971e975c9196282ce9b330f6f1a0c6d5931131424206a98258e", size = 240149 }, +] + [[package]] name = "packaging" version = "24.2" @@ -199,30 +1141,335 @@ wheels = [ ] [[package]] -name = "pyogrio" -version = "0.10.0" +name = "pillow" +version = "11.2.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "numpy" }, - { name = "packaging" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185 }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306 }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121 }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707 }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921 }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523 }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836 }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390 }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309 }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768 }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087 }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/8f/5a784595524a79c269f2b1c880f4fdb152867df700c97005dda51997da02/pyogrio-0.10.0.tar.gz", hash = "sha256:ec051cb568324de878828fae96379b71858933413e185148acb6c162851ab23c", size = 281950 } + +[[package]] +name = "platformdirs" +version = "4.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/b5/3c5dfd0b50cbce6f3d4e42c0484647feb1809dbe20e225c4c6abd067e69f/pyogrio-0.10.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d6558b180e020f71ab7aa7f82d592ed3305c9f698d98f6d0a4637ec7a84c4ce", size = 15079211 }, - { url = "https://files.pythonhosted.org/packages/b8/9a/1ba9c707a094976f343bd0177741eaba0e842fa05ecd8ab97192db4f2ec1/pyogrio-0.10.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:a99102037eead8ba491bc57825c1e395ee31c9956d7bff7b4a9e4fdbff3a13c2", size = 16442782 }, - { url = "https://files.pythonhosted.org/packages/5e/bb/b4250746c2c85fea5004cae93e9e25ad01516e9e94e04de780a2e78139da/pyogrio-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a4c373281d7cbf560c5b61f8f3c7442103ad7f1c7ac4ef3a84572ed7a5dd2f6", size = 23899832 }, - { url = "https://files.pythonhosted.org/packages/bd/4c/79e47e40a8e54e79a45133786a0a58209534f580591c933d40c5ed314fe7/pyogrio-0.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:19f18411bdf836d24cdc08b9337eb3ec415e4ac4086ba64516b36b73a2e88622", size = 23081469 }, - { url = "https://files.pythonhosted.org/packages/47/78/2b62c8a340bcb0ea56b9ddf2ef5fd3d1f101dc0e98816b9e6da87c5ac3b7/pyogrio-0.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1abbcdd9876f30bebf1df8a0273f6cdeb29d03259290008275c7fddebe139f20", size = 24024758 }, - { url = "https://files.pythonhosted.org/packages/43/97/34605480f06b0ad9611bf58a174eccc6f3673275f3d519cf763391892881/pyogrio-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc", size = 16160294 }, - { url = "https://files.pythonhosted.org/packages/14/4a/4c8e4f5b9edbca46e0f8d6c1c0b56c0d4af0900c29f4bea22d37853c07f3/pyogrio-0.10.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c90478209537a31dcc65664a87a04c094bb0e08efe502908a6682b8cec0259bf", size = 15076879 }, - { url = "https://files.pythonhosted.org/packages/5f/be/7db0644eef9ef3382518399aaf3332827c43018112d2a74f78784fd496ec/pyogrio-0.10.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:fec45e1963b7058e5a1aa98598aed07c0858512c833d6aad2c672c3ec98bbf04", size = 16440405 }, + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, +] + +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430 }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637 }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123 }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031 }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100 }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170 }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000 }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262 }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772 }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133 }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741 }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047 }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467 }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022 }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647 }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784 }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865 }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452 }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800 }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804 }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235 }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249 }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964 }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501 }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917 }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089 }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102 }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122 }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818 }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112 }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034 }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613 }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763 }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175 }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265 }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412 }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290 }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926 }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808 }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916 }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661 }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384 }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420 }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880 }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407 }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573 }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757 }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 }, +] + +[[package]] +name = "psutil" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, +] + +[[package]] +name = "pyarrow" +version = "19.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749 }, + { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007 }, + { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566 }, + { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991 }, + { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986 }, + { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026 }, + { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108 }, + { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552 }, + { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413 }, + { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869 }, + { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626 }, + { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708 }, + { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728 }, + { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568 }, + { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371 }, + { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046 }, + { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183 }, + { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896 }, + { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851 }, + { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744 }, +] + +[[package]] +name = "pycares" +version = "4.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/ac/05e32fe0abecf98b58cb28646d59280ebad8d79b9785ad6771fa830a458b/pycares-4.6.0.tar.gz", hash = "sha256:b8a004b18a7465ac9400216bc3fad9d9966007af1ee32f4412d2b3a94e33456e", size = 822080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/25/0da39434c0cecbd309628b8a3bb88b26ec2391d84cf282034bfcd65b0cfa/pycares-4.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21c3254ccbeb0111f0d3e570e55ae1bdb7bc7e4a547b664b33aeff701c794cf6", size = 75676 }, + { url = "https://files.pythonhosted.org/packages/fe/3f/3335bc34b46c4ad0de3d0a363d6e809e985bab09d24ba5464e8d034914b5/pycares-4.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86f443dacbd31b9bd0b4b2124c9268fa6697856b44b5b4a4c7bab9f81615fe5c", size = 72089 }, + { url = "https://files.pythonhosted.org/packages/13/9b/0b37f124b621921bfb13558989d22aaba6723621d49dc12f93b755ae76ce/pycares-4.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3813815990345deaaee9e8db5e42f0c9cd2f46154ff5cb43d765f1c4891e1cee", size = 291100 }, + { url = "https://files.pythonhosted.org/packages/80/4f/4308a2765e102ddac0413c74a9446c0794685c7b64f5deed770b8a5351be/pycares-4.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c49887eaf68c33beb88f5c3454efa9165753df0b27d3cac9ae0f8fa4cc377be4", size = 305062 }, + { url = "https://files.pythonhosted.org/packages/34/54/f73c6940905269b2967b8c0c637649f16089dfc728b2370bc412e1e39d90/pycares-4.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee60a544e8d6ff2a3d5e1518e5c9597d528848413cc330aa46cf3fc62f48d9e0", size = 295043 }, + { url = "https://files.pythonhosted.org/packages/5c/7b/dfddb506936ed27ab0dac6f53f5882e2094d5fc4ca1e41c1ed5ae738c316/pycares-4.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44224d486b5b03804a2b575f22feae3df22cd07fde2be0ac055c752c17133542", size = 290642 }, + { url = "https://files.pythonhosted.org/packages/9d/05/76ab86b13684f5e752634030511270264d5f8dc99e23a8bf24af6dc66fb6/pycares-4.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59989759114d68ec4a16d2c2b020ec702b5076e351e9d40f7a4629945f9d56f7", size = 271377 }, + { url = "https://files.pythonhosted.org/packages/09/21/d032d9c9aa1c124a3443fa42e0b0311555d4ebd33c4b5cb1c16e180ca9f5/pycares-4.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e2e65edf4a2c84eb61340b7698573dd36f58182641db3d61f44abe142ba39b83", size = 279317 }, + { url = "https://files.pythonhosted.org/packages/18/84/927f45d2b3c8a7cf52c1d94c1d418950f04261443eedea30e997ebe782d5/pycares-4.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b0e02b71765f0ab1a8dd97a126cf4e674f2e98ef9e5108c00ff577bed29c439c", size = 264481 }, + { url = "https://files.pythonhosted.org/packages/f3/a7/5c54f36ba75464e7789d973f7467fbb9d1fe7b3b778c35b85ba886e167ed/pycares-4.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7ce93fcde4a35dfc53b32333bee7b2a131bac9a605263e76342cbb37eff3af04", size = 298494 }, + { url = "https://files.pythonhosted.org/packages/af/36/a30565c579e92d0bce14afad31ed202374fd824e89be87bc40e1cbe86f7e/pycares-4.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:178287b3a3761024cfd492e1c4293c1ed886cd84ac128278646b317dba082613", size = 292394 }, + { url = "https://files.pythonhosted.org/packages/33/f5/803674db3ef0f7f0340b4f7faf49ee3b151cf2b3a53ba3605326ea351d0d/pycares-4.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bae8cda2af0c0f3325bb035fe7484e1d88d21698ae7043ad920d5c330a4f694e", size = 281916 }, + { url = "https://files.pythonhosted.org/packages/af/8b/5b0cbb202e72a75ce43efa2c721f479d163b6eacee7907a3602ada68f0a1/pycares-4.6.0-cp312-cp312-win32.whl", hash = "sha256:efc8bc00eb1d0a84aba1d2edf3f9f96bf3b7b9f076d6bce1394ff895b7618eb7", size = 62248 }, + { url = "https://files.pythonhosted.org/packages/a9/6c/5a680fe0402f1420c8c4ec235a44ae5fb3d2fc5642eca69f39d0f44abbea/pycares-4.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:6430b996761fe61bf86577183d6d342bc619e75e5cd7251b5827f2c56aae5aca", size = 77474 }, + { url = "https://files.pythonhosted.org/packages/7a/ea/2cee3369713fafc04f4ac56b13f709879e652a55528c23a88a65eba3abaf/pycares-4.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8687028455f243dc3fe047e2e4b4b98d77811ce0e1e83d1929baf4a2f60bcd0b", size = 75674 }, + { url = "https://files.pythonhosted.org/packages/59/21/bac9ebdfe03d3b07456fd44042ae2cb95fd552f6f1050618077957bb6303/pycares-4.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:02587f22cd7540dbf608dcc942d3c6eee4246bbb76c9cc8449d307188ad26441", size = 72095 }, + { url = "https://files.pythonhosted.org/packages/3f/46/fa7e5d053040c4e8e214864a0b2709eb6ad903b332eb107af34103c8a716/pycares-4.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f07d1558503ac72475f9bb2ce6116c18fc868ab083b8e67c6433ca0c7b09d3", size = 291073 }, + { url = "https://files.pythonhosted.org/packages/2e/22/aae38c9e676904138535bde04d8315361aaad6afd4da66ec273a38e4aab9/pycares-4.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39bb28bebb98a4be0438f06adfed5f4c12b115af531b48cd27692b8704eec02", size = 304994 }, + { url = "https://files.pythonhosted.org/packages/5c/96/18330188d540be9307f9cdce5ba6336de8590792496af0d2d9e0b23aa870/pycares-4.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e63b5c955b0ade059e147334efc0aafe76ba513f4cf6dd802af9c2450dc4f6ad", size = 295017 }, + { url = "https://files.pythonhosted.org/packages/33/0c/e7cc479a7fb6e849a500985944a5a1a3d8b4fd05b9d4aa98c2e01048e2c2/pycares-4.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae9c72108784d725d2fa38eedbf702a6511cb67e24e27714b35c930e4d3bee6", size = 290624 }, + { url = "https://files.pythonhosted.org/packages/34/c6/803bca58a4a381f60f1654c5fcb06df83789a03f546a6fc883d640eafec4/pycares-4.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30ca7df82180edffd0562ebc22228f8dd348f91810d37ac0389ebc73e4a7d723", size = 271348 }, + { url = "https://files.pythonhosted.org/packages/27/a1/c45fce9580658021b96a788cd6e054d24af834fe910ec7067f49d1f713ac/pycares-4.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:74dd022766d987eb6ea64ef5db45821849508b1818bdbd5ef8d0ad198ab25d02", size = 279333 }, + { url = "https://files.pythonhosted.org/packages/ff/14/fac01d5a2d8401357c1c38fa5053f5d808a79cf853e3eb104bc4af17df2b/pycares-4.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9716e6c1041569fd391aeb71a75b18038cb5e796a93408a88c27cc48dd076035", size = 264468 }, + { url = "https://files.pythonhosted.org/packages/03/6b/ff6cc8b671f7742f9054bf1d50ba3188b1ae8b1a188610dbc9515eb11ca3/pycares-4.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a1972b3a1473d473e52038f8153b0a9b49860b7dffd183d8bef2fe481e850ce5", size = 298489 }, + { url = "https://files.pythonhosted.org/packages/cd/a6/20d1d368621e8327cc2b178982b1a1990608bb0cb65ec7b822faeee41475/pycares-4.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c2b69622fa6fafbda109f8a79bb92d785d38546c81dfd94207fb0ead4d237a36", size = 292391 }, + { url = "https://files.pythonhosted.org/packages/df/29/5209f3ec6bc20d0c6f81c9b444027ffc346f2b603d5b764abc2bc1153645/pycares-4.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:63012f6194be62a9d6a62bcb57fa3df90bfb58b81f613f548df0289ce6b53067", size = 281924 }, + { url = "https://files.pythonhosted.org/packages/63/f0/c3c0a927d26235929d8ecfe2b4c95a5b701c19d61c7bfd41121765110284/pycares-4.6.0-cp313-cp313-win32.whl", hash = "sha256:e8689563fb2148feecdf4e03b8845f79dc3115df0fefad99ece718ff0f319004", size = 62249 }, + { url = "https://files.pythonhosted.org/packages/9b/3f/6b976c4fdb43249f72e071b2dc132a829a5aac616a7cbdc56860670c1de3/pycares-4.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:2e82fe5e269359fbecdff3ed026f491485e92012f8c8a7386d3aa1aa830f1936", size = 77473 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pygeoogc" +version = "0.19.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-retriever" }, + { name = "cytoolz" }, + { name = "defusedxml" }, + { name = "joblib" }, + { name = "multidict" }, + { name = "orjson" }, + { name = "owslib" }, + { name = "pyproj" }, + { name = "requests" }, + { name = "requests-cache" }, + { name = "shapely" }, + { name = "typing-extensions" }, + { name = "url-normalize" }, + { name = "urllib3" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/61/3f9145765d4101d5e507a46a89c7c4bc8bd704cf47bafd6430e9515916b5/pygeoogc-0.19.3.tar.gz", hash = "sha256:1eaf6505728d22d55faa4ee450ab713243ff131c570a23547da5122b657b7e24", size = 55104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/53/41fd09cc6c9ce79b79f78758c5b890e47683bb166b97f1df3bfe054c780e/pygeoogc-0.19.3-py3-none-any.whl", hash = "sha256:632f6b705647625e7a398e56277490d9e7274346c3da874a4f19f1dfcff19b05", size = 34971 }, +] + +[[package]] +name = "pygeoutils" +version = "0.19.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cytoolz" }, + { name = "geopandas" }, + { name = "netcdf4" }, + { name = "numpy" }, + { name = "pyproj" }, + { name = "rasterio" }, + { name = "rioxarray" }, + { name = "scipy" }, + { name = "shapely" }, + { name = "xarray" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/c4/d6e363ccfcf198d5eb250b414e14a81a163eb6976c1bf0a29f88a0a596a2/pygeoutils-0.19.5.tar.gz", hash = "sha256:1dd29325607ce7546672b74b17effcc66a94f8036074558310574976c4e5d751", size = 50276 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/9f/7dcacaef62e83fa2af4325a0c9176304844bc95c982f1acf8355439882e3/pygeoutils-0.19.5-py3-none-any.whl", hash = "sha256:62477edb180e3bd8e9e32329c15371377fb7906c2a2cc8d846d61a7bb71685d6", size = 30574 }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151 }, +] + +[[package]] +name = "pympler" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/37/c384631908029676d8e7213dd956bb686af303a80db7afbc9be36bc49495/pympler-1.1.tar.gz", hash = "sha256:1eaa867cb8992c218430f1708fdaccda53df064144d1c5656b1e6f1ee6000424", size = 179954 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl", hash = "sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506", size = 165766 }, +] + +[[package]] +name = "pynhd" +version = "0.19.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-retriever" }, + { name = "cytoolz" }, + { name = "geopandas" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pygeoogc" }, + { name = "pygeoutils" }, + { name = "shapely" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/c3/86b7bc2b4a12a8194858d9e5285a2e3b930ac76b7bf16e48469ab23de4eb/pynhd-0.19.3.tar.gz", hash = "sha256:3ef83c5c2040808f0c675b8a466be0169b118fe15f563a9c8f440a4185f1d959", size = 70490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/53/d887a4cfc1c375f9cde9b523d408a4728f30c314e0ec5d5d819179178f64/pynhd-0.19.3-py3-none-any.whl", hash = "sha256:16ebd5136fc45101c7d69c2ed1a92eb2cc531e6c766a9300e0c6d7136469d298", size = 51458 }, +] + +[[package]] +name = "pyogrio" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "numpy" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/8f/5a784595524a79c269f2b1c880f4fdb152867df700c97005dda51997da02/pyogrio-0.10.0.tar.gz", hash = "sha256:ec051cb568324de878828fae96379b71858933413e185148acb6c162851ab23c", size = 281950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/b5/3c5dfd0b50cbce6f3d4e42c0484647feb1809dbe20e225c4c6abd067e69f/pyogrio-0.10.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d6558b180e020f71ab7aa7f82d592ed3305c9f698d98f6d0a4637ec7a84c4ce", size = 15079211 }, + { url = "https://files.pythonhosted.org/packages/b8/9a/1ba9c707a094976f343bd0177741eaba0e842fa05ecd8ab97192db4f2ec1/pyogrio-0.10.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:a99102037eead8ba491bc57825c1e395ee31c9956d7bff7b4a9e4fdbff3a13c2", size = 16442782 }, + { url = "https://files.pythonhosted.org/packages/5e/bb/b4250746c2c85fea5004cae93e9e25ad01516e9e94e04de780a2e78139da/pyogrio-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a4c373281d7cbf560c5b61f8f3c7442103ad7f1c7ac4ef3a84572ed7a5dd2f6", size = 23899832 }, + { url = "https://files.pythonhosted.org/packages/bd/4c/79e47e40a8e54e79a45133786a0a58209534f580591c933d40c5ed314fe7/pyogrio-0.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:19f18411bdf836d24cdc08b9337eb3ec415e4ac4086ba64516b36b73a2e88622", size = 23081469 }, + { url = "https://files.pythonhosted.org/packages/47/78/2b62c8a340bcb0ea56b9ddf2ef5fd3d1f101dc0e98816b9e6da87c5ac3b7/pyogrio-0.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1abbcdd9876f30bebf1df8a0273f6cdeb29d03259290008275c7fddebe139f20", size = 24024758 }, + { url = "https://files.pythonhosted.org/packages/43/97/34605480f06b0ad9611bf58a174eccc6f3673275f3d519cf763391892881/pyogrio-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc", size = 16160294 }, + { url = "https://files.pythonhosted.org/packages/14/4a/4c8e4f5b9edbca46e0f8d6c1c0b56c0d4af0900c29f4bea22d37853c07f3/pyogrio-0.10.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c90478209537a31dcc65664a87a04c094bb0e08efe502908a6682b8cec0259bf", size = 15076879 }, + { url = "https://files.pythonhosted.org/packages/5f/be/7db0644eef9ef3382518399aaf3332827c43018112d2a74f78784fd496ec/pyogrio-0.10.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:fec45e1963b7058e5a1aa98598aed07c0858512c833d6aad2c672c3ec98bbf04", size = 16440405 }, { url = "https://files.pythonhosted.org/packages/96/77/f199230ba86fe88b1f57e71428c169ed982de68a32d6082cd7c12d0f5d55/pyogrio-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28cb139f8a5d0365ede602230104b407ae52bb6b55173c8d5a35424d28c4a2c5", size = 23871511 }, { url = "https://files.pythonhosted.org/packages/25/ac/ca483bec408b59c54f7129b0244cc9de21d8461aefe89ece7bd74ad33807/pyogrio-0.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:cea0187fcc2d574e52af8cfab041fa0a7ad71d5ef6b94b49a3f3d2a04534a27e", size = 23048830 }, { url = "https://files.pythonhosted.org/packages/d7/3e/c35f2d8dad95b24e568c468f09ff60fb61945065465e0ec7868400596566/pyogrio-0.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:7c02b207ea8cf09c501ea3e95d29152781a00d3c32267286bc36fa457c332205", size = 23996873 }, { url = "https://files.pythonhosted.org/packages/27/5d/0deb16d228362a097ee3258d0a887c9c0add4b9678bb4847b08a241e124d/pyogrio-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:02e54bcfb305af75f829044b0045f74de31b77c2d6546f7aaf96822066147848", size = 16158260 }, ] +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, +] + [[package]] name = "pyproj" version = "3.7.1" @@ -250,6 +1497,346 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/df/68a2b7f5fb6400c64aad82d72bcc4bc531775e62eedff993a77c780defd0/pyproj-3.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:d3caac7473be22b6d6e102dde6c46de73b96bc98334e577dfaee9886f102ea2e", size = 6266573 }, ] +[[package]] +name = "pystac" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, + { name = "pystac-ext-classification" }, + { name = "pystac-ext-datacube" }, + { name = "pystac-ext-eo" }, + { name = "pystac-ext-file" }, + { name = "pystac-ext-grid" }, + { name = "pystac-ext-item-assets" }, + { name = "pystac-ext-label" }, + { name = "pystac-ext-mgrs" }, + { name = "pystac-ext-mlm" }, + { name = "pystac-ext-pointcloud" }, + { name = "pystac-ext-projection" }, + { name = "pystac-ext-raster" }, + { name = "pystac-ext-render" }, + { name = "pystac-ext-sar" }, + { name = "pystac-ext-sat" }, + { name = "pystac-ext-scientific" }, + { name = "pystac-ext-storage" }, + { name = "pystac-ext-table" }, + { name = "pystac-ext-timestamps" }, + { name = "pystac-ext-version" }, + { name = "pystac-ext-view" }, + { name = "pystac-ext-xarray-assets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/38/300a9bc5bf30748c7bc768afd8564e0b6958810c8ca0c50f1c0847676a40/pystac-1.15.2.tar.gz", hash = "sha256:4c9a3b2352cad7eb3c226145251c65cbe5c1b04b25d4265b30c015dddf5f391d", size = 7595 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/54/81ca429d8ee0fa1ff78ad3102a612cfb8224aae4ba42ac625c726b13f81c/pystac-1.15.2-py3-none-any.whl", hash = "sha256:b006833253d7e5acd04d877bb7504e14aa1dc98dd0f0ab12f893595030dda2b3", size = 5694 }, +] + +[[package]] +name = "pystac-core" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/67/892aaa463188a259b9538d9d49f420d761ba8fcb8464bf0d8b2cb0a2ef56/pystac_core-1.15.2.tar.gz", hash = "sha256:3720485dd06334e6536afe8f2b8bb0def5c65437170e0251b3417abb89d6b3f3", size = 93857 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d6/3c65df53ac66532e4451917ed63dcc7c260db30eed0d5c5f1782fcc4128e/pystac_core-1.15.2-py3-none-any.whl", hash = "sha256:96e4acf5eb08ba8be543729b59c3072103bffa7b90283c7497cb25fbff70e6cf", size = 117305 }, +] + +[[package]] +name = "pystac-ext-classification" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/ef/4ae97a54de23f84f8ca9637a73efc42dfc343881a9ce159ff40f7dc5c5ce/pystac_ext_classification-2.0.0.tar.gz", hash = "sha256:b744d42eb74fa5038cf00896f3cf4fbb85b79cf208454b7401bd8219e491eb94", size = 21154 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/d3/f19b3e52938785e3540e5515ba0453291700729d7fa6863c6c07c3faf6bc/pystac_ext_classification-2.0.0-py3-none-any.whl", hash = "sha256:fe8c94fd83b2402cb314f608e835d45d70397614928d6cbb29b12d4728586abd", size = 7036 }, +] + +[[package]] +name = "pystac-ext-datacube" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/bc/77eb864cc837ce95c36b67b94f9b102ab6ecc6889a6c131a382f6c5afd08/pystac_ext_datacube-2.2.0.tar.gz", hash = "sha256:a64643cb826c3f2f169c7497b5e5ba218f0a1ababbbd3bad04c57f99df3a67c7", size = 22016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/12/f988dea7251ba3bb089fa9012ebb459b1229b35da23eedf53a9a0e05faed/pystac_ext_datacube-2.2.0-py3-none-any.whl", hash = "sha256:823538db9751b6e7312a06ec9b6a74f98561830664f45ed43908bea73f624f16", size = 6824 }, +] + +[[package]] +name = "pystac-ext-eo" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/f3/b15b8919d6849b4c94ddef1f3dcf12a6c69d3674d9f67e62ced31483f43e/pystac_ext_eo-1.1.0.tar.gz", hash = "sha256:c599b1f4a470eceefb745b26f4dabea05661e843d26c8c59f0d7343b6ac9ab35", size = 21113 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/39/6bc20044e0513bb290a871aba05608b945f261d294c2cdc78207e98a1938/pystac_ext_eo-1.1.0-py3-none-any.whl", hash = "sha256:ca367465d37bc65d9a4c0cd54c4a04a45deb9904d55ae2c1f37d11734cc38ca0", size = 7366 }, +] + +[[package]] +name = "pystac-ext-file" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/37/e8a111a9ba9547bd36a3a2cab3b6797115b57ed518d21b51d7447463ea5c/pystac_ext_file-2.1.0.tar.gz", hash = "sha256:93964df13550d0b016770774a6608728928f3a2c8d92ae03dc2f11bd76dbc6f0", size = 12979 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/e1/2d5b893323fdc7ca64e58464f6eea91158d0dcfd76a1463c4d9390fcf34b/pystac_ext_file-2.1.0-py3-none-any.whl", hash = "sha256:90b91c82155f763143de2daf1aec37dd0e7f98da7f39f6636a4ede590be9f322", size = 5485 }, +] + +[[package]] +name = "pystac-ext-grid" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/0f/a59e46a04e36668e9ae52da4493786f0a0af3513020551e784947ab9efe1/pystac_ext_grid-1.1.0.tar.gz", hash = "sha256:0b8855ff3ddb278bf6f2caf01bb857da50cf23bc322d0722f93b206b7f3673f6", size = 9086 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/a4/43d317a422528090320166a908f9d110384d67ac2f30353a4a331e990151/pystac_ext_grid-1.1.0-py3-none-any.whl", hash = "sha256:6c8c804a07b4c1fc9dc4058a16d4ec18d7715883a183555c826d312830018db1", size = 3319 }, +] + +[[package]] +name = "pystac-ext-item-assets" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/93/fd0d0251ac227b654dabffc15bafad69600c91edf0472d1bba48096cd1c5/pystac_ext_item_assets-1.0.0.tar.gz", hash = "sha256:63b063ae3b0c9508ad84aa06c85513fb2ca09f505ee2aed1a8a1f0c3a906d070", size = 3908 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/63/eca6602e084b1bd764fe0c7e6e5efa351bb6ad5432aaab2a3d56cb1fdbc9/pystac_ext_item_assets-1.0.0-py3-none-any.whl", hash = "sha256:4dd61fcaeb861f1bd0c77299d9e3332865bfded44e061206fc0bb9fd8ce8d156", size = 3418 }, +] + +[[package]] +name = "pystac-ext-label" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/e4/b3c010715ec522735f5c5393f685cadf55a687b47c9084fe4ae82bd9c41c/pystac_ext_label-1.0.1.tar.gz", hash = "sha256:34e52bbc79d46a5a0f76833ce0f656de65b425a41ca362e705be68430196abc7", size = 8339 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/f5/583b8f20f8c041fb3decb36ab4b5be703f64cc84883ef152373f9a075a99/pystac_ext_label-1.0.1-py3-none-any.whl", hash = "sha256:9b089b290ce953916cd087a86d108262cf74ca39d0f00e27af6eeaf1ab2be167", size = 7871 }, +] + +[[package]] +name = "pystac-ext-mgrs" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/d6/5f54dccb399f0246e12d5b2a9c1ca5269f1adcf993a3812ecf897663e004/pystac_ext_mgrs-1.0.0.tar.gz", hash = "sha256:31d79b288f2523640138aff1b12acd2b67d7a40b1822909a04700fb048861d11", size = 6610 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/c2/aa4c889ffbd5d95b9cbcb78163399feb51eae3968f387f87f26efef2bf59/pystac_ext_mgrs-1.0.0-py3-none-any.whl", hash = "sha256:4efe67b4dac4fb7c3057985a056e59275371c535d84c82d0a55f110f9144f9f0", size = 3849 }, +] + +[[package]] +name = "pystac-ext-mlm" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/5c/7b540355fc4be970f076047a222216f2af513870ebfca53c48242de5e078/pystac_ext_mlm-1.4.0.tar.gz", hash = "sha256:fdaf464e729071348b3921e908dbe3c2e1cce5d65153ee19995e2e7315e9edf9", size = 35919 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/65/a4f7b03201993bd647a3260d9b1663b1d0d28145d35bc69562334ef49a28/pystac_ext_mlm-1.4.0-py3-none-any.whl", hash = "sha256:69dac825477b7dd458ad5392aa72188377b267f267b6b28a60e883daed0ef252", size = 13599 }, +] + +[[package]] +name = "pystac-ext-pointcloud" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/51/cf14464aad24d1547dd0e5c06bcfba9627a0b0510d8ec147e17a7c90c2de/pystac_ext_pointcloud-1.0.0.tar.gz", hash = "sha256:92a4bc88fe6eb15ad27c75358b1dbf5bf40ded26df4cd6b8bfc16a4c9a838764", size = 12581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/e9/783c234f711661603c21c5c83c6cbb41efcb2cd0ca791cf27316498088b2/pystac_ext_pointcloud-1.0.0-py3-none-any.whl", hash = "sha256:3bc688b3da93dc0dbf91b357026eb7648ec3e49a3008003859648b80dfb55732", size = 6166 }, +] + +[[package]] +name = "pystac-ext-projection" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/55/2d2230a5bb55d9e954338e71c5fd469ff63097532f2b45fa219f607c075a/pystac_ext_projection-2.0.0.tar.gz", hash = "sha256:72517587636c3d0f325cf11dfa75e0431570c6a13305bf53d0f95b2548deec1f", size = 72074 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/27/cede1d2f621f4c399ee2434072bf5a8bba0e3b0e3369547664f343e0ed84/pystac_ext_projection-2.0.0-py3-none-any.whl", hash = "sha256:892e9852a1a81cf1be1b79e3ad52e9b11f780143d3a75d67cde3e4fd31ec83e4", size = 7114 }, +] + +[[package]] +name = "pystac-ext-raster" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/04/2459cd1a4b954fc3320594ef86e6f4379f15d0cf4a63259852fb4b4a9b5b/pystac_ext_raster-1.1.0.tar.gz", hash = "sha256:19dd7c993defe450fa90b3fd690f30a6191b701fc704f1626748bdb57d9da1ed", size = 30679 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/1e/9bced0383702b1ceb240a4aa4c32f0f4f76f6666325a7d35c3e499ef1104/pystac_ext_raster-1.1.0-py3-none-any.whl", hash = "sha256:07c312ae956d70ccdb1da7af67fc92793c2546ca8e26ca384013ebf5c674b410", size = 6567 }, +] + +[[package]] +name = "pystac-ext-render" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/ba/e8711c8b46719f4d8e74fd73c5ae66fa5cd0b79e0dc7770d00bc1d14adcf/pystac_ext_render-2.0.0.tar.gz", hash = "sha256:ed53926d0af556c98d5f6bbfd86b8d02d635df24b70607f37f386cea7713b4f7", size = 9611 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/63/3162c536d3f3cacf627b7a74915dc90abb10cf3baa5ed9b28b3b92b5914c/pystac_ext_render-2.0.0-py3-none-any.whl", hash = "sha256:69c3a8307d9528b8ae5baadde76dae9e546c19c1f4210a57daf235f8e9d9e427", size = 5020 }, +] + +[[package]] +name = "pystac-ext-sar" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/30/e229a96be9e03157c92eb7f3bfafbd84702372bd1a7ed23e734094c48ead/pystac_ext_sar-1.0.0.tar.gz", hash = "sha256:0d49130fc55152f039f22ac843df35e1c5b2a1a667a4ee91d4a9c5b3ecd379ca", size = 11122 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/75/8d62c8d697740c01c01d707446b53b332a466d6caf174187588000daa9a8/pystac_ext_sar-1.0.0-py3-none-any.whl", hash = "sha256:4b73d97e4c1cdba1c1d6cc1d69181fed31eefb0ec164500b636d6a8d8bca271c", size = 6262 }, +] + +[[package]] +name = "pystac-ext-sat" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/d7/0492bae1d417dc4990748183a950fd1e6acbc202a2b11bbb73cc75a37f34/pystac_ext_sat-1.0.0.tar.gz", hash = "sha256:2163b31d3044f9c2965abd9cb4144482813068ff9f99107a240eed06cf78bace", size = 9875 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/ca/20d80d50b5108f649383568d3c103e9cc0cf12e53f283562f9dfc1774dd3/pystac_ext_sat-1.0.0-py3-none-any.whl", hash = "sha256:ee951eee24b47c576863bbf5890957b7094a6a2bb0ef8fc967a4d327dff571fd", size = 4576 }, +] + +[[package]] +name = "pystac-ext-scientific" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/f6/1bf1ec97be09266a258f53620020573d8321956e390361daa81d0905b9ae/pystac_ext_scientific-1.0.0.tar.gz", hash = "sha256:b55128b7b2281c28dcfc3c00c008fe4391c84b47a7572c4770766f1e96eec5b5", size = 12764 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/f7/cde7d45905f4f15449f142c7d6f81de488b3920bf3fb063b2382d1ffefba/pystac_ext_scientific-1.0.0-py3-none-any.whl", hash = "sha256:1f78efcd34a4b4344c70d80ddcde70785815e738455e3c1d35b5e843ca671207", size = 5174 }, +] + +[[package]] +name = "pystac-ext-storage" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/dc/57f0dfa715f6bdc0de1830359969ffb019424838c875f899c011fdbf2af0/pystac_ext_storage-2.0.0.tar.gz", hash = "sha256:58b28988e49a188cc8ee09e8bc88440aec9985f0d3ccd295b6209215896e4250", size = 13063 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/af/5aaa33cf912da18e178c7bc15633c3c9f1cc9a22efcad7f78964136e4e14/pystac_ext_storage-2.0.0-py3-none-any.whl", hash = "sha256:8f1d809a8f5efebe051450fcfce3ae13ef4c7ad9133b43b2a1f4df69e74645c2", size = 7353 }, +] + +[[package]] +name = "pystac-ext-table" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/06/d4ad9edaf4bae2922cf86a6ac216375d530fa70e4f13bff28b52c595a2d1/pystac_ext_table-1.2.0.tar.gz", hash = "sha256:c7035db662272a84f1149e7d694c8409f85093cc056cdc655c06e9b9f5cefe37", size = 8003 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/52/6209f65f1b4f966525486b7eb39f82f1cd0f8aae592e52c679b520e969ea/pystac_ext_table-1.2.0-py3-none-any.whl", hash = "sha256:461e8475eaee81190c36db818150e0b24d14d46b021f063a928ff6a0ee77a971", size = 4430 }, +] + +[[package]] +name = "pystac-ext-timestamps" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/74/97061e036f74c850b63450ab425f7c1aa2681582ce53b98ed4f7235acc7b/pystac_ext_timestamps-1.1.0.tar.gz", hash = "sha256:d78250e3ddc61b825348444ad05c8cff8c2aa1cd3d18155b880783ee880520d3", size = 8544 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/22/d0e9f1e46da156c34e070ba04ebca1bba67b4b60724118cfb98c0b83b368/pystac_ext_timestamps-1.1.0-py3-none-any.whl", hash = "sha256:17990ad4827bfd0798010d247fa2f3d770f78d80180579cbe63d8267fb3e8d39", size = 4252 }, +] + +[[package]] +name = "pystac-ext-version" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/48/0d67ffdc3c930cd64805e15603372f2a759d2ad453f31d979fefda637999/pystac_ext_version-1.2.0.tar.gz", hash = "sha256:aac23024e76cd64c9bec46a8b49f884f2e8c89cc3d0fe317f5f58dfaa56d1aa0", size = 12543 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/bb/c0a732f1827233e91200b4c14538e8cc4dafa9e843c46c048462212e2b72/pystac_ext_version-1.2.0-py3-none-any.whl", hash = "sha256:95ba628abe934098356654f2bd57423475d1cb59e2f49c44dd7e2ef5392efefd", size = 5366 }, +] + +[[package]] +name = "pystac-ext-view" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/1d/663184b0c94583ed2c3d2fbe1f1b3ab8da27ee7ff5695da2d0d42652e610/pystac_ext_view-1.0.0.tar.gz", hash = "sha256:cb677dcd49f9a62824087d150f01eea97fc24c577971edb60374c9e48e517311", size = 9698 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/1f/aab5f54ee091b47b6edf22dea97863c36996ca7886b32e8772374fcbb5e9/pystac_ext_view-1.0.0-py3-none-any.whl", hash = "sha256:3000615569d1826093a6b231778e7ddb1afb106dd516e8029a0083bfcd166d7d", size = 4479 }, +] + +[[package]] +name = "pystac-ext-xarray-assets" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pystac-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/a0/1bcb9ba80eb0e0a6cc4605520d831d7118863559f13f797f271430bad125/pystac_ext_xarray_assets-1.0.0.tar.gz", hash = "sha256:da4f4877c018d531b6b5c45f20bc64842f14587ae86bac8d2acf110804c773d1", size = 6703 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/cc/4f310e5acb0c59c8b3db417fc903a055dc01ac7e7f7e82c941304f30b4d9/pystac_ext_xarray_assets-1.0.0-py3-none-any.whl", hash = "sha256:a31e90e7e9bc5ae191e7449df28c39857c818e8c1cf2c09a2eceaa7c6e13241c", size = 3614 }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536 }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876 }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -262,6 +1849,15 @@ 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 }, ] +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101 }, +] + [[package]] name = "pytz" version = "2025.2" @@ -271,6 +1867,144 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "rasterio" +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "affine" }, + { name = "attrs" }, + { name = "certifi" }, + { name = "click" }, + { name = "click-plugins" }, + { name = "cligj" }, + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/19/ab4326e419b543da623ce4191f68e3f36a4d9adc64f3df5c78f044d8d9ca/rasterio-1.4.3.tar.gz", hash = "sha256:201f05dbc7c4739dacb2c78a1cf4e09c0b7265b0a4d16ccbd1753ce4f2af350a", size = 442990 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/f2/b7417292ceace70d815760f7e41fe5b0244ebff78ede11b1ffa9ca01c370/rasterio-1.4.3-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:e703e4b2c74c678786d5d110a3f30e26f3acfd65f09ccf35f69683a532f7a772", size = 21514543 }, + { url = "https://files.pythonhosted.org/packages/b2/ea/e21010457847b26bb4aea3983e9b44afbcefef07defc5e9a3285a8fe2f0c/rasterio-1.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:38a126f8dbf405cd3450b5bd10c6cc493a2e1be4cf83442d26f5e4f412372d36", size = 18735924 }, + { url = "https://files.pythonhosted.org/packages/67/72/331727423b28fffdfd8bf18bdc55c18d374c0fefd2dde390cd833f8f4477/rasterio-1.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e90c2c300294265c16becc9822337ded0f01fb8664500b4d77890d633d8cd0e", size = 22251721 }, + { url = "https://files.pythonhosted.org/packages/be/cc/453816b489af94b9a243eda889865973d518989ba6923b2381f6d6722b43/rasterio-1.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:a962ad4c29feaf38b1d7a94389313127de3646a5b9b734fbf9a04e16051a27ff", size = 25430154 }, + { url = "https://files.pythonhosted.org/packages/2e/e0/718c06b825d1f62077913e5bff1e70b71ac673718b135d55a0256d88d4ba/rasterio-1.4.3-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:5d4fcb635379b3d7b2f5e944c153849e3d27e93f35ad73ad4d3f0b8a580f0c8e", size = 21532284 }, + { url = "https://files.pythonhosted.org/packages/bb/a8/3b6b11923300d6835453d1157fabb518338067a67366c5c52e9df9a2314f/rasterio-1.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:98a9c89eade8c779e8ac1e525269faaa18c6b9818fc3c72cfc4627df71c66d0d", size = 18729960 }, + { url = "https://files.pythonhosted.org/packages/05/19/94d6c66184c7d0f9374330c714f62c147dbb53eda9efdcc8fc6e2ac454c5/rasterio-1.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9bab1a0bb22b8bed1db34b5258db93d790ed4e61ef21ac055a7c6933c8d5e84", size = 22237518 }, + { url = "https://files.pythonhosted.org/packages/df/88/9db5f49ebfdd9c12365e4cac76c34ccb1a642b1c8cbab4124b3c681495de/rasterio-1.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1839960e2f3057a6daa323ccf67b330f8f2f0dbd4a50cc7031e88e649301c5c0", size = 25424949 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-cache" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cattrs" }, + { name = "platformdirs" }, + { name = "requests" }, + { name = "url-normalize" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1", size = 3018209 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603", size = 61425 }, +] + +[[package]] +name = "rioxarray" +version = "0.18.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "pyproj" }, + { name = "rasterio" }, + { name = "xarray" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/29/6a97e32d53190ce892e4d849615d3fc4b5eaa802b7ae9fe5ed39998f0b8c/rioxarray-0.18.2.tar.gz", hash = "sha256:9237b9f3c26957823dc76f3c972c0f16c2ab178c930e81a4629716b425818ab6", size = 54485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/b0/2c74f302512fbd24d68fbba0ec6b650b33ef83e398daeb0a2bb1a4cd641c/rioxarray-0.18.2-py3-none-any.whl", hash = "sha256:f351c15fc682081ac2cd2c8db367ef0a7ed5acdea29b9e43a6d7bc2ebc5ec6e5", size = 61943 }, +] + +[[package]] +name = "ruff" +version = "0.16.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/b3/3213589383f8f1b3938781bd1278713f6d18621a14992b3e81fefb8a5ef9/ruff-0.16.3.tar.gz", hash = "sha256:e76d33a347661a84b5be6d043d0347fdc745dfdcf825a8f4fed64b5e26eebdf2", size = 4891904 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/96/493770daebd68c0a67f1549fdf519f53be51fc435186c0585bcc272fd76c/ruff-0.16.3-py3-none-linux_armv6l.whl", hash = "sha256:0c5710e247a58a4521e66e124ba9a74655b414f61ba3a2e9e3811e11098f48f7", size = 10902799 }, + { url = "https://files.pythonhosted.org/packages/5e/e6/2becf3942fddc29a29b8df47691d456fb1085391a694f74d84513251418c/ruff-0.16.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fe155130631a2471fd2e14a7a664a4dfbd7194b8229c3d7b2a40b21178639081", size = 11135539 }, + { url = "https://files.pythonhosted.org/packages/3e/1e/4b8b72f0d006dbf19326aa99f9ca0ee2ff374187c4d301cf529a51aa06fe/ruff-0.16.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e2ed719e14aa64d895c2ee922594a90a43c861a93f0575a95ff8c47cdbd13eb9", size = 10475095 }, + { url = "https://files.pythonhosted.org/packages/92/32/2201fa49ba1f6c101ee321e83f051ac7a4b8d07b0ef6b4d3f2772b302275/ruff-0.16.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e0b1da805eb043654645d74d5de1e5ce2edc686e40790d2b86f56d71cc06a84", size = 10668771 }, + { url = "https://files.pythonhosted.org/packages/c3/66/4afc5c8363bd04d45effce1b7c8713ca037d7a6740b7451a2403a6e3a972/ruff-0.16.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a37bdea0bbe21780f590bf437d6412c8c4e1b6cd010f91a65c2c40c5e5f5f870", size = 10699568 }, + { url = "https://files.pythonhosted.org/packages/53/fd/c67d246bf36bf1698551c56de39e95cd07f70e64433e0098e6267d77061b/ruff-0.16.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09571e6d1288ed9be475207a3ac04ada404f1cd898104be0f6ab8d7df438575b", size = 11499365 }, + { url = "https://files.pythonhosted.org/packages/67/0b/00ecbceb99a263af7b12f6f05ac3c92bc47b905e91adc3f207a836e3bc01/ruff-0.16.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c18c5a101eb540010638cc1ff3c84944d3adb3df62b8d98ca8f22ba484d3413", size = 12311728 }, + { url = "https://files.pythonhosted.org/packages/54/b2/b7b3bb54f4d3f7db504e476ad4ab8de530dceebe2c061384b2757ee419e8/ruff-0.16.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8457c44f15033c85ddbb77b15d451df9e24e4bd03b628396dd3610cedc3b8f82", size = 11699896 }, + { url = "https://files.pythonhosted.org/packages/c7/30/4c468429ac195addc5ee1b717b6ab1b66632786737ca3b2ed3443fb0c26a/ruff-0.16.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:294b95c4ae0cda9388525c2047778aa758d6b8d4bb876fd4e9eaa3ebc92343eb", size = 11058736 }, + { url = "https://files.pythonhosted.org/packages/43/67/7a113cdaddf24b64d7f75b1242a99d04c82fcef4f6921fdbb832beaffb5f/ruff-0.16.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:3d0c7c40c87c2a820509c31ba007968da6e1306468c067b2d82fbfdbcd0e8474", size = 11586911 }, + { url = "https://files.pythonhosted.org/packages/f1/c1/2e66f24c0f3ead25a5e660111778685e505e5da353c82802bf49f0cbe7b9/ruff-0.16.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:9f738c0fdfa8eed0b2ce7fb27ee7258208a92a68d7949e62aa15164bc7b389da", size = 10954265 }, + { url = "https://files.pythonhosted.org/packages/c2/ba/4cee23bf52cba9a058d3726de623624daf50ef9638868edd86f4126157f6/ruff-0.16.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fb785f0be25abe69d320415cd4f833b59e17ba7613d9ba6a958023b6bceb0a50", size = 10709886 }, + { url = "https://files.pythonhosted.org/packages/82/df/7da7194fa5d9dc0a285f7e6fa5a4722e7c63faac0b45b614ded9314363a1/ruff-0.16.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c5536e3acfbf9563085aa2be7b13c629c3077e902afc5b941ac44024dbb9f506", size = 11210392 }, + { url = "https://files.pythonhosted.org/packages/35/85/7795f6e817af050e7517bf3e7aa9b061cce70ef33d280aad902c956c1ecf/ruff-0.16.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a2d85c02f9b8e165d85e6779184d38c4132de12603dab59c51c28e22584f9e4d", size = 11626910 }, + { url = "https://files.pythonhosted.org/packages/78/9b/475b927cf27a5cbbda3c7bafb69ed6ff77e1d7923d5d85f17c2749d7ae32/ruff-0.16.3-py3-none-win32.whl", hash = "sha256:388cdf2166642bd9b13d52b5932d3170f34f8abed7e8d9a855f1d84b83645a0a", size = 10931415 }, + { url = "https://files.pythonhosted.org/packages/b2/99/e2a2bfc4fbf0a1e8a916bc9ebe6fe6c58cc34c28e0ffc6ce281d572d1c2e/ruff-0.16.3-py3-none-win_amd64.whl", hash = "sha256:e80a7d69ca2a6d1c4d352ec91458cdca6e56c83cdbcabd93e4abe1e53591d948", size = 11445993 }, + { url = "https://files.pythonhosted.org/packages/69/3e/4132e539aed78c148854d4997a2685b0ed4dc4e87110b59ce528564e184e/ruff-0.16.3-py3-none-win_arm64.whl", hash = "sha256:b8ca152da82c1acc1fa8d5874b15951935f0eef46f10e6954c83859011b6178a", size = 11399302 }, +] + [[package]] name = "s3transfer" version = "0.11.4" @@ -283,6 +2017,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/86/62/8d3fc3ec6640161a5649b2cddbbf2b9fa39c92541225b33f117c37c5a2eb/s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d", size = 84412 }, ] +[[package]] +name = "scipy" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, + { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, + { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, + { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, + { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, + { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, + { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, + { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, + { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, + { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, + { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, + { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, + { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, + { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, + { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, + { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, + { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, + { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, + { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, + { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, + { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, + { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, + { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, + { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, + { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, +] + [[package]] name = "shapely" version = "2.1.0" @@ -327,6 +2099,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] +[[package]] +name = "toolz" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383 }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, +] + [[package]] name = "tzdata" version = "2025.2" @@ -336,6 +2126,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] +[[package]] +name = "url-normalize" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/94/d79b960d66b933492f7dfbec8db799fa7033e7fbc98090f46fa581ca3a94/url_normalize-2.2.0.tar.gz", hash = "sha256:0f0b7cc95a95d2d9b0c9a51d47a326559bc05bd1558accdada21bb0c9504de85", size = 18201 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/ce/73b35517cf49836ed8c7ca74c7da7808feca367788986f38e5e63f93e6cf/url_normalize-2.2.0-py3-none-any.whl", hash = "sha256:3fe387b62f5b66db94304bc703bf6d34de52aaa9590d4d1f1bbdf305a1430064", size = 14234 }, +] + [[package]] name = "urllib3" version = "2.3.0" @@ -344,3 +2146,65 @@ sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf wheels = [ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] + +[[package]] +name = "xarray" +version = "2025.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/c4/6931c37cd418658d596e78794bdd1bcb67efec0aac3cdb720e37e03c1ea1/xarray-2025.3.1.tar.gz", hash = "sha256:0252c96a73528b29d1ed7f0ab28d928d2ec00ad809e47369803b184dece1e447", size = 3300778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/fd/973deafd9f87085136a58573600646b408ae7af47859f35151f0d83d5090/xarray-2025.3.1-py3-none-any.whl", hash = "sha256:3404e313930c226db70a945377441ea3c957225d8ba2d429e764c099bb91a546", size = 1279327 }, +] + +[[package]] +name = "yarl" +version = "1.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/4d/8a8f57caccce49573e567744926f88c6ab3ca0b47a257806d1cf88584c5f/yarl-1.19.0.tar.gz", hash = "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", size = 184396 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/70/44ef8f69d61cb5123167a4dda87f6c739a833fbdb2ed52960b4e8409d65c/yarl-1.19.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", size = 146855 }, + { url = "https://files.pythonhosted.org/packages/c3/94/38c14d6c8217cc818647689f2dd647b976ced8fea08d0ac84e3c8168252b/yarl-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", size = 97523 }, + { url = "https://files.pythonhosted.org/packages/35/a5/43a613586a6255105c4655a911c307ef3420e49e540d6ae2c5829863fb25/yarl-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", size = 95540 }, + { url = "https://files.pythonhosted.org/packages/d4/60/ed26049f4a8b06ebfa6d5f3cb6a51b152fd57081aa818b6497474f65a631/yarl-1.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", size = 344386 }, + { url = "https://files.pythonhosted.org/packages/49/a6/b84899cab411f49af5986cfb44b514040788d81c8084f5811e6a7c0f1ce6/yarl-1.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", size = 338889 }, + { url = "https://files.pythonhosted.org/packages/cc/ce/0704f7166a781b1f81bdd45c4f49eadbae0230ebd35b9ec7cd7769d3a6ff/yarl-1.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", size = 353107 }, + { url = "https://files.pythonhosted.org/packages/75/e5/0ecd6f2a9cc4264c16d8dfb0d3d71ba8d03cb58f3bcd42b1df4358331189/yarl-1.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", size = 353128 }, + { url = "https://files.pythonhosted.org/packages/ad/c7/cd0fd1de581f1c2e8f996e704c9fd979e00106f18eebd91b0173cf1a13c6/yarl-1.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", size = 349107 }, + { url = "https://files.pythonhosted.org/packages/e6/34/ba3e5a20bd1d6a09034fc7985aaf1309976f2a7a5aefd093c9e56f6e1e0c/yarl-1.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", size = 335144 }, + { url = "https://files.pythonhosted.org/packages/1e/98/d9b7beb932fade015906efe0980aa7d522b8f93cf5ebf1082e74faa314b7/yarl-1.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", size = 360795 }, + { url = "https://files.pythonhosted.org/packages/9a/11/70b8770039cc54af5948970591517a1e1d093df3f04f328c655c9a0fefb7/yarl-1.19.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", size = 360140 }, + { url = "https://files.pythonhosted.org/packages/d4/67/708e3e36fafc4d9d96b4eecc6c8b9f37c8ad50df8a16c7a1d5ba9df53050/yarl-1.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", size = 364431 }, + { url = "https://files.pythonhosted.org/packages/c3/8b/937fbbcc895553a7e16fcd86ae4e0724c6ac9468237ad8e7c29cc3b1c9d9/yarl-1.19.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", size = 373832 }, + { url = "https://files.pythonhosted.org/packages/f8/ca/288ddc2230c9b6647fe907504f1119adb41252ac533eb564d3fc73511215/yarl-1.19.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", size = 378122 }, + { url = "https://files.pythonhosted.org/packages/4f/5a/79e1ef31d14968fbfc0ecec70a6683b574890d9c7550c376dd6d40de7754/yarl-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", size = 375178 }, + { url = "https://files.pythonhosted.org/packages/95/38/9b0e56bf14026c3f550ad6425679f6d1a2f4821d70767f39d6f4c56a0820/yarl-1.19.0-cp312-cp312-win32.whl", hash = "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", size = 86172 }, + { url = "https://files.pythonhosted.org/packages/b3/96/5c2f3987c4bb4e5cdebea3caf99a45946b13a9516f849c02222203d99860/yarl-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", size = 92617 }, + { url = "https://files.pythonhosted.org/packages/cd/a7/222144efa2f4a47363a5fee27d8a1d24851283b5a7f628890805fe7f7a66/yarl-1.19.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", size = 144789 }, + { url = "https://files.pythonhosted.org/packages/72/4f/3ee8de3f94baa33c0716260b0048b1fd5306f104b3efc6e1713693e7063e/yarl-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", size = 96685 }, + { url = "https://files.pythonhosted.org/packages/3e/7c/fbeebf875c1ededd872d6fefabd8a8526ef8aba6e9e8bcdf230d895d487b/yarl-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", size = 94307 }, + { url = "https://files.pythonhosted.org/packages/f3/ff/b7a9c1d7df37e594b43b7a8030e228ccd4ce361eeff24a92b17fe210e57d/yarl-1.19.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", size = 342811 }, + { url = "https://files.pythonhosted.org/packages/79/e2/9e092876b2156c1d386e4864e85eba541ccabf2b9dcc47da64624bad0cc9/yarl-1.19.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", size = 336928 }, + { url = "https://files.pythonhosted.org/packages/71/24/648d99c134f2e14fc01ba790ad36ab56815e00069e60a12a4af893448b83/yarl-1.19.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", size = 351021 }, + { url = "https://files.pythonhosted.org/packages/0c/ee/7278d475784d407d1990a5939722e66a0fef057046fb5f1721f0a6eb156c/yarl-1.19.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", size = 354454 }, + { url = "https://files.pythonhosted.org/packages/15/ae/242546114e052a7de21a75bd7d4860266439f90bbc21c5e4dd696866d91d/yarl-1.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", size = 347594 }, + { url = "https://files.pythonhosted.org/packages/46/2c/35f4347f76ea4c986e9c1f774b085f489b3a1bf1503c67a4dfc5d8e68e92/yarl-1.19.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", size = 334113 }, + { url = "https://files.pythonhosted.org/packages/20/89/3086bc8ec8d7bd505531c51056452d7ae6af906d29c427374f1170ac1938/yarl-1.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", size = 361037 }, + { url = "https://files.pythonhosted.org/packages/a1/5b/2c9765524a70d1c51922b41c91caa30c8094a416734349166e1a3d8de055/yarl-1.19.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", size = 361025 }, + { url = "https://files.pythonhosted.org/packages/ca/f8/c4a190bcc3cd98fb428d1dd31519e58004153dc7f2acd1236ecae54e3433/yarl-1.19.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", size = 364397 }, + { url = "https://files.pythonhosted.org/packages/6b/fb/f65b1347be8e12ac4e3e37a9bb880e6b9b604f252aaafd88e4879b1e9348/yarl-1.19.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", size = 374065 }, + { url = "https://files.pythonhosted.org/packages/1c/c5/102cc3b9baad1a76f9127453ad08e0f5bc9c996c18128b1e28fe03817d6c/yarl-1.19.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", size = 381341 }, + { url = "https://files.pythonhosted.org/packages/f7/ce/f5dc0439320dfe59fadab8cdd24ac324be19cf6ae4736422c7e2a510ddf3/yarl-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", size = 376552 }, + { url = "https://files.pythonhosted.org/packages/a9/4a/4833a134c76af987eff3ce8cb71e42932234120e6be061eb2555061e8844/yarl-1.19.0-cp313-cp313-win32.whl", hash = "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", size = 85878 }, + { url = "https://files.pythonhosted.org/packages/32/e9/59327daab3af8f79221638a8f0d11474d20f6a8fbc41e9da80c5ef69e688/yarl-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", size = 92448 }, + { url = "https://files.pythonhosted.org/packages/a4/06/ae25a353e8f032322df6f30d6bb1fc329773ee48e1a80a2196ccb8d1206b/yarl-1.19.0-py3-none-any.whl", hash = "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", size = 45990 }, +]