From d00838c959fb149ca4b118757ee8577c878eaf46 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 17 Apr 2025 14:38:41 +0200 Subject: [PATCH 01/59] Start with data_module_template --- .copier-answers.yml | 13 ++++++ .editorconfig | 22 +++++++++ .gitignore | 26 +++++++++++ .pre-commit-config.yaml | 47 +++++++++++++++++++ .readthedocs.yaml | 19 ++++++++ .snakemake-workflow-catalog.yml | 5 ++ AUTHORS | 7 +++ CITATION.cff | 11 +++++ INTERFACE.yaml | 20 ++++++++ LICENSE | 21 +++++++++ README.md | 41 ++++++++++++++++ config/README.md | 9 ++++ config/config.yaml | 2 + docs/index.md | 4 ++ mkdocs.yaml | 67 +++++++++++++++++++++++++++ mypy.ini | 2 + pixi.toml | 37 +++++++++++++++ ruff.toml | 28 +++++++++++ tests/clio_test.py | 55 ++++++++++++++++++++++ tests/integration/Snakefile | 36 ++++++++++++++ tests/integration/test_config.yaml | 4 ++ workflow/Snakefile | 35 ++++++++++++++ workflow/envs/shell.yaml | 6 +++ workflow/internal/config.schema.yaml | 41 ++++++++++++++++ workflow/internal/settings.yaml | 5 ++ workflow/profiles/default/config.yaml | 4 ++ workflow/rules/automatic.smk | 16 +++++++ workflow/rules/dummy.smk | 16 +++++++ workflow/scripts/download_cutout.py | 17 +++++++ workflow/scripts/dummy_script.py | 20 ++++++++ 30 files changed, 636 insertions(+) create mode 100644 .copier-answers.yml create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 .readthedocs.yaml create mode 100644 .snakemake-workflow-catalog.yml create mode 100644 AUTHORS create mode 100644 CITATION.cff create mode 100644 INTERFACE.yaml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 config/README.md create mode 100644 config/config.yaml create mode 100644 docs/index.md create mode 100644 mkdocs.yaml create mode 100644 mypy.ini create mode 100644 pixi.toml create mode 100644 ruff.toml create mode 100644 tests/clio_test.py create mode 100644 tests/integration/Snakefile create mode 100644 tests/integration/test_config.yaml create mode 100644 workflow/Snakefile create mode 100644 workflow/envs/shell.yaml create mode 100644 workflow/internal/config.schema.yaml create mode 100644 workflow/internal/settings.yaml create mode 100644 workflow/profiles/default/config.yaml create mode 100644 workflow/rules/automatic.smk create mode 100644 workflow/rules/dummy.smk create mode 100644 workflow/scripts/download_cutout.py create mode 100644 workflow/scripts/dummy_script.py diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000..289d09b --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,13 @@ +# Changes here will be overwritten by Copier +# DO NOT MANUALLY MODIFY THIS FILE +_commit: latest +_src_path: https://github.com/calliope-project/data-module-template.git +author_email: j.a.c.launer@tudelft.nl +author_family_name: Launer +author_given_name: Jann +github_org: calliope-project +license: MIT +module_description: This data module produces area potentials and capacity factors + for PV and wind at arbitrary spatial resolution. +module_long_name: 'PV and wind area potentials and capacity factors ' +module_short_name: module_pv_wind diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cd10f17 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +# Documentation: https://EditorConfig.org +# Inspired by Django .editorconfig file + +root = true + +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.{yaml,yml,.cff}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = true +indent_size = 4 + +[*.{diff,patch}] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21787f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +### OS-specific +.DS_Store + +### Editors +*~ +\#*\# +**/.vscode +.$* + +### Byte-compiled files +__pycache__ +*.pyc + +### Snakemake +.snakemake/ +gurobi.log + +### Notebooks +.ipynb_checkpoints + +# Ignore mutable folders +**/logs/* +**/resources/* +**/results/* +**/temp/* +**/tmp/* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..c29fc99 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,47 @@ +default_language_version: + python: python3 + +repos: + # Generic 'file quality' testing + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + # Machine-friendliness + - id: trailing-whitespace + - id: end-of-file-fixer + # Repo quality + - id: check-added-large-files + args: [--enforce-all] + - id: forbid-submodules + - id: check-case-conflict + - id: check-illegal-windows-names + - id: check-merge-conflict + - id: debug-statements + # Detect config. file issues + - id: check-json + - id: check-yaml + args: [--unsafe] + + # Python file formatting + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.9.6 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + + # Snakemake file formatting + - repo: https://github.com/snakemake/snakefmt + rev: v0.10.2 + hooks: + - id: snakefmt + + # Spelling + - repo: https://github.com/codespell-project/codespell + rev: v2.4.1 + hooks: + - id: codespell + files: .*\.(py|smk|md)$|^Snakefile$ + +ci: # https://pre-commit.ci/ + autoupdate_schedule: monthly diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..0480acd --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,19 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.12" + jobs: + install: + - asdf plugin add pixi + - asdf install pixi latest + - asdf global pixi latest + build: + html: + - pixi run build-docs -d $READTHEDOCS_OUTPUT/html + +mkdocs: + configuration: mkdocs.yaml diff --git a/.snakemake-workflow-catalog.yml b/.snakemake-workflow-catalog.yml new file mode 100644 index 0000000..2ef485a --- /dev/null +++ b/.snakemake-workflow-catalog.yml @@ -0,0 +1,5 @@ +# Integration with https://snakemake.github.io/snakemake-workflow-catalog/# +usage: + software-stack-deployment: + conda: true + report: false diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..a563815 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,7 @@ +This is the list of contributors for copyright purposes. + +This does not necessarily list everyone who has contributed to this software's +code or documentation. For a full contributor list, see: + + +Jann Launer, diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..daea93f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,11 @@ +# Citation file +# For more information, see: +# https://citation-file-format.github.io/ +cff-version: 1.2.0 +message: If you use this software or data produced by it, please cite it using the metadata from this file. +title: "clio - module_pv_wind: PV and wind area potentials and capacity factors " +repository: "https://github.com/calliope-project/module_pv_wind" +license: MIT +authors: + - given-names: Jann + family-names: Launer diff --git a/INTERFACE.yaml b/INTERFACE.yaml new file mode 100644 index 0000000..72104d4 --- /dev/null +++ b/INTERFACE.yaml @@ -0,0 +1,20 @@ +# Module Input-Output structure for automated doc. generation +resources: + user: + user_message.md: "Example file emulating external files requested from a user." + automatic: + dummy_readme.md: "Example file emulating downloads determined by internal settings." +results: + combined_text.md: "Example file emulating module results." + +# Wildcard example: +# resources: +# user: +# shapes_{resolution}.geojson: region geometries. +# automatic: +# technology_data.parquet: dataset with technology characteristics. +# results: +# '{resolution}/tech_capacity.parquet': description of output data. +# '{resolution}/results_image.png': description of output image. +# wildcards: +# resolution: description of the wildcard’s purpose. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..aa9b1bb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 AUTHORS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8545c1c --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# PV and wind area potentials and capacity factors + +This data module produces area potentials and capacity factors for PV and wind at arbitrary spatial resolution. + +A modular `snakemake` workflow built for [`clio`](https://clio.readthedocs.io/) data modules. + +## Using this module + +This module can be imported directly into any `snakemake` workflow. +Please consult the integration example in `tests/integration/Snakefile` for more information. + +## Development + +We use [`pixi`](https://pixi.sh/) as our package manager for development. +Once installed, run the following to clone this repo and install all dependencies. + +```shell +git clone git@github.com:calliope-project/module_pv_wind.git +cd module_pv_wind +pixi install --all +``` + +For testing, simply run: + +```shell +pixi run test +``` + +To view the documentation locally, use: + +```shell +pixi run serve-docs +``` + +To test a minimal example of a workflow using this module: + +```shell +pixi shell # activate this project's environment +cd tests/integration/ # navigate to the integration example +snakemake --use-conda # run the workflow! +``` diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000..2bd88fa --- /dev/null +++ b/config/README.md @@ -0,0 +1,9 @@ +# Configuration + +This workflow is part of the [clio project](https://clio.readthedocs.io/en/latest/). +Please consult our documentation for more details. +Other useful resources are: + +- `INTERFACE.yaml`: user input files (placed in `resources/user`) and module output files (placed in `results`). +- `workflow/internal/config.schema.yaml`: general configuration options. +- `tests/integration/`: a simple example of how to use this module. diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 0000000..8a3244d --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,2 @@ +# A minimal example of how to configure this module +dummy_text: This is a user input. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..9721b6b --- /dev/null +++ b/docs/index.md @@ -0,0 +1,4 @@ +# Home + +Welcome to the documentation of the `module_pv_wind` data module! +Please consult the [specification guidelines](./specification.md) and the [`clio` documentation](https://clio.readthedocs.io/) for more information. diff --git a/mkdocs.yaml b/mkdocs.yaml new file mode 100644 index 0000000..61fa02a --- /dev/null +++ b/mkdocs.yaml @@ -0,0 +1,67 @@ +# yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json + +site_name: PV and wind area potentials and capacity factors +site_url: https://module_pv_wind.readthedocs.io/ +repo_name: module_pv_wind +repo_url: https://github.com/calliope-project/module_pv_wind/ +edit_uri: edit/main/docs/ +theme: + name: material + features: + - navigation.footer + - navigation.instant + - navigation.tabs + - navigation.tabs.sticky + - navigation.indexes + - search.suggest + - search.highlight + - toc.follow + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + primary: red + accent: pink + # Palette toggle for light mode + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/weather-sunny + name: Switch to dark mode + primary: red + accent: pink + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/weather-night + name: Switch to system preference + primary: red + accent: pink +markdown_extensions: + - admonition + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.snippets: + check_paths: true + restrict_base_path: true + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:mermaid2.fence_mermaid_custom + - toc: + anchorlink: true +plugins: + - search +copyright: Copyright © since 2025 module_pv_wind contributors (MIT licensed) diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..d787271 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,2 @@ +[mypy] +disable_error_code = import-untyped diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 0000000..9c6658f --- /dev/null +++ b/pixi.toml @@ -0,0 +1,37 @@ +[project] +name = "module_pv_wind" +authors = ["See AUTHORS file"] +description = "This data module produces area potentials and capacity factors for PV and wind at arbitrary spatial resolution." +license = "MIT" +readme = "README.md" +channels = ["conda-forge", "bioconda"] +platforms = ["win-64", "linux-64", "osx-arm64"] +homepage = "https://clio.readthedocs.io/" + +[dependencies] +clio-tools = ">=2025.03.03" +conda = ">=25.0.0" +ipdb = ">=0.13.13" +ipykernel = ">=6.29.5" +mypy = ">=1.15.0" +pytest = ">=8.3.5" +python = ">=3.12" +ruff = ">=0.9.9" +snakefmt = ">=0.10.2" +snakemake-minimal = ">=8.29.0" + +[tasks] +test = {cmd = "pytest tests/"} + +[feature.docs.dependencies] +mkdocs-material = ">=9.6.7" + +[feature.docs.pypi-dependencies] +mkdocs-mermaid2-plugin = ">=1.2.1" + +[feature.docs.tasks] +serve-docs = {cmd = "mkdocs serve"} +build-docs = {cmd = "mkdocs build"} + +[environments] +docs = ["docs"] diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..97d5205 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,28 @@ +builtins = ["snakemake"] +target-version = "py312" + +[format] +skip-magic-trailing-comma = true + +[lint] +select = ["E", "F", "I", "Q", "W", "D", "PT", "UP"] +# line too long; Black will handle these +ignore = ["E501"] + +[lint.isort] +split-on-trailing-comma = false + +[lint.mccabe] +# Unlike Flake8, default to a complexity level of 10. +max-complexity = 10 + +# Ignore `E402` (import violations) and `F401` (unused imports) in all `__init__.py` files +[lint.per-file-ignores] +"__init__.py" = ["E402", "F401", "D104"] +"*.ipynb" = ["E402"] + +[lint.flake8-quotes] +docstring-quotes = "double" + +[lint.pydocstyle] +convention = "google" diff --git a/tests/clio_test.py b/tests/clio_test.py new file mode 100644 index 0000000..5fe141b --- /dev/null +++ b/tests/clio_test.py @@ -0,0 +1,55 @@ +"""Set of standard clio tests. + +DO NOT MANUALLY MODIFY THIS FILE! +It should be updated through our templating functions. +""" + +import subprocess +from pathlib import Path + +import pytest +from clio_tools.data_module import ModuleInterface + + +@pytest.fixture(scope="module") +def module_path(): + """Parent directory of the project.""" + return Path(__file__).parent.parent + + +def test_interface_file(module_path): + """The interfacing file should be correct.""" + assert ModuleInterface.from_yaml(module_path / "INTERFACE.yaml") + + +@pytest.mark.parametrize( + "file", + [ + "CITATION.cff", + "AUTHORS", + "INTERFACE.yaml", + "LICENSE", + "tests/integration/Snakefile", + ], +) +def test_standard_file_existance(module_path, file): + """Check that a minimal set of files used for clio automatic docs are present.""" + assert Path(module_path / file).exists() + + +def test_snakemake_all_failure(module_path): + """The snakemake 'all' rule should return an error by default.""" + process = subprocess.run( + "snakemake", shell=True, cwd=module_path, capture_output=True + ) + assert "INVALID (missing locally)" in str(process.stderr) + + +def test_snakemake_integration_testing(module_path): + """Run a light-weight test simulating someone using this module.""" + assert subprocess.run( + "snakemake --use-conda", + shell=True, + check=True, + cwd=module_path / "tests/integration", + ) diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile new file mode 100644 index 0000000..b1c1869 --- /dev/null +++ b/tests/integration/Snakefile @@ -0,0 +1,36 @@ +# Emulate a user configuring the module. +configfile: workflow.source_path("./test_config.yaml") + +# Emulate how another workflow might create inputs for this module. +rule create_external_input: + message: "Example of a rule external to your module." + output: + text_file = "results/module_pv_wind/resources/user/user_message.md" + run: + from pathlib import Path + from textwrap import dedent + text = dedent("""Modular workflows can be used by more than one project! + For example, this text comes from a file external to the module. + Try your best to make this workflow reusable so that others may benefit from your methods.""" + ) + file_path = Path(output.text_file) + with file_path.open("w") as f: + f.write(text) + +# Import the module and configure it. +# `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers +# `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. +module module_pv_wind: + snakefile: "../../workflow/Snakefile" + config: config["module_pv_wind"] + prefix: "results/module_pv_wind/" + +# rename all module rules with a prefix, to avoid naming conflicts. +use rule * from module_pv_wind as module_pv_wind_* + +# Request something from the module +rule all: + message: "A generic test case for your module." + default_target: True + input: + "results/module_pv_wind/results/combined_text.md" diff --git a/tests/integration/test_config.yaml b/tests/integration/test_config.yaml new file mode 100644 index 0000000..e8ff7ae --- /dev/null +++ b/tests/integration/test_config.yaml @@ -0,0 +1,4 @@ +module_pv_wind: + dummy_text: >- + Configuration values (like this one) are also external to the module! + This gives users a lot of flexibility in how they apply your methodology to solve their particular needs. diff --git a/workflow/Snakefile b/workflow/Snakefile new file mode 100644 index 0000000..fe03d49 --- /dev/null +++ b/workflow/Snakefile @@ -0,0 +1,35 @@ +import yaml + +from snakemake.utils import min_version, validate + +min_version("8.10") + + +# Load the example configuration. This will be overridden by users. +configfile: workflow.source_path("../config/config.yaml") + + +# Validate the configuration using the schema file. +validate(config, workflow.source_path("internal/config.schema.yaml")) + +# Load internal settings separately so users cannot modify them. +with open(workflow.source_path("internal/settings.yaml"), "r") as f: + internal = yaml.safe_load(f) + + +# Add all your includes here. +include: "rules/automatic.smk" +include: "rules/dummy.smk" + +rule all: + message: + "ERROR: Invalid `rule all:` call" + default_target: True + output: + "INVALID", + log: + stderr="logs/all.stderr", + conda: + "envs/shell.yaml" + shell: + 'echo "This workflow must be called as a snakemake module." > {log.stderr}' diff --git a/workflow/envs/shell.yaml b/workflow/envs/shell.yaml new file mode 100644 index 0000000..e4b351d --- /dev/null +++ b/workflow/envs/shell.yaml @@ -0,0 +1,6 @@ +name: shell +channels: + - conda-forge + - nodefaults +dependencies: + - curl=8.9.1 diff --git a/workflow/internal/config.schema.yaml b/workflow/internal/config.schema.yaml new file mode 100644 index 0000000..2bf094d --- /dev/null +++ b/workflow/internal/config.schema.yaml @@ -0,0 +1,41 @@ +$schema: "https://json-schema.org/draft/2020-12/schema" +description: "Schema for user-provided configuration files." +type: object +additionalProperties: false +properties: + dummy_text: + description: A template example. Should be deleted in real applications. + type: string + build_cutout: + description: "Build cutout for the model." + type: object + properties: + cutout_params: + description: "Parameters for the cutout." + type: object + properties: + module: + description: "Module for the cutout." + type: string + x: + description: "x min and max." + type: array + y: + description: "y min and max." + type: array + snapshots: + description: "Snapshots for the model." + type: object + properties: + start: + description: "Start and end of the snapshots." + type: string + end: + description: "Start and end of the snapshots." + type: string + inclusive: + description: "Start and end of the snapshots." + type: string + enum: + - left + - right \ No newline at end of file diff --git a/workflow/internal/settings.yaml b/workflow/internal/settings.yaml new file mode 100644 index 0000000..cbb8ff5 --- /dev/null +++ b/workflow/internal/settings.yaml @@ -0,0 +1,5 @@ +# Module settings that users cannot modify. +resources: + automatic: + # Links for automatically downloaded files + dummy_readme: "https://raw.githubusercontent.com/calliope-project/clio/refs/heads/main/README.md" diff --git a/workflow/profiles/default/config.yaml b/workflow/profiles/default/config.yaml new file mode 100644 index 0000000..2923460 --- /dev/null +++ b/workflow/profiles/default/config.yaml @@ -0,0 +1,4 @@ +# snakemake settings for module cross-compatibility +# DO NOT MODIFY +software-deployment-method: conda +use-conda: True diff --git a/workflow/rules/automatic.smk b/workflow/rules/automatic.smk new file mode 100644 index 0000000..0ebb236 --- /dev/null +++ b/workflow/rules/automatic.smk @@ -0,0 +1,16 @@ +"""Rules to used to download automatic resource files.""" + + +rule dummy_download: + message: + "Download the clio README file." + params: + url=internal["resources"]["automatic"]["dummy_readme"], + output: + readme="resources/automatic/dummy_readme.md", + log: + "logs/dummy_download.log", + conda: + "../envs/shell.yaml" + shell: + 'curl -sSLo {output.readme} "{params.url}"' diff --git a/workflow/rules/dummy.smk b/workflow/rules/dummy.smk new file mode 100644 index 0000000..af09f22 --- /dev/null +++ b/workflow/rules/dummy.smk @@ -0,0 +1,16 @@ +rule dummy_add_text: + message: + "Dummy rule combining user inputs and automatic downloads." + params: + config_text=config["dummy_text"], + input: + user_file="resources/user/user_message.md", + readme="resources/automatic/dummy_readme.md", + output: + combined="results/combined_text.md", + log: + "logs/dummy_add_text.log", + conda: + "../envs/shell.yaml" + script: + "../scripts/dummy_script.py" diff --git a/workflow/scripts/download_cutout.py b/workflow/scripts/download_cutout.py new file mode 100644 index 0000000..6d3ebcd --- /dev/null +++ b/workflow/scripts/download_cutout.py @@ -0,0 +1,17 @@ +import atlite +import pandas as pd + + +if __name__ == "__main__": + cutout_params = snakemake.config["build_cutout"]["cutout_params"] + + snapshots = pd.date_range(freq="h", **snakemake.config["snapshots"]) + time = [snapshots[0], snapshots[-1]] + cutout_params["time"] = slice(*cutout_params.get("time", time)) + + cutout_params["x"] = slice(*cutout_params["x"]) + cutout_params["y"] = slice(*cutout_params["y"]) + + features = cutout_params.pop("features", None) + cutout = atlite.Cutout(snakemake.output[0], **cutout_params) + cutout.prepare(features=features) diff --git a/workflow/scripts/dummy_script.py b/workflow/scripts/dummy_script.py new file mode 100644 index 0000000..2ae0049 --- /dev/null +++ b/workflow/scripts/dummy_script.py @@ -0,0 +1,20 @@ +"""A simple script to serve as an example. + +Should be deleted in real workflows. +""" + +import sys +from pathlib import Path +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + snakemake: Any +sys.stderr = open(snakemake.log[0], "w") + +config = snakemake.params.config_text +readme = Path(snakemake.input.readme).read_text() +user = Path(snakemake.input.user_file).read_text() + +output_text = "\n\n".join([readme, user, config]) + +Path(snakemake.output.combined).write_text(output_text) From 382e994934d3d656345bdb384c3d21b5e7136f99 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 17 Apr 2025 16:36:40 +0200 Subject: [PATCH 02/59] Set up rules, env and scripts for capacity factors --- workflow/Snakefile | 4 +- workflow/envs/atlite.yaml | 10 +++++ workflow/rules/capacity_factors.smk | 39 +++++++++++++++++++ .../scripts/prepare_capacityfactors_pv.py | 36 +++++++++++++++++ .../scripts/prepare_capacityfactors_wind.py | 36 +++++++++++++++++ 5 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 workflow/envs/atlite.yaml create mode 100644 workflow/rules/capacity_factors.smk create mode 100644 workflow/scripts/prepare_capacityfactors_pv.py create mode 100644 workflow/scripts/prepare_capacityfactors_wind.py diff --git a/workflow/Snakefile b/workflow/Snakefile index fe03d49..7176515 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -18,8 +18,8 @@ with open(workflow.source_path("internal/settings.yaml"), "r") as f: # Add all your includes here. -include: "rules/automatic.smk" -include: "rules/dummy.smk" +include: "rules/capacity_factors.smk" + rule all: message: diff --git a/workflow/envs/atlite.yaml b/workflow/envs/atlite.yaml new file mode 100644 index 0000000..d8bcb9b --- /dev/null +++ b/workflow/envs/atlite.yaml @@ -0,0 +1,10 @@ +name: atlite +channels: + - conda-forge + - nodefaults +dependencies: + - pyyaml + - atlite + - rioxarray + - rasterio + - geopandas diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk new file mode 100644 index 0000000..3a13f35 --- /dev/null +++ b/workflow/rules/capacity_factors.smk @@ -0,0 +1,39 @@ +rule download_cutout: + output: + "results/cutout.nc", + conda: + "../envs/geo.yaml" + script: + "../scripts/download_cutout.py" + + +rule prepare_capacityfactors_wind: + input: + cutout=ancient("resources/user/era5.nc"), + layout="resources/user/layout_{tech}.tif", + spatial_units="resources/user/spatial_units/{resolution}.geojson", + tech_specs="resources/user/tech_specs/{tech}_{subtech}.yaml", + output: + "results/{resolution}/capacityfactors_{tech}_{subtech}.nc", + wildcard_constraints: + tech="wind_offshore|wind_onshore", + conda: + "../envs/atlite.yaml" + script: + "../scripts/prepare_capacityfactors_wind.py" + + +rule prepare_capacityfactors_pv: + input: + cutout=ancient("resources/user/era5.nc"), + layout="resources/user/layout_{tech}.tif", + spatial_units="resources/user/spatial_units/{resolution}.geojson", + tech_specs="resources/user/tech_specs/{tech}_{subtech}.yaml", + output: + "results/{resolution}/capacityfactors_{tech}_{subtech}.nc", + wildcard_constraints: + tech="pv_rooftop|pv_open_field", + conda: + "../envs/atlite.yaml" + script: + "../scripts/prepare_capacityfactors_pv.py" diff --git a/workflow/scripts/prepare_capacityfactors_pv.py b/workflow/scripts/prepare_capacityfactors_pv.py new file mode 100644 index 0000000..f87af69 --- /dev/null +++ b/workflow/scripts/prepare_capacityfactors_pv.py @@ -0,0 +1,36 @@ +"""Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" + +import atlite +import geopandas as gpd +import rasterio as rio +import rioxarray as rxr +import yaml + + +def read_yaml(filepath): + """Open a yaml file as python dictionary.""" + with open(filepath) as file: + return yaml.safe_load(file) + + +if __name__ == "__main__": + cutout = atlite.Cutout(snakemake.input.cutout) + layout = rxr.open_rasterio(snakemake.input.layout) + spatial_units = gpd.read_file(snakemake.input.spatial_units).set_index("id") + tech_specs = read_yaml(snakemake.input.tech_specs) + + # resample layout to the resolution of the cutout + match = ( + cutout.uniform_layout() + .rio.write_crs(cutout.crs) + .rio.write_transform(cutout.transform) + ) + layout_matched = layout.squeeze(drop=True) + layout_matched = layout_matched.rio.reproject_match( + match, resampling=rio.enums.Resampling.sum, nodata=0 + ) + + capacityfactors_pv = cutout.pv( + shapes=spatial_units, layout=layout_matched, **tech_specs + ) + capacityfactors_pv.to_netcdf(snakemake.output[0]) diff --git a/workflow/scripts/prepare_capacityfactors_wind.py b/workflow/scripts/prepare_capacityfactors_wind.py new file mode 100644 index 0000000..c38ea86 --- /dev/null +++ b/workflow/scripts/prepare_capacityfactors_wind.py @@ -0,0 +1,36 @@ +"""Prepare wind capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" + +import atlite +import geopandas as gpd +import rasterio as rio +import rioxarray as rxr +import yaml + + +def read_yaml(filepath): + """Open a yaml file as python dictionary.""" + with open(filepath) as file: + return yaml.safe_load(file) + + +if __name__ == "__main__": + cutout = atlite.Cutout(snakemake.input.cutout) + layout = rxr.open_rasterio(snakemake.input.layout) + spatial_units = gpd.read_file(snakemake.input.spatial_units).set_index("id") + tech_specs = read_yaml(snakemake.input.tech_specs) + + # resample layout to the resolution of the cutout + match = ( + cutout.uniform_layout() + .rio.write_crs(cutout.crs) + .rio.write_transform(cutout.transform) + ) + layout_matched = layout.squeeze(drop=True) + layout_matched = layout_matched.rio.reproject_match( + match, resampling=rio.enums.Resampling.sum, nodata=0 + ) + + capacityfactors_wind = cutout.wind( + layout=layout_matched, shapes=spatial_units, **tech_specs + ) + capacityfactors_wind.to_netcdf(snakemake.output[0]) From 8995967c86d87a621cb2ddc342200ec878cb8fd7 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 18 Jun 2025 10:33:54 +0200 Subject: [PATCH 03/59] Delete dummy rule --- workflow/rules/automatic.smk | 15 --------------- workflow/rules/dummy.smk | 16 ---------------- workflow/scripts/dummy_script.py | 20 -------------------- 3 files changed, 51 deletions(-) delete mode 100644 workflow/rules/dummy.smk delete mode 100644 workflow/scripts/dummy_script.py diff --git a/workflow/rules/automatic.smk b/workflow/rules/automatic.smk index 0ebb236..6ad43f0 100644 --- a/workflow/rules/automatic.smk +++ b/workflow/rules/automatic.smk @@ -1,16 +1 @@ """Rules to used to download automatic resource files.""" - - -rule dummy_download: - message: - "Download the clio README file." - params: - url=internal["resources"]["automatic"]["dummy_readme"], - output: - readme="resources/automatic/dummy_readme.md", - log: - "logs/dummy_download.log", - conda: - "../envs/shell.yaml" - shell: - 'curl -sSLo {output.readme} "{params.url}"' diff --git a/workflow/rules/dummy.smk b/workflow/rules/dummy.smk deleted file mode 100644 index af09f22..0000000 --- a/workflow/rules/dummy.smk +++ /dev/null @@ -1,16 +0,0 @@ -rule dummy_add_text: - message: - "Dummy rule combining user inputs and automatic downloads." - params: - config_text=config["dummy_text"], - input: - user_file="resources/user/user_message.md", - readme="resources/automatic/dummy_readme.md", - output: - combined="results/combined_text.md", - log: - "logs/dummy_add_text.log", - conda: - "../envs/shell.yaml" - script: - "../scripts/dummy_script.py" diff --git a/workflow/scripts/dummy_script.py b/workflow/scripts/dummy_script.py deleted file mode 100644 index 2ae0049..0000000 --- a/workflow/scripts/dummy_script.py +++ /dev/null @@ -1,20 +0,0 @@ -"""A simple script to serve as an example. - -Should be deleted in real workflows. -""" - -import sys -from pathlib import Path -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - snakemake: Any -sys.stderr = open(snakemake.log[0], "w") - -config = snakemake.params.config_text -readme = Path(snakemake.input.readme).read_text() -user = Path(snakemake.input.user_file).read_text() - -output_text = "\n\n".join([readme, user, config]) - -Path(snakemake.output.combined).write_text(output_text) From 393d8f805e0dbf21b3ef661944385c6e56fa5bcc Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 18 Jun 2025 10:34:30 +0200 Subject: [PATCH 04/59] Set first column of spatial units as index --- workflow/scripts/prepare_capacityfactors_pv.py | 3 ++- workflow/scripts/prepare_capacityfactors_wind.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/workflow/scripts/prepare_capacityfactors_pv.py b/workflow/scripts/prepare_capacityfactors_pv.py index f87af69..fa72f06 100644 --- a/workflow/scripts/prepare_capacityfactors_pv.py +++ b/workflow/scripts/prepare_capacityfactors_pv.py @@ -16,7 +16,8 @@ def read_yaml(filepath): if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout) layout = rxr.open_rasterio(snakemake.input.layout) - spatial_units = gpd.read_file(snakemake.input.spatial_units).set_index("id") + spatial_units = gpd.read_file(snakemake.input.spatial_units) + spatial_units = spatial_units.set_index(spatial_units.columns[0]) tech_specs = read_yaml(snakemake.input.tech_specs) # resample layout to the resolution of the cutout diff --git a/workflow/scripts/prepare_capacityfactors_wind.py b/workflow/scripts/prepare_capacityfactors_wind.py index c38ea86..4a2925d 100644 --- a/workflow/scripts/prepare_capacityfactors_wind.py +++ b/workflow/scripts/prepare_capacityfactors_wind.py @@ -16,7 +16,8 @@ def read_yaml(filepath): if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout) layout = rxr.open_rasterio(snakemake.input.layout) - spatial_units = gpd.read_file(snakemake.input.spatial_units).set_index("id") + spatial_units = gpd.read_file(snakemake.input.spatial_units) + spatial_units = spatial_units.set_index(spatial_units.columns[0]) tech_specs = read_yaml(snakemake.input.tech_specs) # resample layout to the resolution of the cutout @@ -31,6 +32,6 @@ def read_yaml(filepath): ) capacityfactors_wind = cutout.wind( - layout=layout_matched, shapes=spatial_units, **tech_specs + shapes=spatial_units, layout=layout_matched, **tech_specs ) capacityfactors_wind.to_netcdf(snakemake.output[0]) From 7f6689d42bbcf94e808a1ad67832fbab3a46c03a Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:50:15 +0200 Subject: [PATCH 05/59] Adapt rule's wildcards --- workflow/rules/capacity_factors.smk | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 3a13f35..068224f 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -1,6 +1,6 @@ rule download_cutout: output: - "results/cutout.nc", + "results/cutout_era5_download.nc", conda: "../envs/geo.yaml" script: @@ -9,14 +9,12 @@ rule download_cutout: rule prepare_capacityfactors_wind: input: - cutout=ancient("resources/user/era5.nc"), - layout="resources/user/layout_{tech}.tif", - spatial_units="resources/user/spatial_units/{resolution}.geojson", - tech_specs="resources/user/tech_specs/{tech}_{subtech}.yaml", + cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again + tech_specs="resources/user/tech_specs_{name_tech}.yaml", + layout="resources/user/layout_{name_layout}.tif", + spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", output: - "results/{resolution}/capacityfactors_{tech}_{subtech}.nc", - wildcard_constraints: - tech="wind_offshore|wind_onshore", + "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", conda: "../envs/atlite.yaml" script: @@ -25,14 +23,12 @@ rule prepare_capacityfactors_wind: rule prepare_capacityfactors_pv: input: - cutout=ancient("resources/user/era5.nc"), - layout="resources/user/layout_{tech}.tif", - spatial_units="resources/user/spatial_units/{resolution}.geojson", - tech_specs="resources/user/tech_specs/{tech}_{subtech}.yaml", + cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again + tech_specs="resources/user/tech_specs_{name_tech}.yaml", + layout="resources/user/layout_{name_layout}.tif", + spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", output: - "results/{resolution}/capacityfactors_{tech}_{subtech}.nc", - wildcard_constraints: - tech="pv_rooftop|pv_open_field", + "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", conda: "../envs/atlite.yaml" script: From 62f7c95a7f871cc6775ba879c2d769cd3c44ab9d Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:27:57 +0200 Subject: [PATCH 06/59] Use the same script for wind and pv capacityfactors --- workflow/rules/capacity_factors.smk | 18 +-------- ...ctors_pv.py => prepare_capacityfactors.py} | 10 +++-- .../scripts/prepare_capacityfactors_wind.py | 37 ------------------- 3 files changed, 9 insertions(+), 56 deletions(-) rename workflow/scripts/{prepare_capacityfactors_pv.py => prepare_capacityfactors.py} (79%) delete mode 100644 workflow/scripts/prepare_capacityfactors_wind.py diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 068224f..b5b8e82 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -7,7 +7,7 @@ rule download_cutout: "../scripts/download_cutout.py" -rule prepare_capacityfactors_wind: +rule prepare_capacityfactors: input: cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again tech_specs="resources/user/tech_specs_{name_tech}.yaml", @@ -18,18 +18,4 @@ rule prepare_capacityfactors_wind: conda: "../envs/atlite.yaml" script: - "../scripts/prepare_capacityfactors_wind.py" - - -rule prepare_capacityfactors_pv: - input: - cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again - tech_specs="resources/user/tech_specs_{name_tech}.yaml", - layout="resources/user/layout_{name_layout}.tif", - spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", - output: - "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", - conda: - "../envs/atlite.yaml" - script: - "../scripts/prepare_capacityfactors_pv.py" + "../scripts/prepare_capacityfactors.py" diff --git a/workflow/scripts/prepare_capacityfactors_pv.py b/workflow/scripts/prepare_capacityfactors.py similarity index 79% rename from workflow/scripts/prepare_capacityfactors_pv.py rename to workflow/scripts/prepare_capacityfactors.py index fa72f06..99e0186 100644 --- a/workflow/scripts/prepare_capacityfactors_pv.py +++ b/workflow/scripts/prepare_capacityfactors.py @@ -31,7 +31,11 @@ def read_yaml(filepath): match, resampling=rio.enums.Resampling.sum, nodata=0 ) - capacityfactors_pv = cutout.pv( - shapes=spatial_units, layout=layout_matched, **tech_specs + tech = tech_specs["tech"] + specs = tech_specs["specs"] + get_capacityfactors = getattr(cutout, tech) + + capacityfactors = get_capacityfactors( + shapes=spatial_units, layout=layout_matched, **specs ) - capacityfactors_pv.to_netcdf(snakemake.output[0]) + capacityfactors.to_netcdf(snakemake.output[0]) diff --git a/workflow/scripts/prepare_capacityfactors_wind.py b/workflow/scripts/prepare_capacityfactors_wind.py deleted file mode 100644 index 4a2925d..0000000 --- a/workflow/scripts/prepare_capacityfactors_wind.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Prepare wind capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" - -import atlite -import geopandas as gpd -import rasterio as rio -import rioxarray as rxr -import yaml - - -def read_yaml(filepath): - """Open a yaml file as python dictionary.""" - with open(filepath) as file: - return yaml.safe_load(file) - - -if __name__ == "__main__": - cutout = atlite.Cutout(snakemake.input.cutout) - layout = rxr.open_rasterio(snakemake.input.layout) - spatial_units = gpd.read_file(snakemake.input.spatial_units) - spatial_units = spatial_units.set_index(spatial_units.columns[0]) - tech_specs = read_yaml(snakemake.input.tech_specs) - - # resample layout to the resolution of the cutout - match = ( - cutout.uniform_layout() - .rio.write_crs(cutout.crs) - .rio.write_transform(cutout.transform) - ) - layout_matched = layout.squeeze(drop=True) - layout_matched = layout_matched.rio.reproject_match( - match, resampling=rio.enums.Resampling.sum, nodata=0 - ) - - capacityfactors_wind = cutout.wind( - shapes=spatial_units, layout=layout_matched, **tech_specs - ) - capacityfactors_wind.to_netcdf(snakemake.output[0]) From 622861c442def3344713a3e82cdaff5f38403106 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:23:24 +0200 Subject: [PATCH 07/59] Allow use of point/raster layout --- config/config.yaml | 4 +- workflow/internal/config.schema.yaml | 45 +++-------- workflow/rules/capacity_factors.smk | 41 +++++++--- workflow/scripts/backend_atlite.py | 79 +++++++++++++++++++ .../prepare_capacityfactors_point_layout.py | 28 +++++++ ... prepare_capacityfactors_raster_layout.py} | 23 ++---- 6 files changed, 154 insertions(+), 66 deletions(-) create mode 100644 workflow/scripts/backend_atlite.py create mode 100644 workflow/scripts/prepare_capacityfactors_point_layout.py rename workflow/scripts/{prepare_capacityfactors.py => prepare_capacityfactors_raster_layout.py} (54%) diff --git a/config/config.yaml b/config/config.yaml index 8a3244d..05af49b 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,2 +1,4 @@ # A minimal example of how to configure this module -dummy_text: This is a user input. +backend: atlite +layout: raster # raster or point +aggregate: true diff --git a/workflow/internal/config.schema.yaml b/workflow/internal/config.schema.yaml index 2bf094d..d2f7777 100644 --- a/workflow/internal/config.schema.yaml +++ b/workflow/internal/config.schema.yaml @@ -3,39 +3,14 @@ description: "Schema for user-provided configuration files." type: object additionalProperties: false properties: - dummy_text: - description: A template example. Should be deleted in real applications. + backend: type: string - build_cutout: - description: "Build cutout for the model." - type: object - properties: - cutout_params: - description: "Parameters for the cutout." - type: object - properties: - module: - description: "Module for the cutout." - type: string - x: - description: "x min and max." - type: array - y: - description: "y min and max." - type: array - snapshots: - description: "Snapshots for the model." - type: object - properties: - start: - description: "Start and end of the snapshots." - type: string - end: - description: "Start and end of the snapshots." - type: string - inclusive: - description: "Start and end of the snapshots." - type: string - enum: - - left - - right \ No newline at end of file + enum: ["atlite"] + description: "The backend to use for the module." + layout: + type: string + enum: ["raster", "point"] + description: "The layout type, either raster or point." + aggregate: + type: boolean + description: "Whether to aggregate the data to spatial_units or not." diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index b5b8e82..a272287 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -7,15 +7,32 @@ rule download_cutout: "../scripts/download_cutout.py" -rule prepare_capacityfactors: - input: - cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again - tech_specs="resources/user/tech_specs_{name_tech}.yaml", - layout="resources/user/layout_{name_layout}.tif", - spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", - output: - "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", - conda: - "../envs/atlite.yaml" - script: - "../scripts/prepare_capacityfactors.py" +if config["layout"] == "raster": + + rule prepare_capacityfactors_raster_layout: + input: + cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again + tech_specs="resources/user/tech_specs_{name_tech}.yaml", + layout="resources/user/layout_{name_layout}.tif", + spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", + output: + "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + conda: + "../envs/atlite.yaml" + script: + "../scripts/prepare_capacityfactors_raster_layout.py" + +elif config["layout"] == "point": + + rule prepare_capacityfactors_point_layout: + input: + cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again + tech_specs="resources/user/tech_specs_{name_tech}.yaml", + layout="resources/user/layout_{name_layout}.csv", + spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", + output: + "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + conda: + "../envs/atlite.yaml" + script: + "../scripts/prepare_capacityfactors_point_layout.py" diff --git a/workflow/scripts/backend_atlite.py b/workflow/scripts/backend_atlite.py new file mode 100644 index 0000000..d2038eb --- /dev/null +++ b/workflow/scripts/backend_atlite.py @@ -0,0 +1,79 @@ +"""Backend for capacity factor calculations using atlite.""" + +import atlite +import geopandas as gpd +import rasterio as rio +import xarray as xr + + +def cf_agg_from_point_layout( + cutout: atlite.Cutout, + layout: xr.DataArray, + spatial_units: gpd.GeoDataFrame, + tech_specs: dict, +) -> xr.DataArray: + """Aggregated capacity factors from a point layout.""" + # prepare layout from list of points + layout = layout.rename(columns={"lon": "x", "lat": "y"}) + layout = cutout.layout_from_capacity_list(layout, col="capacity") + + # compute capacity factors + tech = tech_specs["tech"] + specs = tech_specs["specs"] + get_capacityfactors = getattr(cutout, tech) + + capacityfactors = get_capacityfactors( + shapes=spatial_units, layout=layout, per_unit=True, **specs + ) + + return capacityfactors + + +def cf_agg_from_raster_layout( + cutout: atlite.Cutout, + layout: xr.DataArray, + spatial_units: gpd.GeoDataFrame, + tech_specs: dict, +) -> xr.DataArray: + """Aggregated capacity factors from a raster layout.""" + # resample layout to the resolution of the cutout + match = ( + cutout.uniform_layout() + .rio.write_crs(cutout.crs) + .rio.write_transform(cutout.transform) + ) + layout_matched = layout.squeeze(drop=True) + layout_matched = layout_matched.rio.reproject_match( + match, resampling=rio.enums.Resampling.sum, nodata=0 + ) + + # compute capacity factors + tech = tech_specs["tech"] + specs = tech_specs["specs"] + get_capacityfactors = getattr(cutout, tech) + + capacityfactors = get_capacityfactors( + shapes=spatial_units, layout=layout_matched, **specs + ) + + return capacityfactors + + +def cf_from_point_layout( + cutout: atlite.Cutout, + layout: xr.DataArray, + spatial_units: gpd.GeoDataFrame, + tech_specs: dict, +) -> xr.DataArray: + """Capacity factors from a point layout.""" + raise NotImplementedError + + +def cf_from_raster_layout( + cutout: atlite.Cutout, + layout: xr.DataArray, + spatial_units: gpd.GeoDataFrame, + tech_specs: dict, +) -> xr.DataArray: + """Capacity factors from a raster layout.""" + raise NotImplementedError diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py new file mode 100644 index 0000000..8972967 --- /dev/null +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -0,0 +1,28 @@ +"""Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" + +import atlite +import backend_atlite +import geopandas as gpd +import pandas as pd +import yaml + + +def read_yaml(filepath): + """Open a yaml file as python dictionary.""" + with open(filepath) as file: + return yaml.safe_load(file) + + +if __name__ == "__main__": + cutout = atlite.Cutout(snakemake.input.cutout) + spatial_units = gpd.read_file(snakemake.input.spatial_units) + spatial_units = spatial_units.set_index(spatial_units.columns[0]) + tech_specs = read_yaml(snakemake.input.tech_specs) + + layout = pd.read_csv(snakemake.input.layout) + + capacityfactors = backend_atlite.cf_agg_from_point_layout( + cutout=cutout, layout=layout, spatial_units=spatial_units, tech_specs=tech_specs + ) + + capacityfactors.to_netcdf(snakemake.output[0]) diff --git a/workflow/scripts/prepare_capacityfactors.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py similarity index 54% rename from workflow/scripts/prepare_capacityfactors.py rename to workflow/scripts/prepare_capacityfactors_raster_layout.py index 99e0186..16fe306 100644 --- a/workflow/scripts/prepare_capacityfactors.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,8 +1,8 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" import atlite +import backend_atlite import geopandas as gpd -import rasterio as rio import rioxarray as rxr import yaml @@ -15,27 +15,14 @@ def read_yaml(filepath): if __name__ == "__main__": cutout = atlite.Cutout(snakemake.input.cutout) - layout = rxr.open_rasterio(snakemake.input.layout) spatial_units = gpd.read_file(snakemake.input.spatial_units) spatial_units = spatial_units.set_index(spatial_units.columns[0]) tech_specs = read_yaml(snakemake.input.tech_specs) - # resample layout to the resolution of the cutout - match = ( - cutout.uniform_layout() - .rio.write_crs(cutout.crs) - .rio.write_transform(cutout.transform) - ) - layout_matched = layout.squeeze(drop=True) - layout_matched = layout_matched.rio.reproject_match( - match, resampling=rio.enums.Resampling.sum, nodata=0 - ) - - tech = tech_specs["tech"] - specs = tech_specs["specs"] - get_capacityfactors = getattr(cutout, tech) + layout = rxr.open_rasterio(snakemake.input.layout) - capacityfactors = get_capacityfactors( - shapes=spatial_units, layout=layout_matched, **specs + capacityfactors = backend_atlite.cf_agg_from_raster_layout( + cutout=cutout, layout=layout, spatial_units=spatial_units, tech_specs=tech_specs ) + capacityfactors.to_netcdf(snakemake.output[0]) From 177c28b6c6182ed36c88407eab25356cb409a8a2 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 18 Jun 2025 17:07:25 +0200 Subject: [PATCH 08/59] Enable configuration to download cutout --- config/config.yaml | 9 +++++++ workflow/internal/config.schema.yaml | 38 ++++++++++++++++++++++++++++ workflow/rules/capacity_factors.smk | 31 ++++++++++++++--------- workflow/scripts/download_cutout.py | 7 ++--- 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 05af49b..adba4c8 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,4 +1,13 @@ # A minimal example of how to configure this module +download_cutout: True backend: atlite layout: raster # raster or point aggregate: true +cutout_params: + module: era5 + x: [3.4, 7.2] + y: [50.7, 53.5] + snapshots: + start: "2017-01-01" + end: "2017-02-01" + inclusive: 'left' diff --git a/workflow/internal/config.schema.yaml b/workflow/internal/config.schema.yaml index d2f7777..ea1ab78 100644 --- a/workflow/internal/config.schema.yaml +++ b/workflow/internal/config.schema.yaml @@ -3,6 +3,10 @@ description: "Schema for user-provided configuration files." type: object additionalProperties: false properties: + download_cutout: + type: boolean + default: false + description: "Whether to download the cutout automatically or use a user-provided one." backend: type: string enum: ["atlite"] @@ -14,3 +18,37 @@ properties: aggregate: type: boolean description: "Whether to aggregate the data to spatial_units or not." + # if download_cutout is True, need to provide these parameters, which are used to download the cutout + cutout_params: + type: object + properties: + module: + type: string + enum: ["era5"] + description: "The module to use for downloading the cutout." + x: + type: array + items: + type: number + description: "Longitude coordinates for the cutout." + y: + type: array + items: + type: number + description: "Latitude coordinates for the cutout." + snapshots: + type: object + properties: + start: + type: string + format: date-time + description: "Start date for the snapshots." + end: + type: string + format: date-time + description: "End date for the snapshots." + inclusive: + type: string + enum: ["left", "right"] + description: "Whether the start or end date is inclusive." + description: "Parameters for downloading the cutout if download_cutout is True." diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index a272287..11840b6 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -1,20 +1,27 @@ -rule download_cutout: - output: - "results/cutout_era5_download.nc", - conda: - "../envs/geo.yaml" - script: - "../scripts/download_cutout.py" +if config["download_cutout"]: + + path_cutout = ancient("resources/automatic/cutout_era5.nc") + + rule download_cutout: + output: + "resources/automatic/cutout_era5.nc", + conda: + "../envs/atlite.yaml" + script: + "../scripts/download_cutout.py" + +else: + path_cutout = ancient("resources/user/cutout_{name_cutout}.nc") if config["layout"] == "raster": rule prepare_capacityfactors_raster_layout: input: - cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again - tech_specs="resources/user/tech_specs_{name_tech}.yaml", - layout="resources/user/layout_{name_layout}.tif", - spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", + cutout=path_cutout, + tech_specs="resources/user/tech_specs/{name_tech}.yaml", + layout="resources/user/layout/{name_layout}.tif", + spatial_units="resources/user/spatial_units/{name_spatial_units}.geojson", output: "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", conda: @@ -26,7 +33,7 @@ elif config["layout"] == "point": rule prepare_capacityfactors_point_layout: input: - cutout=ancient("resources/user/cutout_{name_cutout}.nc"), # TODO: Replace with results/cutout.nc as soon as the download works again + cutout=path_cutout, tech_specs="resources/user/tech_specs_{name_tech}.yaml", layout="resources/user/layout_{name_layout}.csv", spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", diff --git a/workflow/scripts/download_cutout.py b/workflow/scripts/download_cutout.py index 6d3ebcd..7a1426f 100644 --- a/workflow/scripts/download_cutout.py +++ b/workflow/scripts/download_cutout.py @@ -1,11 +1,12 @@ +"""Download a cutout using atlite.""" + import atlite import pandas as pd - if __name__ == "__main__": - cutout_params = snakemake.config["build_cutout"]["cutout_params"] + cutout_params = snakemake.config["cutout_params"] - snapshots = pd.date_range(freq="h", **snakemake.config["snapshots"]) + snapshots = pd.date_range(freq="h", **cutout_params["snapshots"]) time = [snapshots[0], snapshots[-1]] cutout_params["time"] = slice(*cutout_params.get("time", time)) From 1c2d22c24387f4113f330c5bd458a92e627f571b Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:50:50 +0200 Subject: [PATCH 09/59] Move download rule to automatic.smk --- workflow/Snakefile | 1 + workflow/rules/automatic.smk | 15 +++++++++++++++ workflow/rules/capacity_factors.smk | 16 ---------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/workflow/Snakefile b/workflow/Snakefile index 7176515..699869b 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -18,6 +18,7 @@ with open(workflow.source_path("internal/settings.yaml"), "r") as f: # Add all your includes here. +include: "rules/automatic.smk" include: "rules/capacity_factors.smk" diff --git a/workflow/rules/automatic.smk b/workflow/rules/automatic.smk index 6ad43f0..3a048e8 100644 --- a/workflow/rules/automatic.smk +++ b/workflow/rules/automatic.smk @@ -1 +1,16 @@ """Rules to used to download automatic resource files.""" + +if config["download_cutout"]: + + path_cutout = ancient("resources/automatic/cutout_era5.nc") + + rule download_cutout: + output: + "resources/automatic/cutout_era5.nc", + conda: + "../envs/atlite.yaml" + script: + "../scripts/download_cutout.py" + +else: + path_cutout = ancient("resources/user/cutout_{name_cutout}.nc") diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 11840b6..f3282e0 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -1,19 +1,3 @@ -if config["download_cutout"]: - - path_cutout = ancient("resources/automatic/cutout_era5.nc") - - rule download_cutout: - output: - "resources/automatic/cutout_era5.nc", - conda: - "../envs/atlite.yaml" - script: - "../scripts/download_cutout.py" - -else: - path_cutout = ancient("resources/user/cutout_{name_cutout}.nc") - - if config["layout"] == "raster": rule prepare_capacityfactors_raster_layout: From 8f490a22b767c6abeacb4b0f72ede624ab1596b4 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:17:09 +0200 Subject: [PATCH 10/59] Add simple unpolished plot and map --- workflow/Snakefile | 1 + workflow/rules/plot.smk | 11 ++++++++ workflow/scripts/plot.py | 57 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 workflow/rules/plot.smk create mode 100644 workflow/scripts/plot.py diff --git a/workflow/Snakefile b/workflow/Snakefile index 699869b..4d9c12b 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -20,6 +20,7 @@ with open(workflow.source_path("internal/settings.yaml"), "r") as f: # Add all your includes here. include: "rules/automatic.smk" include: "rules/capacity_factors.smk" +include: "rules/plot.smk" rule all: diff --git a/workflow/rules/plot.smk b/workflow/rules/plot.smk new file mode 100644 index 0000000..b44f7e5 --- /dev/null +++ b/workflow/rules/plot.smk @@ -0,0 +1,11 @@ +rule plot: + input: + capacity_factors="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + shapes="resources/user/spatial_units/{name_spatial_units}.geojson", + output: + output_plot="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.png", + output_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}_map.png", + conda: + "../envs/atlite.yaml" + script: + "../scripts/plot.py" diff --git a/workflow/scripts/plot.py b/workflow/scripts/plot.py new file mode 100644 index 0000000..e0deaba --- /dev/null +++ b/workflow/scripts/plot.py @@ -0,0 +1,57 @@ +"""Plot capacity factors.""" + +import geopandas as gpd +import matplotlib.pyplot as plt +import xarray as xr + + +def plot_timeseries(da: xr.DataArray, name: str) -> plt.Figure: + """Plot a time series of capacity factors for a given name.""" + fig, ax = plt.subplots(figsize=(6, 3), layout="constrained") + da.sel(name=name).plot(ax=ax, label=name) + ax.set_title(name) + ax.set_xlabel("Time") + ax.set_ylabel("Capacity factor") + return fig + + +def plot_map(gdf: gpd.GeoDataFrame) -> plt.Figure: + """Plot a map of a GeoDataFrame with capacity factors.""" + fig, ax = plt.subplots(figsize=(4, 3), layout="constrained") + + gdf.plot(ax=ax, column="Capacity factor") + + ax.set_xticks([]) + ax.set_yticks([]) + ax.set_xlabel("") + ax.set_ylabel("") + ax.set_title("Annual average of capacity factor") + + return fig + + +def main(path_capacity_factors, path_shapes, output_plot, output_map): + """Main function to plot capacity factors and save the plots.""" + da = xr.open_dataarray(path_capacity_factors) + shapes = gpd.read_file(path_shapes) + shapes = shapes.set_index(shapes.columns[0]) + + plot_timeseries(da, name="AL") + plt.savefig(output_plot, dpi=300, bbox_inches="tight") + + annual_mean = da.mean("time") + annual_mean = annual_mean.to_dataframe(name="Capacity factor") + annual_mean = annual_mean.join(shapes) + annual_mean = gpd.GeoDataFrame(annual_mean, geometry="geometry", crs=shapes.crs) + + plot_map(annual_mean) + plt.savefig(output_map, dpi=300, bbox_inches="tight") + + +if __name__ == "__main__": + main( + snakemake.input.capacity_factors, + snakemake.input.shapes, + snakemake.output.output_plot, + snakemake.output.output_map, + ) From b22620a994e557cb95f75db7fa47f2032c03a965 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:27:59 +0200 Subject: [PATCH 11/59] Attempt to solve missing file when integrating data module via GitHub --- workflow/Snakefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workflow/Snakefile b/workflow/Snakefile index 4d9c12b..b8dc686 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -16,6 +16,10 @@ validate(config, workflow.source_path("internal/config.schema.yaml")) with open(workflow.source_path("internal/settings.yaml"), "r") as f: internal = yaml.safe_load(f) +# Load python files in scripts that are used in other scripts, but not run itself. +# This is necessary for integrating the snakemake module via reference to GitHub. +workflow.source_path("scripts/backend_atlite.py") + # Add all your includes here. include: "rules/automatic.smk" From 7451085bd578489fbe9ed605b9a5335847bc44df Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:37:13 +0200 Subject: [PATCH 12/59] Update template to v0.1.13 --- .copier-answers.yml | 6 +++--- README.md | 4 ++-- tests/clio_test.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 289d09b..be52861 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -7,7 +7,7 @@ author_family_name: Launer author_given_name: Jann github_org: calliope-project license: MIT -module_description: This data module produces area potentials and capacity factors - for PV and wind at arbitrary spatial resolution. -module_long_name: 'PV and wind area potentials and capacity factors ' +module_description: This data module produces capacity factors for PV and wind at + arbitrary spatial resolution. +module_long_name: PV and wind capacity factors module_short_name: module_pv_wind diff --git a/README.md b/README.md index 8545c1c..6213177 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# PV and wind area potentials and capacity factors +# PV and wind capacity factors -This data module produces area potentials and capacity factors for PV and wind at arbitrary spatial resolution. +This data module produces capacity factors for PV and wind at arbitrary spatial resolution. A modular `snakemake` workflow built for [`clio`](https://clio.readthedocs.io/) data modules. diff --git a/tests/clio_test.py b/tests/clio_test.py index 5fe141b..fcd4971 100644 --- a/tests/clio_test.py +++ b/tests/clio_test.py @@ -40,7 +40,7 @@ def test_standard_file_existance(module_path, file): def test_snakemake_all_failure(module_path): """The snakemake 'all' rule should return an error by default.""" process = subprocess.run( - "snakemake", shell=True, cwd=module_path, capture_output=True + "snakemake --cores 4", shell=True, cwd=module_path, capture_output=True ) assert "INVALID (missing locally)" in str(process.stderr) @@ -48,7 +48,7 @@ def test_snakemake_all_failure(module_path): def test_snakemake_integration_testing(module_path): """Run a light-weight test simulating someone using this module.""" assert subprocess.run( - "snakemake --use-conda", + "snakemake --use-conda --cores 4", shell=True, check=True, cwd=module_path / "tests/integration", From c203a62fa5206c5e105327e2e1bc632aca96ccf5 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:55:56 +0200 Subject: [PATCH 13/59] Add integration test --- tests/integration/Snakefile | 77 ++++++++++++++++++++++-------- tests/integration/test_config.yaml | 31 ++++++++++-- 2 files changed, 85 insertions(+), 23 deletions(-) diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index b1c1869..a92b20d 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -1,36 +1,75 @@ # Emulate a user configuring the module. configfile: workflow.source_path("./test_config.yaml") + # Emulate how another workflow might create inputs for this module. -rule create_external_input: - message: "Example of a rule external to your module." +rule copy_external_input: + message: + "Example of a rule external to your module." + input: + layout_points="../files/layout_points_NLD.csv", + layout_raster="../files/layout_raster_NLD.tif", + shapes="../files/shapes_NLD.geojson", + cutout="../files/era5.nc", + tech_specs="../files/wind_onshore_3MW.yaml", output: - text_file = "results/module_pv_wind/resources/user/user_message.md" - run: - from pathlib import Path - from textwrap import dedent - text = dedent("""Modular workflows can be used by more than one project! - For example, this text comes from a file external to the module. - Try your best to make this workflow reusable so that others may benefit from your methods.""" - ) - file_path = Path(output.text_file) - with file_path.open("w") as f: - f.write(text) + layout_points="results/module_pv_wind/resources/user/layout/wind_onshore_point.csv", + layout_raster="results/module_pv_wind/resources/user/layout/wind_onshore_raster.tif", + shapes="results/module_pv_wind/resources/user/spatial_units/shapes_NLD.geojson", + cutout="results/module_pv_wind/resources/user/cutout_era5-NLD.nc", + tech_specs="results/module_pv_wind/resources/user/tech_specs/wind_onshore_3MW.yaml", + shell: + """ + cp {input.layout_points} {output.layout_points} + cp {input.layout_raster} {output.layout_raster} + cp {input.shapes} {output.shapes} + cp {input.cutout} {output.cutout} + cp {input.tech_specs} {output.tech_specs} + """ + # Import the module and configure it. # `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers # `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. module module_pv_wind: - snakefile: "../../workflow/Snakefile" - config: config["module_pv_wind"] - prefix: "results/module_pv_wind/" + snakefile: + "../../workflow/Snakefile" + config: + config["module_pv_wind_raster"] + prefix: + "results/module_pv_wind/" + # rename all module rules with a prefix, to avoid naming conflicts. use rule * from module_pv_wind as module_pv_wind_* + +# Request something from the module +rule all_raster: + message: + "A test case for your module." + default_target: True + input: + "results/module_pv_wind/results/era5-NLD/shapes_NLD/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", + + +module module_pv_wind: + snakefile: + "../../workflow/Snakefile" + config: + config["module_pv_wind_point"] + prefix: + "results/module_pv_wind/" + + +# rename all module rules with a prefix, to avoid naming conflicts. +use rule * from module_pv_wind as module_pv_wind_* + + # Request something from the module -rule all: - message: "A generic test case for your module." +rule all_point: + message: + "A test case for your module." default_target: True input: - "results/module_pv_wind/results/combined_text.md" + "results/module_pv_wind/results/era5-NLD/shapes_NLD/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", diff --git a/tests/integration/test_config.yaml b/tests/integration/test_config.yaml index e8ff7ae..824b938 100644 --- a/tests/integration/test_config.yaml +++ b/tests/integration/test_config.yaml @@ -1,4 +1,27 @@ -module_pv_wind: - dummy_text: >- - Configuration values (like this one) are also external to the module! - This gives users a lot of flexibility in how they apply your methodology to solve their particular needs. +module_pv_wind_raster: + download_cutout: False + backend: atlite + layout: raster # raster or point + aggregate: true + cutout_params: + module: era5 + x: [3.4, 7.2] + y: [50.7, 53.5] + snapshots: + start: "2017-01-01" + end: "2017-02-01" + inclusive: 'left' + +module_pv_wind_point: + download_cutout: False + backend: atlite + layout: point # raster or point + aggregate: true + cutout_params: + module: era5 + x: [3.4, 7.2] + y: [50.7, 53.5] + snapshots: + start: "2017-01-01" + end: "2017-02-01" + inclusive: 'left' From cd3c2b446dec5419969c615f7500ae517bd99b76 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:56:25 +0200 Subject: [PATCH 14/59] Harmonize paths between rules --- workflow/rules/capacity_factors.smk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index f3282e0..93d7a79 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -18,9 +18,9 @@ elif config["layout"] == "point": rule prepare_capacityfactors_point_layout: input: cutout=path_cutout, - tech_specs="resources/user/tech_specs_{name_tech}.yaml", - layout="resources/user/layout_{name_layout}.csv", - spatial_units="resources/user/spatial_units_{name_spatial_units}.geojson", + tech_specs="resources/user/tech_specs/{name_tech}.yaml", + layout="resources/user/layout/{name_layout}.csv", + spatial_units="resources/user/spatial_units/{name_spatial_units}.geojson", output: "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", conda: From 16e0d36895cb848fd8c22183dca6fa1bb17b6288 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 8 Aug 2025 16:19:19 +0200 Subject: [PATCH 15/59] Force latest atlite 0.4.1 and cfgrib to handle new cdsapi --- workflow/envs/atlite.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow/envs/atlite.yaml b/workflow/envs/atlite.yaml index d8bcb9b..c2efcba 100644 --- a/workflow/envs/atlite.yaml +++ b/workflow/envs/atlite.yaml @@ -4,7 +4,8 @@ channels: - nodefaults dependencies: - pyyaml - - atlite + - atlite>=0.4.1 # Need at least 0.4.1 for the new cdsapi + - cfgrib # Explicitly adding because of https://github.com/PyPSA/atlite/issues/459 - rioxarray - rasterio - geopandas From dccd8c0d36bc4ad84440bf0d34aa42c92a003801 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 8 Aug 2025 18:12:31 +0200 Subject: [PATCH 16/59] Adhere to new atlite api --- workflow/scripts/download_cutout.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/workflow/scripts/download_cutout.py b/workflow/scripts/download_cutout.py index 7a1426f..05af80e 100644 --- a/workflow/scripts/download_cutout.py +++ b/workflow/scripts/download_cutout.py @@ -1,18 +1,21 @@ """Download a cutout using atlite.""" +import logging + import atlite -import pandas as pd + +logger = logging.getLogger(__name__) + if __name__ == "__main__": + logger.info(f"Using atlite version: {atlite.__version__}") cutout_params = snakemake.config["cutout_params"] - snapshots = pd.date_range(freq="h", **cutout_params["snapshots"]) - time = [snapshots[0], snapshots[-1]] - cutout_params["time"] = slice(*cutout_params.get("time", time)) - cutout_params["x"] = slice(*cutout_params["x"]) cutout_params["y"] = slice(*cutout_params["y"]) + cutout_params["time"] = slice(*cutout_params["time"]) features = cutout_params.pop("features", None) cutout = atlite.Cutout(snakemake.output[0], **cutout_params) + logger.info(f"Preparing cutout with features: {features}") cutout.prepare(features=features) From 88d9dfa9694cd929a48f09321f775cf2a47e295c Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 8 Aug 2025 18:13:48 +0200 Subject: [PATCH 17/59] Adapt and make schema stricter --- workflow/internal/config.schema.yaml | 38 +++++++++++++++++----------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/workflow/internal/config.schema.yaml b/workflow/internal/config.schema.yaml index ea1ab78..a832ab7 100644 --- a/workflow/internal/config.schema.yaml +++ b/workflow/internal/config.schema.yaml @@ -1,7 +1,13 @@ $schema: "https://json-schema.org/draft/2020-12/schema" description: "Schema for user-provided configuration files." type: object +required: + - download_cutout + - backend + - layout + - aggregate additionalProperties: false + properties: download_cutout: type: boolean @@ -21,6 +27,12 @@ properties: # if download_cutout is True, need to provide these parameters, which are used to download the cutout cutout_params: type: object + required: + - module + - x + - y + - time + additionalProperties: false properties: module: type: string @@ -36,19 +48,15 @@ properties: items: type: number description: "Latitude coordinates for the cutout." - snapshots: - type: object - properties: - start: - type: string - format: date-time - description: "Start date for the snapshots." - end: - type: string - format: date-time - description: "End date for the snapshots." - inclusive: - type: string - enum: ["left", "right"] - description: "Whether the start or end date is inclusive." + time: + type: array + items: + type: string + format: date-time + description: "Time range for the cutout in ISO 8601 format." + features: + type: array + items: + type: string + description: "List of features to include in the cutout." description: "Parameters for downloading the cutout if download_cutout is True." From 5251b4c7d008f7be13ae88c980ed2e59a2275434 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 8 Aug 2025 18:15:20 +0200 Subject: [PATCH 18/59] Adapt example and test config --- config/config.yaml | 6 ++---- tests/integration/test_config.yaml | 14 +++++--------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index adba4c8..0083e69 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -7,7 +7,5 @@ cutout_params: module: era5 x: [3.4, 7.2] y: [50.7, 53.5] - snapshots: - start: "2017-01-01" - end: "2017-02-01" - inclusive: 'left' + time: ["2017-01", "2017-02"] + features: ['height', 'wind', 'influx', 'temperature'] diff --git a/tests/integration/test_config.yaml b/tests/integration/test_config.yaml index 824b938..945478d 100644 --- a/tests/integration/test_config.yaml +++ b/tests/integration/test_config.yaml @@ -2,15 +2,13 @@ module_pv_wind_raster: download_cutout: False backend: atlite layout: raster # raster or point - aggregate: true + aggregate: True cutout_params: module: era5 x: [3.4, 7.2] y: [50.7, 53.5] - snapshots: - start: "2017-01-01" - end: "2017-02-01" - inclusive: 'left' + time: ["2017-01", "2017-02"] + features: ['height', 'wind', 'influx', 'temperature'] module_pv_wind_point: download_cutout: False @@ -21,7 +19,5 @@ module_pv_wind_point: module: era5 x: [3.4, 7.2] y: [50.7, 53.5] - snapshots: - start: "2017-01-01" - end: "2017-02-01" - inclusive: 'left' + time: ["2017-01", "2017-02"] + features: ['height', 'wind', 'influx', 'temperature'] From f9a6b005c749d7c4546513142578bbc71495d605 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:20:11 +0200 Subject: [PATCH 19/59] Allow to pass monthly_requests --- workflow/internal/config.schema.yaml | 10 ++++++++-- workflow/scripts/download_cutout.py | 6 ++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/workflow/internal/config.schema.yaml b/workflow/internal/config.schema.yaml index a832ab7..0ebd273 100644 --- a/workflow/internal/config.schema.yaml +++ b/workflow/internal/config.schema.yaml @@ -52,11 +52,17 @@ properties: type: array items: type: string - format: date-time description: "Time range for the cutout in ISO 8601 format." features: type: array items: type: string description: "List of features to include in the cutout." - description: "Parameters for downloading the cutout if download_cutout is True." + show_progress: + type: boolean + default: true + description: "Whether to show progress during the cutout download." + monthly_requests: + type: boolean + default: false + description: "Whether to request data monthly." diff --git a/workflow/scripts/download_cutout.py b/workflow/scripts/download_cutout.py index 05af80e..e119f7f 100644 --- a/workflow/scripts/download_cutout.py +++ b/workflow/scripts/download_cutout.py @@ -16,6 +16,8 @@ cutout_params["time"] = slice(*cutout_params["time"]) features = cutout_params.pop("features", None) - cutout = atlite.Cutout(snakemake.output[0], **cutout_params) + monthly_requests = cutout_params.pop("monthly_requests", False) + logger.info(f"Preparing cutout with cutout_params: {cutout_params}") logger.info(f"Preparing cutout with features: {features}") - cutout.prepare(features=features) + cutout = atlite.Cutout(snakemake.output[0], **cutout_params) + cutout.prepare(features=features, monthly_requests=monthly_requests) From ecf5c992286abaf1db1ab290f9fd05e898ee15ca Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:20:45 +0200 Subject: [PATCH 20/59] Set masked to True when reading raster layouts --- workflow/scripts/prepare_capacityfactors_raster_layout.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 16fe306..bf21bad 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -19,7 +19,7 @@ def read_yaml(filepath): spatial_units = spatial_units.set_index(spatial_units.columns[0]) tech_specs = read_yaml(snakemake.input.tech_specs) - layout = rxr.open_rasterio(snakemake.input.layout) + layout = rxr.open_rasterio(snakemake.input.layout, masked=True) capacityfactors = backend_atlite.cf_agg_from_raster_layout( cutout=cutout, layout=layout, spatial_units=spatial_units, tech_specs=tech_specs From 1f2e8f82c234d1229f98df6c5a30a5d2a8314b8e Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:53:16 +0200 Subject: [PATCH 21/59] Set nan values in layout to zero --- workflow/scripts/prepare_capacityfactors_raster_layout.py | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index bf21bad..e335e6d 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -20,6 +20,7 @@ def read_yaml(filepath): tech_specs = read_yaml(snakemake.input.tech_specs) layout = rxr.open_rasterio(snakemake.input.layout, masked=True) + layout = layout.fillna(0) capacityfactors = backend_atlite.cf_agg_from_raster_layout( cutout=cutout, layout=layout, spatial_units=spatial_units, tech_specs=tech_specs From 83b47804a76ca49e74826dbc4abe1b5b6a7b22ef Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 3 Nov 2025 12:55:35 +0100 Subject: [PATCH 22/59] Move atlite call to backend --- workflow/scripts/backend_atlite.py | 12 ++++++++++-- .../scripts/prepare_capacityfactors_point_layout.py | 8 +++++--- .../scripts/prepare_capacityfactors_raster_layout.py | 8 +++++--- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/workflow/scripts/backend_atlite.py b/workflow/scripts/backend_atlite.py index d2038eb..71d082d 100644 --- a/workflow/scripts/backend_atlite.py +++ b/workflow/scripts/backend_atlite.py @@ -1,5 +1,7 @@ """Backend for capacity factor calculations using atlite.""" +from pathlib import Path + import atlite import geopandas as gpd import rasterio as rio @@ -7,12 +9,15 @@ def cf_agg_from_point_layout( - cutout: atlite.Cutout, + path_cutout: str | Path, layout: xr.DataArray, spatial_units: gpd.GeoDataFrame, tech_specs: dict, ) -> xr.DataArray: """Aggregated capacity factors from a point layout.""" + # load cutout + cutout = atlite.Cutout(path_cutout) + # prepare layout from list of points layout = layout.rename(columns={"lon": "x", "lat": "y"}) layout = cutout.layout_from_capacity_list(layout, col="capacity") @@ -30,12 +35,15 @@ def cf_agg_from_point_layout( def cf_agg_from_raster_layout( - cutout: atlite.Cutout, + path_cutout: str | Path, layout: xr.DataArray, spatial_units: gpd.GeoDataFrame, tech_specs: dict, ) -> xr.DataArray: """Aggregated capacity factors from a raster layout.""" + # load cutout + cutout = atlite.Cutout(path_cutout) + # resample layout to the resolution of the cutout match = ( cutout.uniform_layout() diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 8972967..3608db8 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -1,6 +1,5 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" -import atlite import backend_atlite import geopandas as gpd import pandas as pd @@ -14,7 +13,7 @@ def read_yaml(filepath): if __name__ == "__main__": - cutout = atlite.Cutout(snakemake.input.cutout) + path_cutout = snakemake.input.cutout spatial_units = gpd.read_file(snakemake.input.spatial_units) spatial_units = spatial_units.set_index(spatial_units.columns[0]) tech_specs = read_yaml(snakemake.input.tech_specs) @@ -22,7 +21,10 @@ def read_yaml(filepath): layout = pd.read_csv(snakemake.input.layout) capacityfactors = backend_atlite.cf_agg_from_point_layout( - cutout=cutout, layout=layout, spatial_units=spatial_units, tech_specs=tech_specs + path_cutout=path_cutout, + layout=layout, + spatial_units=spatial_units, + tech_specs=tech_specs, ) capacityfactors.to_netcdf(snakemake.output[0]) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index e335e6d..b042c71 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,6 +1,5 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" -import atlite import backend_atlite import geopandas as gpd import rioxarray as rxr @@ -14,7 +13,7 @@ def read_yaml(filepath): if __name__ == "__main__": - cutout = atlite.Cutout(snakemake.input.cutout) + path_cutout = snakemake.input.cutout spatial_units = gpd.read_file(snakemake.input.spatial_units) spatial_units = spatial_units.set_index(spatial_units.columns[0]) tech_specs = read_yaml(snakemake.input.tech_specs) @@ -23,7 +22,10 @@ def read_yaml(filepath): layout = layout.fillna(0) capacityfactors = backend_atlite.cf_agg_from_raster_layout( - cutout=cutout, layout=layout, spatial_units=spatial_units, tech_specs=tech_specs + path_cutout=path_cutout, + layout=layout, + spatial_units=spatial_units, + tech_specs=tech_specs, ) capacityfactors.to_netcdf(snakemake.output[0]) From 3274159c108176be7ae812b704b6ea80fbc8dd9a Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 3 Nov 2025 13:02:48 +0100 Subject: [PATCH 23/59] Wrap processing in functions --- .../prepare_capacityfactors_point_layout.py | 30 ++++++++++++++----- .../prepare_capacityfactors_raster_layout.py | 30 ++++++++++++++----- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 3608db8..fac5e71 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -12,14 +12,19 @@ def read_yaml(filepath): return yaml.safe_load(file) -if __name__ == "__main__": - path_cutout = snakemake.input.cutout - spatial_units = gpd.read_file(snakemake.input.spatial_units) +def prepare_capacityfactors_point_layout( + path_cutout, path_spatial_units, path_tech_specs, path_layout, path_output +): + """Prepare capacityfactors aggregated to spatial units weighted by a point layout.""" + # load inputs + spatial_units = gpd.read_file(path_spatial_units) + layout = pd.read_csv(path_layout) + tech_specs = read_yaml(path_tech_specs) + + # prepare inputs spatial_units = spatial_units.set_index(spatial_units.columns[0]) - tech_specs = read_yaml(snakemake.input.tech_specs) - - layout = pd.read_csv(snakemake.input.layout) + # compute capacityfactors capacityfactors = backend_atlite.cf_agg_from_point_layout( path_cutout=path_cutout, layout=layout, @@ -27,4 +32,15 @@ def read_yaml(filepath): tech_specs=tech_specs, ) - capacityfactors.to_netcdf(snakemake.output[0]) + # save output + capacityfactors.to_netcdf(path_output) + + +if __name__ == "__main__": + prepare_capacityfactors_point_layout( + path_cutout=snakemake.input.cutout, + path_spatial_units=snakemake.input.spatial_units, + path_tech_specs=snakemake.input.tech_specs, + path_layout=snakemake.input.layout, + path_output=snakemake.output[0], + ) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index b042c71..606bcfd 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -12,15 +12,20 @@ def read_yaml(filepath): return yaml.safe_load(file) -if __name__ == "__main__": - path_cutout = snakemake.input.cutout - spatial_units = gpd.read_file(snakemake.input.spatial_units) +def prepare_capacityfactors_raster_layout( + path_cutout, path_spatial_units, path_tech_specs, path_layout, path_output +): + """Prepare capacityfactors aggregated to spatial units weighted by a raster layout.""" + # load inputs + spatial_units = gpd.read_file(path_spatial_units) + tech_specs = read_yaml(path_tech_specs) + layout = rxr.open_rasterio(path_layout, masked=True) + + # prepare inputs spatial_units = spatial_units.set_index(spatial_units.columns[0]) - tech_specs = read_yaml(snakemake.input.tech_specs) - - layout = rxr.open_rasterio(snakemake.input.layout, masked=True) layout = layout.fillna(0) + # compute capacityfactors capacityfactors = backend_atlite.cf_agg_from_raster_layout( path_cutout=path_cutout, layout=layout, @@ -28,4 +33,15 @@ def read_yaml(filepath): tech_specs=tech_specs, ) - capacityfactors.to_netcdf(snakemake.output[0]) + # save output + capacityfactors.to_netcdf(path_output) + + +if __name__ == "__main__": + prepare_capacityfactors_raster_layout( + path_cutout=snakemake.input.cutout, + path_spatial_units=snakemake.input.spatial_units, + path_tech_specs=snakemake.input.tech_specs, + path_layout=snakemake.input.layout, + path_output=snakemake.output[0], + ) From 51b9e08f7567e401349b653d5987435380c99126 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 3 Nov 2025 14:57:47 +0100 Subject: [PATCH 24/59] Drop pre-defined keyword argument in function call --- workflow/scripts/backend_atlite.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/workflow/scripts/backend_atlite.py b/workflow/scripts/backend_atlite.py index 71d082d..edb49bf 100644 --- a/workflow/scripts/backend_atlite.py +++ b/workflow/scripts/backend_atlite.py @@ -27,9 +27,7 @@ def cf_agg_from_point_layout( specs = tech_specs["specs"] get_capacityfactors = getattr(cutout, tech) - capacityfactors = get_capacityfactors( - shapes=spatial_units, layout=layout, per_unit=True, **specs - ) + capacityfactors = get_capacityfactors(shapes=spatial_units, layout=layout, **specs) return capacityfactors From 0278af0647687d03de1b5846eae0e31760834b90 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:21:25 +0100 Subject: [PATCH 25/59] Add plots --- workflow/rules/capacity_factors.smk | 6 ++- workflow/scripts/_plots.py | 41 +++++++++++++++++++ .../prepare_capacityfactors_point_layout.py | 24 ++++++++++- .../prepare_capacityfactors_raster_layout.py | 24 ++++++++++- 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 workflow/scripts/_plots.py diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 93d7a79..402fa1f 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -7,7 +7,8 @@ if config["layout"] == "raster": layout="resources/user/layout/{name_layout}.tif", spatial_units="resources/user/spatial_units/{name_spatial_units}.geojson", output: - "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + data="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + plot_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", conda: "../envs/atlite.yaml" script: @@ -22,7 +23,8 @@ elif config["layout"] == "point": layout="resources/user/layout/{name_layout}.csv", spatial_units="resources/user/spatial_units/{name_spatial_units}.geojson", output: - "results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + data="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", + plot_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", conda: "../envs/atlite.yaml" script: diff --git a/workflow/scripts/_plots.py b/workflow/scripts/_plots.py new file mode 100644 index 0000000..59f92cf --- /dev/null +++ b/workflow/scripts/_plots.py @@ -0,0 +1,41 @@ +import geopandas as gpd +import matplotlib.pyplot as plt +import xarray as xr +from matplotlib.colors import LinearSegmentedColormap + +cmap_wind = LinearSegmentedColormap.from_list("cmap_wind", ["white", "blue"]) +cmap_pv = LinearSegmentedColormap.from_list("cmap_pv", ["white", "orange"]) + + +def average_capacity_factors( + cf: xr.DataArray, shapes: gpd.GeoDataFrame +) -> gpd.GeoDataFrame: + """Calculate average capacity factors per spatial unit.""" + df_mean_cf = cf.mean(dim="time").to_dataframe(name="average_cf").reset_index() + df_mean_cf.index.name = "id" + + gdf_mean_cf = gpd.GeoDataFrame( + df_mean_cf.join(shapes[["shape_id", "geometry"]]), + geometry="geometry", + crs=shapes.crs, + ) + + return gdf_mean_cf + + +def map_capacity_factor(gdf_mean_cf, column, figsize=(4, 4)): + fig, ax = plt.subplots(figsize=figsize, tight_layout=True) + print(gdf_mean_cf) + gdf_mean_cf.plot(ax=ax, column=column, cmap=cmap_wind, legend=True, aspect=None) + gdf_mean_cf.geometry.boundary.plot(ax=ax, color="black", linewidth=0.5) + ax.set_title("Average Capacity Factor\nOnshore Wind") + _blank_axis(ax) + + return fig, ax + + +def _blank_axis(ax): + ax.set_xticks([]) + ax.set_yticks([]) + ax.set_xlabel("") + ax.set_ylabel("") diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index fac5e71..e033f91 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -1,8 +1,10 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" +import _plots import backend_atlite import geopandas as gpd import pandas as pd +import xarray as xr import yaml @@ -36,11 +38,31 @@ def prepare_capacityfactors_point_layout( capacityfactors.to_netcdf(path_output) +def plot(path_capacityfactors, path_spatial_units, path_map): + """Plot capacityfactors.""" + # load inputs + cf = xr.open_dataarray(path_capacityfactors) + spatial_units = gpd.read_file(path_spatial_units) + spatial_units = spatial_units.set_index(spatial_units.columns[0]) + gdf_mean_cf = spatial_units.join( + cf.mean(dim="time").to_dataframe(name="wind_onshore") + ) + + # plot a map of annual capacityfactors + fig, ax = _plots.map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="wind_onshore") + fig.savefig(path_map) + + if __name__ == "__main__": prepare_capacityfactors_point_layout( path_cutout=snakemake.input.cutout, path_spatial_units=snakemake.input.spatial_units, path_tech_specs=snakemake.input.tech_specs, path_layout=snakemake.input.layout, - path_output=snakemake.output[0], + path_output=snakemake.output.data, + ) + plot( + path_output=snakemake.output.data, + path_spatial_units=snakemake.input.spatial_units, + path_map=snakemake.output.plot_map, ) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 606bcfd..763cc6c 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,8 +1,10 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" +import _plots import backend_atlite import geopandas as gpd import rioxarray as rxr +import xarray as xr import yaml @@ -37,11 +39,31 @@ def prepare_capacityfactors_raster_layout( capacityfactors.to_netcdf(path_output) +def plot(path_capacityfactors, path_spatial_units, path_map): + """Plot capacityfactors.""" + # load inputs + cf = xr.open_dataarray(path_capacityfactors) + spatial_units = gpd.read_file(path_spatial_units) + spatial_units = spatial_units.set_index(spatial_units.columns[0]) + gdf_mean_cf = spatial_units.join( + cf.mean(dim="time").to_dataframe(name="wind_onshore") + ) + + # plot a map of annual capacityfactors + fig, ax = _plots.map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="wind_onshore") + fig.savefig(path_map) + + if __name__ == "__main__": prepare_capacityfactors_raster_layout( path_cutout=snakemake.input.cutout, path_spatial_units=snakemake.input.spatial_units, path_tech_specs=snakemake.input.tech_specs, path_layout=snakemake.input.layout, - path_output=snakemake.output[0], + path_output=snakemake.output.data, + ) + plot( + path_capacityfactors=snakemake.output.data, + path_spatial_units=snakemake.input.spatial_units, + path_map=snakemake.output.plot_map, ) From e88b91062be08606f15b8068f98fa41d09841283 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:27:30 +0100 Subject: [PATCH 26/59] Use parquet files for shapes --- tests/integration/Snakefile | 34 ++++++++++--------- workflow/rules/capacity_factors.smk | 4 +-- .../prepare_capacityfactors_point_layout.py | 4 +-- .../prepare_capacityfactors_raster_layout.py | 4 +-- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index a92b20d..291ceb2 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -3,32 +3,32 @@ configfile: workflow.source_path("./test_config.yaml") # Emulate how another workflow might create inputs for this module. -rule copy_external_input: +rule copy_user_resources: message: - "Example of a rule external to your module." + "Copy user resources used in the tests to module." input: layout_points="../files/layout_points_NLD.csv", layout_raster="../files/layout_raster_NLD.tif", - shapes="../files/shapes_NLD.geojson", + shapes="../files/NLD_NUTS2.parquet", cutout="../files/era5.nc", tech_specs="../files/wind_onshore_3MW.yaml", output: layout_points="results/module_pv_wind/resources/user/layout/wind_onshore_point.csv", layout_raster="results/module_pv_wind/resources/user/layout/wind_onshore_raster.tif", - shapes="results/module_pv_wind/resources/user/spatial_units/shapes_NLD.geojson", + shapes="results/module_pv_wind/resources/user/spatial_units/read_parquet.parquet", cutout="results/module_pv_wind/resources/user/cutout_era5-NLD.nc", tech_specs="results/module_pv_wind/resources/user/tech_specs/wind_onshore_3MW.yaml", shell: """ - cp {input.layout_points} {output.layout_points} - cp {input.layout_raster} {output.layout_raster} - cp {input.shapes} {output.shapes} - cp {input.cutout} {output.cutout} - cp {input.tech_specs} {output.tech_specs} - """ + cp {input.layout_points} {output.layout_points} + cp {input.layout_raster} {output.layout_raster} + cp {input.shapes} {output.shapes} + cp {input.cutout} {output.cutout} + cp {input.tech_specs} {output.tech_specs} + """ -# Import the module and configure it. +# Import the module and configure it to use a raster layout. # `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers # `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. module module_pv_wind: @@ -47,12 +47,15 @@ use rule * from module_pv_wind as module_pv_wind_* # Request something from the module rule all_raster: message: - "A test case for your module." + "Create capacity factors for onshore wind based on a raster layout." default_target: True input: - "results/module_pv_wind/results/era5-NLD/shapes_NLD/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", + "results/module_pv_wind/results/era5-NLD/NLD_NUTS2/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", +# Import the module and configure it to use a point layout. +# `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers +# `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. module module_pv_wind: snakefile: "../../workflow/Snakefile" @@ -69,7 +72,6 @@ use rule * from module_pv_wind as module_pv_wind_* # Request something from the module rule all_point: message: - "A test case for your module." - default_target: True + "Create capacity factors for onshore wind based on a point layout." input: - "results/module_pv_wind/results/era5-NLD/shapes_NLD/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", + "results/module_pv_wind/results/era5-NLD/NLD_NUTS2/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 402fa1f..5c826ac 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -5,7 +5,7 @@ if config["layout"] == "raster": cutout=path_cutout, tech_specs="resources/user/tech_specs/{name_tech}.yaml", layout="resources/user/layout/{name_layout}.tif", - spatial_units="resources/user/spatial_units/{name_spatial_units}.geojson", + spatial_units="resources/user/spatial_units/{name_spatial_units}.parquet", output: data="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", plot_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", @@ -21,7 +21,7 @@ elif config["layout"] == "point": cutout=path_cutout, tech_specs="resources/user/tech_specs/{name_tech}.yaml", layout="resources/user/layout/{name_layout}.csv", - spatial_units="resources/user/spatial_units/{name_spatial_units}.geojson", + spatial_units="resources/user/spatial_units/{name_spatial_units}.parquet", output: data="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", plot_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index e033f91..d849cb9 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -19,7 +19,7 @@ def prepare_capacityfactors_point_layout( ): """Prepare capacityfactors aggregated to spatial units weighted by a point layout.""" # load inputs - spatial_units = gpd.read_file(path_spatial_units) + spatial_units = gpd.read_parquet(path_spatial_units) layout = pd.read_csv(path_layout) tech_specs = read_yaml(path_tech_specs) @@ -42,7 +42,7 @@ def plot(path_capacityfactors, path_spatial_units, path_map): """Plot capacityfactors.""" # load inputs cf = xr.open_dataarray(path_capacityfactors) - spatial_units = gpd.read_file(path_spatial_units) + spatial_units = gpd.read_parquet(path_spatial_units) spatial_units = spatial_units.set_index(spatial_units.columns[0]) gdf_mean_cf = spatial_units.join( cf.mean(dim="time").to_dataframe(name="wind_onshore") diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 763cc6c..5d65468 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -19,7 +19,7 @@ def prepare_capacityfactors_raster_layout( ): """Prepare capacityfactors aggregated to spatial units weighted by a raster layout.""" # load inputs - spatial_units = gpd.read_file(path_spatial_units) + spatial_units = gpd.read_parquet(path_spatial_units) tech_specs = read_yaml(path_tech_specs) layout = rxr.open_rasterio(path_layout, masked=True) @@ -43,7 +43,7 @@ def plot(path_capacityfactors, path_spatial_units, path_map): """Plot capacityfactors.""" # load inputs cf = xr.open_dataarray(path_capacityfactors) - spatial_units = gpd.read_file(path_spatial_units) + spatial_units = gpd.read_parquet(path_spatial_units) spatial_units = spatial_units.set_index(spatial_units.columns[0]) gdf_mean_cf = spatial_units.join( cf.mean(dim="time").to_dataframe(name="wind_onshore") From b5d37b30dc7424f0ebad4ae1ea28157ae535889a Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:28:19 +0100 Subject: [PATCH 27/59] Call function with correct argument --- workflow/scripts/prepare_capacityfactors_point_layout.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index d849cb9..413ea53 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -62,7 +62,7 @@ def plot(path_capacityfactors, path_spatial_units, path_map): path_output=snakemake.output.data, ) plot( - path_output=snakemake.output.data, + path_capacityfactors=snakemake.output.data, path_spatial_units=snakemake.input.spatial_units, path_map=snakemake.output.plot_map, ) From bcace4d06677ed2296f00d6bcb9a303d46e95453 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:38:45 +0100 Subject: [PATCH 28/59] Describe interface --- INTERFACE.yaml | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/INTERFACE.yaml b/INTERFACE.yaml index 72104d4..8c2b073 100644 --- a/INTERFACE.yaml +++ b/INTERFACE.yaml @@ -1,20 +1,12 @@ # Module Input-Output structure for automated doc. generation resources: user: - user_message.md: "Example file emulating external files requested from a user." + "cutout_{name_cutout}.nc": Cutout of meteorological data provided by user. + "tech_specs/{name_tech}.yaml": Technology specification of PV/wind. + "layout/{name_layout}.tif": Raster layout file describing the spatial distribution of capacity. + "layout/{name_layout}.parquet": Point layout file describing the spatial distribution of capacity. + "spatial_units/{name_spatial_units}.parquet": Geometries of spatial units (e.g., administrative regions). automatic: - dummy_readme.md: "Example file emulating downloads determined by internal settings." + "cutout_era5.nc": Cutout of meteorological data downloaded from ERA5. results: - combined_text.md: "Example file emulating module results." - -# Wildcard example: -# resources: -# user: -# shapes_{resolution}.geojson: region geometries. -# automatic: -# technology_data.parquet: dataset with technology characteristics. -# results: -# '{resolution}/tech_capacity.parquet': description of output data. -# '{resolution}/results_image.png': description of output image. -# wildcards: -# resolution: description of the wildcard’s purpose. + "{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc": Capacity factors for the specified technology. From 057988939d7812ec4eae4346795ea5c809fc6311 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:20:30 +0100 Subject: [PATCH 29/59] Drop separate plot rule as plots are already created alongside data --- workflow/Snakefile | 1 - workflow/rules/plot.smk | 11 -------- workflow/scripts/plot.py | 57 ---------------------------------------- 3 files changed, 69 deletions(-) delete mode 100644 workflow/rules/plot.smk delete mode 100644 workflow/scripts/plot.py diff --git a/workflow/Snakefile b/workflow/Snakefile index b8dc686..212a31b 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -24,7 +24,6 @@ workflow.source_path("scripts/backend_atlite.py") # Add all your includes here. include: "rules/automatic.smk" include: "rules/capacity_factors.smk" -include: "rules/plot.smk" rule all: diff --git a/workflow/rules/plot.smk b/workflow/rules/plot.smk deleted file mode 100644 index b44f7e5..0000000 --- a/workflow/rules/plot.smk +++ /dev/null @@ -1,11 +0,0 @@ -rule plot: - input: - capacity_factors="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", - shapes="resources/user/spatial_units/{name_spatial_units}.geojson", - output: - output_plot="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.png", - output_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}_map.png", - conda: - "../envs/atlite.yaml" - script: - "../scripts/plot.py" diff --git a/workflow/scripts/plot.py b/workflow/scripts/plot.py deleted file mode 100644 index e0deaba..0000000 --- a/workflow/scripts/plot.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Plot capacity factors.""" - -import geopandas as gpd -import matplotlib.pyplot as plt -import xarray as xr - - -def plot_timeseries(da: xr.DataArray, name: str) -> plt.Figure: - """Plot a time series of capacity factors for a given name.""" - fig, ax = plt.subplots(figsize=(6, 3), layout="constrained") - da.sel(name=name).plot(ax=ax, label=name) - ax.set_title(name) - ax.set_xlabel("Time") - ax.set_ylabel("Capacity factor") - return fig - - -def plot_map(gdf: gpd.GeoDataFrame) -> plt.Figure: - """Plot a map of a GeoDataFrame with capacity factors.""" - fig, ax = plt.subplots(figsize=(4, 3), layout="constrained") - - gdf.plot(ax=ax, column="Capacity factor") - - ax.set_xticks([]) - ax.set_yticks([]) - ax.set_xlabel("") - ax.set_ylabel("") - ax.set_title("Annual average of capacity factor") - - return fig - - -def main(path_capacity_factors, path_shapes, output_plot, output_map): - """Main function to plot capacity factors and save the plots.""" - da = xr.open_dataarray(path_capacity_factors) - shapes = gpd.read_file(path_shapes) - shapes = shapes.set_index(shapes.columns[0]) - - plot_timeseries(da, name="AL") - plt.savefig(output_plot, dpi=300, bbox_inches="tight") - - annual_mean = da.mean("time") - annual_mean = annual_mean.to_dataframe(name="Capacity factor") - annual_mean = annual_mean.join(shapes) - annual_mean = gpd.GeoDataFrame(annual_mean, geometry="geometry", crs=shapes.crs) - - plot_map(annual_mean) - plt.savefig(output_map, dpi=300, bbox_inches="tight") - - -if __name__ == "__main__": - main( - snakemake.input.capacity_factors, - snakemake.input.shapes, - snakemake.output.output_plot, - snakemake.output.output_map, - ) From eec39016206f29a7c70057821d45771dcaccd9f8 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:12:04 +0100 Subject: [PATCH 30/59] Validate schemas of point layout and shapes --- workflow/envs/atlite.yaml | 1 + workflow/scripts/_plots.py | 2 +- workflow/scripts/_schemas.py | 42 +++++++++++++++++++ .../prepare_capacityfactors_point_layout.py | 10 +++-- .../prepare_capacityfactors_raster_layout.py | 8 +++- 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 workflow/scripts/_schemas.py diff --git a/workflow/envs/atlite.yaml b/workflow/envs/atlite.yaml index c2efcba..3de0cf1 100644 --- a/workflow/envs/atlite.yaml +++ b/workflow/envs/atlite.yaml @@ -9,3 +9,4 @@ dependencies: - rioxarray - rasterio - geopandas + - pandera-geopandas=0.24.0 diff --git a/workflow/scripts/_plots.py b/workflow/scripts/_plots.py index 59f92cf..1f7f1a8 100644 --- a/workflow/scripts/_plots.py +++ b/workflow/scripts/_plots.py @@ -25,7 +25,7 @@ def average_capacity_factors( def map_capacity_factor(gdf_mean_cf, column, figsize=(4, 4)): fig, ax = plt.subplots(figsize=figsize, tight_layout=True) - print(gdf_mean_cf) + gdf_mean_cf.plot(ax=ax, column=column, cmap=cmap_wind, legend=True, aspect=None) gdf_mean_cf.geometry.boundary.plot(ax=ax, color="black", linewidth=0.5) ax.set_title("Average Capacity Factor\nOnshore Wind") diff --git a/workflow/scripts/_schemas.py b/workflow/scripts/_schemas.py new file mode 100644 index 0000000..c055f0e --- /dev/null +++ b/workflow/scripts/_schemas.py @@ -0,0 +1,42 @@ +"""Schemas for tabular data used in the workflow.""" + +from pandera.pandas import DataFrameModel, Field, check +from pandera.typing.geopandas import GeoSeries +from pandera.typing.pandas import Index, Series +from shapely.geometry import Point + + +class PointLayout(DataFrameModel): + class Config: + coerce = True + strict = True + + id: Index[int] = Field(unique=True) + "Unique ID for this layout point." + techs: Series[str] + "Technology type" + lat: Series[float] + "Latitude" + lon: Series[float] + "Longitude" + capacity: Series[float] + "Installed capacity" + + +class Shapes(DataFrameModel): + class Config: + coerce = True + strict = False + + shape_id: Series[str] = Field(unique=True) + "Unique ID for this shape." + country_id: Series[str] + "ISO alpha-3 code." + shape_class: Series[str] = Field(isin=["land", "maritime"]) + "Shape classifier" + geometry: GeoSeries[Point] = Field() + "Shape polygon." + + @check("geometry", element_wise=True) + def geom_not_empty(cls, geom): + return (geom is not None) and (not geom.is_empty) and geom.is_valid diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 413ea53..0dc79b3 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -6,6 +6,7 @@ import pandas as pd import xarray as xr import yaml +from _schemas import PointLayout, Shapes def read_yaml(filepath): @@ -20,11 +21,13 @@ def prepare_capacityfactors_point_layout( """Prepare capacityfactors aggregated to spatial units weighted by a point layout.""" # load inputs spatial_units = gpd.read_parquet(path_spatial_units) - layout = pd.read_csv(path_layout) + spatial_units = Shapes.validate(spatial_units) + layout = pd.read_csv(path_layout, index_col=0) + layout = PointLayout.validate(layout) tech_specs = read_yaml(path_tech_specs) # prepare inputs - spatial_units = spatial_units.set_index(spatial_units.columns[0]) + spatial_units = spatial_units.set_index("shape_id") # compute capacityfactors capacityfactors = backend_atlite.cf_agg_from_point_layout( @@ -43,7 +46,8 @@ def plot(path_capacityfactors, path_spatial_units, path_map): # load inputs cf = xr.open_dataarray(path_capacityfactors) spatial_units = gpd.read_parquet(path_spatial_units) - spatial_units = spatial_units.set_index(spatial_units.columns[0]) + spatial_units = Shapes.validate(spatial_units) + spatial_units = spatial_units.set_index("shape_id") gdf_mean_cf = spatial_units.join( cf.mean(dim="time").to_dataframe(name="wind_onshore") ) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 5d65468..b8c8477 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -6,6 +6,7 @@ import rioxarray as rxr import xarray as xr import yaml +from _schemas import Shapes def read_yaml(filepath): @@ -20,11 +21,12 @@ def prepare_capacityfactors_raster_layout( """Prepare capacityfactors aggregated to spatial units weighted by a raster layout.""" # load inputs spatial_units = gpd.read_parquet(path_spatial_units) + spatial_units = Shapes.validate(spatial_units) tech_specs = read_yaml(path_tech_specs) layout = rxr.open_rasterio(path_layout, masked=True) # prepare inputs - spatial_units = spatial_units.set_index(spatial_units.columns[0]) + spatial_units = spatial_units.set_index("shape_id") layout = layout.fillna(0) # compute capacityfactors @@ -44,7 +46,9 @@ def plot(path_capacityfactors, path_spatial_units, path_map): # load inputs cf = xr.open_dataarray(path_capacityfactors) spatial_units = gpd.read_parquet(path_spatial_units) - spatial_units = spatial_units.set_index(spatial_units.columns[0]) + spatial_units = Shapes.validate(spatial_units) + spatial_units = spatial_units.set_index("shape_id") + gdf_mean_cf = spatial_units.join( cf.mean(dim="time").to_dataframe(name="wind_onshore") ) From 9fe6e8b2b36242db74717d01b561e5b3fece980b Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:35:11 +0100 Subject: [PATCH 31/59] Configure examples --- tests/integration/Snakefile | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index 291ceb2..fb87ee5 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -8,21 +8,24 @@ rule copy_user_resources: "Copy user resources used in the tests to module." input: layout_points="../files/layout_points_NLD.csv", - layout_raster="../files/layout_raster_NLD.tif", - shapes="../files/NLD_NUTS2.parquet", + layout_raster="../files/layout_raster_europe.tif", + shapes_nld="../files/NLD_NUTS2_onshore.parquet", + shapes_europe="../files/Europe_NUTS2_onshore.parquet", cutout="../files/era5.nc", tech_specs="../files/wind_onshore_3MW.yaml", output: layout_points="results/module_pv_wind/resources/user/layout/wind_onshore_point.csv", layout_raster="results/module_pv_wind/resources/user/layout/wind_onshore_raster.tif", - shapes="results/module_pv_wind/resources/user/spatial_units/read_parquet.parquet", - cutout="results/module_pv_wind/resources/user/cutout_era5-NLD.nc", + shapes_nld="results/module_pv_wind/resources/user/spatial_units/NLD_NUTS2_onshore.parquet", + shapes_europe="results/module_pv_wind/resources/user/spatial_units/Europe_NUTS2_onshore.parquet", + cutout="results/module_pv_wind/resources/user/cutout_era5.nc", tech_specs="results/module_pv_wind/resources/user/tech_specs/wind_onshore_3MW.yaml", shell: """ cp {input.layout_points} {output.layout_points} cp {input.layout_raster} {output.layout_raster} - cp {input.shapes} {output.shapes} + cp {input.shapes_nld} {output.shapes_nld} + cp {input.shapes_europe} {output.shapes_europe} cp {input.cutout} {output.cutout} cp {input.tech_specs} {output.tech_specs} """ @@ -45,12 +48,19 @@ use rule * from module_pv_wind as module_pv_wind_* # Request something from the module -rule all_raster: +rule nld_raster: message: "Create capacity factors for onshore wind based on a raster layout." default_target: True input: - "results/module_pv_wind/results/era5-NLD/NLD_NUTS2/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", + "results/module_pv_wind/results/era5/NLD_NUTS2_onshore/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", + + +rule europe_raster: + message: + "Create capacity factors for onshore wind based on a raster layout." + input: + "results/module_pv_wind/results/era5/Europe_NUTS2_onshore/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", # Import the module and configure it to use a point layout. @@ -70,8 +80,8 @@ use rule * from module_pv_wind as module_pv_wind_* # Request something from the module -rule all_point: +rule nld_point: message: "Create capacity factors for onshore wind based on a point layout." input: - "results/module_pv_wind/results/era5-NLD/NLD_NUTS2/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", + "results/module_pv_wind/results/era5/NLD_NUTS2_onshore/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", From 7548372be71c041dd2f12d4947bd5f557a3d32f4 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 12 Nov 2025 10:35:48 +0100 Subject: [PATCH 32/59] Extend README --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6213177..3d80401 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,23 @@ # PV and wind capacity factors This data module produces capacity factors for PV and wind at arbitrary spatial resolution. +It is a configurable, modular `snakemake` workflow as part of the [`clio`](https://clio.readthedocs.io/) data modules. +The module uses [atlite](https://atlite.readthedocs.io/) as a backend. +The module runs the following steps: -A modular `snakemake` workflow built for [`clio`](https://clio.readthedocs.io/) data modules. +- Download meteorological reanalysis data (optional, can also be provided by the user). +- Given a technology specification, a capacity layout (raster or point data), and regions for aggregation, the module produces time series that are the weighted average of the capacity factor for each region. +- Outputs are saved as `.nc` files and visualised as maps. ## Using this module This module can be imported directly into any `snakemake` workflow. Please consult the integration example in `tests/integration/Snakefile` for more information. +To use this module, you need to specify the wind or PV technology, provide a capacity layout that is used as weights, and the regions for aggregation. +Meteorological reanalysis data can be either manually placed in the directory `resources/user`, or can be downloaded internally. +Please refer to `INTERFACE.yaml` for a full documentation of the module's interface. + ## Development We use [`pixi`](https://pixi.sh/) as our package manager for development. From 9c882801411103e7a057f2a208bb92213a09365d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 09:36:06 +0000 Subject: [PATCH 33/59] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mkdocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index 61fa02a..6eaf66d 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,6 +1,6 @@ # yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json -site_name: PV and wind area potentials and capacity factors +site_name: PV and wind area potentials and capacity factors site_url: https://module_pv_wind.readthedocs.io/ repo_name: module_pv_wind repo_url: https://github.com/calliope-project/module_pv_wind/ From 7edc44d50278d2eaa802dcc246c03e569b18ad1e Mon Sep 17 00:00:00 2001 From: Stefan Pfenninger Date: Wed, 12 Nov 2025 14:17:29 +0100 Subject: [PATCH 34/59] Commit pixi.lock and update gitignore --- .gitignore | 3 + pixi.lock | 9107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 9110 insertions(+) create mode 100644 pixi.lock diff --git a/.gitignore b/.gitignore index 21787f0..c508d02 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ gurobi.log **/results/* **/temp/* **/tmp/* + +# Manually downloaded test files +tests/files diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000..521ffd8 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,9107 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/bioconda/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.10.0-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h09d1b84_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.12-h4d16d09_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.9-hc46dffc_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.10-hc03379b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.11-hf4fecb4_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.12-hc93afbd_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-25.9.1-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py313h5d5ffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozendict-2.4.6-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.4-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.1-hf516916_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-13.1.2-h87b6fe6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyha191276_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6f5c62b_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-38_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmambapy-2.3.3-py313hda67085_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.0-h61e6d4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.0-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/menuinst-2.4.1-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py313h08cd8bf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py313h54dd161_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py313hf1034c9_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.6-py313h07c4f96_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydot-4.0.1-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.28.0-py313h843e2db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.4-h813ae00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.5-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.10.0-py313h8f79df9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313h79bbab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cbc-2.10.12-h0c75da4_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cgl-0.60.9-h24d7dbf_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-clp-1.17.10-ha5fe85a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-osi-0.108.11-ha2b0f8f_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-utils-2.11.12-hbea9910_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-25.9.1-py313h8f79df9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cpp-expected-1.3.1-h4f10f1e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.17-py313hc37fe24_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.0.0-h669d743_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozendict-2.4.6-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.4-h7542897_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.1-hb9d6e3a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-13.1.2-hcd33d8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.43-h5febe37_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/immutables-0.21-py313hcdf3177_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh5552912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.2-gpl_h46575ef_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-38_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-38_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.5-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hb2c3a21_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.1-he69a767_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-38_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-38_h1b118fd_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmamba-2.3.3-h1370271_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmambapy-2.3.3-py313h7196231_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.60.0-h5c55ec3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsolv-0.7.35-h5f525b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.5-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/menuinst-2.4.1-py313h8f79df9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.18.2-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.4-py313h9771d21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py313h7d16b84_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.1.3-py313h9734d34_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pulp-2.8.0-py313h02cf4f5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pycosat-0.6.6-py313hcdf3177_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydot-4.0.1-py313h8f79df9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.5.post0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.5.post0-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.28.0-py313h2c089d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.4-h382de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simdjson-4.0.7-ha7d2532_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313h6535dbc_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.10.0-py313hfa70ccb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py313hf510273_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd3a4230_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-ha0a29f2_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/conda-25.9.1-py313hfa70ccb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cpp-expected-1.3.1-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.17-py313h927ade5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fmt-12.0.0-h29169d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozendict-2.4.6-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-13.1.2-ha5e8f4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.2.0-h5f2951f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py313h5ea7bf4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyhe2676ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.2-gpl_h26aea39_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-38_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-38_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h1383e82_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h7208af6_11.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.1-hd9c3897_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h1383e82_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-38_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmamba-2.3.3-h5fbfb43_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmambapy-2.3.3-py313h17165e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsolv-0.7.35-h8883371_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.5-hfa2b4ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/menuinst-2.4.1-py313hfe59770_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hbcdf7a0_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.18.2-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.4-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py313hc90dcd4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.1.3-py313h5fd188c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py313h4a748c7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.6-py313h5ea7bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydot-4.0.1-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.4-py313hfa70ccb_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-14.2.5.post0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-cpp-14.2.5.post0-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.28.0-py313hfbe8231_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.14.4-h15e3a1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/simdjson-4.0.7-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.12-hf48077a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.17-h0e40799_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h5bddc39_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + docs: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/bioconda/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.10.0-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h09d1b84_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.12-h4d16d09_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.9-hc46dffc_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.10-hc03379b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.11-hf4fecb4_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.12-hc93afbd_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-25.9.1-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py313h5d5ffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozendict-2.4.6-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.4-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.1-hf516916_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-13.1.2-h87b6fe6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyha191276_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6f5c62b_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-38_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmambapy-2.3.3-py313hda67085_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.0-h61e6d4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.0-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/menuinst-2.4.1-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py313h08cd8bf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py313h54dd161_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py313hf1034c9_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.6-py313h07c4f96_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydot-4.0.1-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.28.0-py313h843e2db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.4-h813ae00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.5-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.10.0-py313h8f79df9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313h79bbab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cbc-2.10.12-h0c75da4_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cgl-0.60.9-h24d7dbf_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-clp-1.17.10-ha5fe85a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-osi-0.108.11-ha2b0f8f_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-utils-2.11.12-hbea9910_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-25.9.1-py313h8f79df9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cpp-expected-1.3.1-h4f10f1e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.17-py313hc37fe24_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.0.0-h669d743_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozendict-2.4.6-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.4-h7542897_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.1-hb9d6e3a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-13.1.2-hcd33d8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.43-h5febe37_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/immutables-0.21-py313hcdf3177_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh5552912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.2-gpl_h46575ef_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-38_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-38_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.5-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hb2c3a21_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.1-he69a767_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-38_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-38_h1b118fd_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmamba-2.3.3-h1370271_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmambapy-2.3.3-py313h7196231_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.60.0-h5c55ec3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsolv-0.7.35-h5f525b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.5-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/menuinst-2.4.1-py313h8f79df9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.18.2-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.4-py313h9771d21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py313h7d16b84_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.1.3-py313h9734d34_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pulp-2.8.0-py313h02cf4f5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pycosat-0.6.6-py313hcdf3177_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydot-4.0.1-py313h8f79df9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.5.post0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.5.post0-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.28.0-py313h2c089d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.4-h382de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simdjson-4.0.7-ha7d2532_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313h6535dbc_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.10.0-py313hfa70ccb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py313hf510273_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd3a4230_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-ha0a29f2_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/conda-25.9.1-py313hfa70ccb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/cpp-expected-1.3.1-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.17-py313h927ade5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fmt-12.0.0-h29169d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozendict-2.4.6-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-13.1.2-ha5e8f4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.2.0-h5f2951f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py313h5ea7bf4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyhe2676ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.2-gpl_h26aea39_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-38_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-38_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h1383e82_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h7208af6_11.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.1-hd9c3897_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h1383e82_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-38_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmamba-2.3.3-h5fbfb43_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmambapy-2.3.3-py313h17165e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsolv-0.7.35-h8883371_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.5-hfa2b4ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/menuinst-2.4.1-py313hfe59770_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hbcdf7a0_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.18.2-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.4-py313hce7ae62_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py313hc90dcd4_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.1.3-py313h5fd188c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py313h4a748c7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.6-py313h5ea7bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydot-4.0.1-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.4-py313hfa70ccb_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-14.2.5.post0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-cpp-14.2.5.post0-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.28.0-py313hfbe8231_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.14.4-h15e3a1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/simdjson-4.0.7-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py313h5ea7bf4_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.12-hf48077a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.17-h0e40799_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h5bddc39_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda + build_number: 8 + sha256: 1a62cd1f215fe0902e7004089693a78347a30ad687781dfda2289cab000e652d + md5: 37e16618af5c4851a3f3d66dd0e11141 + depends: + - libgomp >=7.5.0 + - libwinpthread >=12.0.0.r2.ggc561118da + constrains: + - openmp_impl 9999 + - msys2-conda-epoch <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 49468 + timestamp: 1718213032772 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + md5: aaa2a381ccc56eac91d63b6c1240312f + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + purls: [] + size: 8191 + timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + sha256: a362b4f5c96a0bf4def96be1a77317e2730af38915eb9bec85e2a92836501ed7 + md5: b3f0179590f3c0637b7eb5309898f79e + depends: + - __unix + - hicolor-icon-theme + - librsvg + license: LGPL-3.0-or-later OR CC-BY-SA-3.0 + license_family: LGPL + purls: [] + size: 631452 + timestamp: 1758743294412 +- conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + sha256: e8d87cb66bcc62bc8d8168037b776de962ebf659e45acb1a813debde558f7339 + md5: 5a81866192811f3a0827f5f93e589f02 + depends: + - docutils >=0.3 + - pyparsing + - python >=3.9 + license: EPL-2.0 + purls: + - pkg:pypi/amply?source=hash-mapping + size: 21899 + timestamp: 1734603085333 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types?source=hash-mapping + size: 18074 + timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + sha256: 5b9ef6d338525b332e17c3ed089ca2f53a5d74b7a7b432747d29c6466e39346d + md5: f4e90937bbfc3a4a92539545a37bb448 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/appdirs?source=hash-mapping + size: 14835 + timestamp: 1733754069532 +- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf + md5: 54898d0f524c9dee622d44bbb081a8ab + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/appnope?source=hash-mapping + size: 10076 + timestamp: 1733332433806 +- conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda + sha256: eb68e1ce9e9a148168a4b1e257a8feebffdb0664b557bb526a1e4853f2d2fc00 + md5: 845b38297fca2f2d18a29748e2ece7fa + depends: + - python >=3.9 + license: MIT OR Apache-2.0 + purls: + - pkg:pypi/archspec?source=hash-mapping + size: 50894 + timestamp: 1737352715041 +- conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda + sha256: 67e8c1fde7cd025bc7b3190b83bfe967099672a2bcff8e6864f52abfcc25769b + md5: be47a0ee841e940a9a8eec03c2f776a3 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argparse-dataclass?source=hash-mapping + size: 12203 + timestamp: 1691002812997 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + sha256: 93b14414b3b3ed91e286e1cbe4e7a60c4e1b1c730b0814d1e452a8ac4b9af593 + md5: 8f587de4bcf981e26228f268df374a9b + depends: + - python >=3.9 + constrains: + - astroid >=2,<4 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + size: 28206 + timestamp: 1733250564754 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + sha256: 26ab9386e80bf196e51ebe005da77d57decf6d989b4f34d96130560bc133479c + md5: 6b889f174df1e0f816276ae69281af4d + depends: + - at-spi2-core >=2.40.0,<2.41.0a0 + - atk-1.0 >=2.36.0 + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.1,<3.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 339899 + timestamp: 1619122953439 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + sha256: c4f9b66bd94c40d8f1ce1fad2d8b46534bdefda0c86e3337b28f6c25779f258d + md5: 8cb2fc4cd6cc63f1369cfa318f581cc3 + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.3,<3.0a0 + - xorg-libx11 + - xorg-libxi + - xorg-libxtst + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 658390 + timestamp: 1625848454791 +- conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e + md5: f730d54ba9cd543666d7220c9f7ed563 + depends: + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libstdcxx-ng >=12 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 355900 + timestamp: 1713896169874 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + sha256: b0747f9b1bc03d1932b4d8c586f39a35ac97e7e72fe6e63f2b2a2472d466f3c1 + md5: 57301986d02d30d6805fdce6c99074ee + depends: + - __osx >=11.0 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 347530 + timestamp: 1713896411580 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 + md5: c7944d55af26b6d2d7629e27e9a972c1 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=hash-mapping + size: 60101 + timestamp: 1759762331492 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + depends: + - python >=3.9 + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel?source=hash-mapping + size: 6938256 + timestamp: 1738490268466 +- conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + sha256: 3a0af23d357a07154645c41d035a4efbd15b7a642db397fa9ea0193fd58ae282 + md5: b16e2595d3a9042aa9d570375978835f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/backrefs?source=hash-mapping + size: 143810 + timestamp: 1740887689966 +- pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl + name: beautifulsoup4 + version: 4.14.2 + sha256: 5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515 + requires_dist: + - soupsieve>1.2 + - typing-extensions>=4.0.0 + - cchardet ; extra == 'cchardet' + - chardet ; extra == 'chardet' + - charset-normalizer ; extra == 'charset-normalizer' + - html5lib ; extra == 'html5lib' + - lxml ; extra == 'lxml' + requires_python: '>=3.7.0' +- conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.10.0-py313h78bf25f_0.conda + sha256: cf9a47712ee5f086d7b88bdb2c7d475886213aab945c81d0be4c851ab2c11e18 + md5: 2cb3d25fa279bf0661bc12c5fad99b76 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 397990 + timestamp: 1728503903590 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.10.0-py313h8f79df9_0.conda + sha256: d715a26b2cedd0aaca82983a3582ea9ab662f078b49a4cceb2cc61d025f95bd5 + md5: 953f9d3da2b0358509ea0faec2f2311e + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 397986 + timestamp: 1728503908150 +- conda: https://conda.anaconda.org/conda-forge/win-64/black-24.10.0-py313hfa70ccb_0.conda + sha256: 8f99d23fbcf0ce5fe852e2373e154dac8628497fbee15f0f9f4851a2f5ddc30b + md5: 9e5290e06324d03e6d2e18b410620696 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/black?source=hash-mapping + size: 422911 + timestamp: 1728504578146 +- conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda + sha256: ea5f4c876eff2ed469551b57f1cc889a3c01128bf3e2e10b1fea11c3ef39eac2 + md5: c7eb87af73750d6fd97eff8bbee8cb9c + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/boltons?source=hash-mapping + size: 302296 + timestamp: 1749686302834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h09d1b84_0.conda + sha256: 93eeadb5ef4ae211edb01f4a4d837e4b5ceba8ddaefdd68a0c982503c8cc86d1 + md5: dfd94363b679c74937b3926731ee861a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - libbrotlicommon 1.2.0 h09219d5_0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 367767 + timestamp: 1761592405814 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313h79bbab8_0.conda + sha256: 74cf2c9450519acbdf32bb1ccc0adbd0c50db824ba5da9a27c4ff06d5e6e600b + md5: 213c6812f610efede1b2316540409a65 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + constrains: + - libbrotlicommon 1.2.0 h87ba0bc_0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 359894 + timestamp: 1761592891981 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py313hf510273_0.conda + sha256: 29020d8d62652cdd1c841c4b23563efc2558dc6b97e272f63ee6731e0513df94 + md5: 7cdbffd86ca06b75fee15d2762b3616d + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libbrotlicommon 1.2.0 hc82b238_0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 335623 + timestamp: 1761592891692 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 125061 + timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 + md5: 1077e9333c41ff0be8edd1a5ec0ddace + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 55977 + timestamp: 1757437738856 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb + md5: f7f0d6cc2dc986d42ac2689ec88192be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 206884 + timestamp: 1744127994291 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b + md5: f8cd1beb98240c7edb1a95883360ccfa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 179696 + timestamp: 1744128058734 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda + sha256: bfb7f9f242f441fdcd80f1199edd2ecf09acea0f2bcef6f07d7cbb1a8131a345 + md5: e54200a1cd1fe33d61c9df8d3b00b743 + depends: + - __win + license: ISC + purls: [] + size: 156354 + timestamp: 1759649104842 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 + md5: f9e5fbc24009179e8b0409624691758a + depends: + - __unix + license: ISC + purls: [] + size: 155907 + timestamp: 1759649036195 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 + md5: 09262e66b19567aff4f592fb53b28760 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 978114 + timestamp: 1741554591855 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda + sha256: 00439d69bdd94eaf51656fdf479e0c853278439d22ae151cabf40eb17399d95f + md5: 38f6df8bc8c668417b904369a01ba2e2 + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libcxx >=18 + - libexpat >=2.6.4,<3.0a0 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 896173 + timestamp: 1741554795915 +- conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda + sha256: b9f577bddb033dba4533e851853924bfe7b7c1623d0697df382eef177308a917 + md5: 20e32ced54300292aff690a69c5e7b97 + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 1524254 + timestamp: 1741555212198 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 + md5: 257ae203f1d204107ba389607d375ded + depends: + - python >=3.10 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 160248 + timestamp: 1759648987029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda + sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 + md5: d0616e7935acab407d1543b28c446f6f + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - pycparser + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 298357 + timestamp: 1761202966461 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda + sha256: 1fa69651f5e81c25d48ac42064db825ed1a3e53039629db69f86b952f5ce603c + md5: 050374657d1c7a4f2ea443c0d0cbd9a0 + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - pycparser + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 291376 + timestamp: 1761203583358 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda + sha256: f867a11f42bb64a09b232e3decf10f8a8fe5194d7e3a216c6bac9f40483bd1c6 + md5: 55b44664f66a2caf584d72196aa98af9 + depends: + - pycparser + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 292681 + timestamp: 1761203203673 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 + md5: a22d1fd9bf98827e280a02875d9a007a + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 50965 + timestamp: 1760437331772 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + sha256: c6567ebc27c4c071a353acaf93eb82bb6d9a6961e40692a359045a89a61d02c0 + md5: e76c4ba9e1837847679421b8d549b784 + depends: + - __unix + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=compressed-mapping + size: 91622 + timestamp: 1758270534287 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh7428d3b_0.conda + sha256: 0a008359973e833b568d0a18cf04556b12a4f5182e745dfc8ade32c38fa1fca5 + md5: 4601476ee4ad7ad522e5ffa5a579a48e + depends: + - __win + - colorama + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 92148 + timestamp: 1758270588199 +- conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + sha256: aeefe88574384f212db396a6b16e2980daa298239bce51a096d22317c839d856 + md5: 1eb44fb84e5eef6f73c491890ca0dd4b + depends: + - networkx >=3.4.2 + - numpy >=2.2.3 + - pandas >=2.2.3 + - pandera >=0.22.1 + - pydantic >=2.10.6 + - pydot >=3.0.4 + - python >=3.12 + - pyyaml >=6.0.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/clio-tools?source=hash-mapping + size: 14536 + timestamp: 1741282465165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.12-h4d16d09_4.conda + sha256: f0d30355938591dbb45530f86484e0786b7eae0afdf1790ca3640cf0e7af6899 + md5: 603a1a18878030b5e6793ba558fac972 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-cgl >=0.60,<0.61.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 910494 + timestamp: 1754142617737 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cbc-2.10.12-h0c75da4_4.conda + sha256: 06f84794d2166727af59e991f92ed7ba012b68df36901ebc115d16e9e509593c + md5: 3795d77c93c3b02009f6bbc4b2c8e1aa + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-cgl >=0.60,<0.61.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 799180 + timestamp: 1754142888237 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda + sha256: 267c5349f017dc0264f2207dc7dbcaa723d95156381f93c70d7f5317a2936006 + md5: 1a4baa2f67377e0c55199c0f6fb243c4 + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-cgl >=0.60,<0.61.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl-static + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 3618368 + timestamp: 1753932634209 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.9-hc46dffc_6.conda + sha256: 37aa7b2c010f10e8876cb1d6a8b7671b3b67b289e581dd6b1bbedd38b4b7e918 + md5: e98b685998df1badbaf1245f67b909a3 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 533284 + timestamp: 1754137230937 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cgl-0.60.9-h24d7dbf_6.conda + sha256: 687b53af9a7e82f053eef79461c1aa132501d0546c2e296eb441ff4130135bb0 + md5: 6471c23e2a4d037d30eddbdbcb31fe11 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 439413 + timestamp: 1754137373988 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda + sha256: 1aaa50213704ac118c6c37ee570bcf0b0d070500bc544e07da4400ea20a81abd + md5: f6c0a31bbd15559ae27c11385ff1c360 + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-clp >=1.17,<1.18.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl-static + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 1004850 + timestamp: 1753923034553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.10-hc03379b_3.conda + sha256: b4b3b0920654640adf73413abdb89da78c6452af96a46989bb374bbf56d41a0e + md5: 36a0b880feba1c1a14a37eb95b3d8dd6 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 1151752 + timestamp: 1754133583925 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-clp-1.17.10-ha5fe85a_3.conda + sha256: 8b775adf86a9c9bdbce6a37fdb65f04c593654cf3d94ad59e6d3243000cf6bba + md5: f1c94cb2a0b489a8561e92969c08d57f + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.1.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 914907 + timestamp: 1754133677490 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda + sha256: 82658130feca5915961cd4ea6fdbf2712b6440aedbd7b080bf9a0b8fe4e45e18 + md5: 4fb1c61625995e7d0f14371bc0ba2852 + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-osi >=0.108,<0.109.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl-static + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 3095349 + timestamp: 1753922878665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.11-hf4fecb4_8.conda + sha256: 770252a98ddcaf2a5e448ffabd1cadaf19319fb58c866cbe3f6feb0eb69e242b + md5: 61fcb2852d3f1d6c120a941f66db032c + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 377169 + timestamp: 1762932878027 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-osi-0.108.11-ha2b0f8f_8.conda + sha256: aa204e2b3da30885a6435f81210c0c4b6c4688d9b33f2486f1f74cecb5ea99c6 + md5: 57ecf4592cfcb8fc5806f3ddd241f5fe + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.2.0 + - liblapack >=3.9.0,<4.0a0 + - liblapacke >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 327175 + timestamp: 1762933366954 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd3a4230_8.conda + sha256: a6d0d8599f7c6dc8fa9493e559abfaa61f8be242bafb06da7262acc57456dd7d + md5: 78333717b8afd8d5042f8fdb9ed3374c + depends: + - bzip2 >=1.0.8,<2.0a0 + - coin-or-utils >=2.11,<2.12.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl >=2025.3.0,<2026.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 734170 + timestamp: 1762933137290 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.12-hc93afbd_7.conda + sha256: 22a439b9b20677935dd9810198b6aecedf4fb5ffacc65a59aeac78b98c3aa2c9 + md5: 42539e27d7bf055ea723a66aa381c04b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 664131 + timestamp: 1762926408617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-utils-2.11.12-hbea9910_7.conda + sha256: 51b2a8050ee35e968e1fdf5b71cf116fbcdc88c0163cbb3f311c1accf2cfc997 + md5: 734bf2626447a4dfc6c5ded5279758fc + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libgfortran5 >=15.2.0 + - liblapack >=3.9.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 552350 + timestamp: 1762927004166 +- conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-ha0a29f2_7.conda + sha256: 0e6986f5b901cc27eccafc96239fcbca10f4464dcf9b8a0c05897c7bd7d1a57a + md5: db4aa079aa7ca0de6fb5c15ff058172a + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mkl >=2025.3.0,<2026.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - coincbc * *_metapackage + license: EPL-2.0 + license_family: OTHER + purls: [] + size: 1092135 + timestamp: 1762926768960 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 + md5: 2da13f2b299d8e1995bafbbe9689a2f7 + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/comm?source=hash-mapping + size: 14690 + timestamp: 1753453984907 +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-25.9.1-py313h78bf25f_0.conda + sha256: d03d781eaaf2e80b6b9d6c66050d4f40173e9a92b100e2ae263fab1be06e3aac + md5: c25b066b34adf6db6c6c431b6156453f + depends: + - archspec >=0.2.3 + - boltons >=23.0.0 + - charset-normalizer + - conda-libmamba-solver >=25.4.0 + - conda-package-handling >=2.2.0 + - distro >=1.5.0 + - frozendict >=2.4.2 + - jsonpatch >=1.32 + - menuinst >=2 + - packaging >=23.0 + - platformdirs >=3.10.0 + - pluggy >=1.0.0 + - pycosat >=0.6.3 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - requests >=2.28.0,<3 + - ruamel.yaml >=0.11.14,<0.19 + - setuptools >=60.0.0 + - tqdm >=4 + - truststore >=0.8.0 + - zstandard >=0.19.0 + constrains: + - conda-content-trust >=0.1.1 + - conda-env >=2.6 + - conda-build >=25.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/conda?source=hash-mapping + size: 1222622 + timestamp: 1760108693612 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-25.9.1-py313h8f79df9_0.conda + sha256: 732216d75d4c9de1370320682ecc0d07ec22ffdcfad05c988655eb28f1a66f6e + md5: fa9f80d744b61f5e7f136d10a13fb319 + depends: + - archspec >=0.2.3 + - boltons >=23.0.0 + - charset-normalizer + - conda-libmamba-solver >=25.4.0 + - conda-package-handling >=2.2.0 + - distro >=1.5.0 + - frozendict >=2.4.2 + - jsonpatch >=1.32 + - menuinst >=2 + - packaging >=23.0 + - platformdirs >=3.10.0 + - pluggy >=1.0.0 + - pycosat >=0.6.3 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - requests >=2.28.0,<3 + - ruamel.yaml >=0.11.14,<0.19 + - setuptools >=60.0.0 + - tqdm >=4 + - truststore >=0.8.0 + - zstandard >=0.19.0 + constrains: + - conda-env >=2.6 + - conda-build >=25.9 + - conda-content-trust >=0.1.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/conda?source=hash-mapping + size: 1225859 + timestamp: 1760109153768 +- conda: https://conda.anaconda.org/conda-forge/win-64/conda-25.9.1-py313hfa70ccb_0.conda + sha256: 2f02ccd18f217f4f0198d0c336ab91b2b5671e9075f75e721a2a6eb87490c655 + md5: 9cafdfe2acffbfb7e6727360f2ed46d8 + depends: + - archspec >=0.2.3 + - boltons >=23.0.0 + - charset-normalizer + - conda-libmamba-solver >=25.4.0 + - conda-package-handling >=2.2.0 + - distro >=1.5.0 + - frozendict >=2.4.2 + - jsonpatch >=1.32 + - menuinst >=2 + - packaging >=23.0 + - platformdirs >=3.10.0 + - pluggy >=1.0.0 + - pycosat >=0.6.3 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - requests >=2.28.0,<3 + - ruamel.yaml >=0.11.14,<0.19 + - setuptools >=60.0.0 + - tqdm >=4 + - truststore >=0.8.0 + - zstandard >=0.19.0 + constrains: + - conda-content-trust >=0.1.1 + - conda-env >=2.6 + - conda-build >=25.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/conda?source=hash-mapping + size: 1228725 + timestamp: 1760109422937 +- conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda + sha256: c1b355af599e548c4b69129f4d723ddcdb9f6defb939985731499cee2e26a578 + md5: e52c2a160d6bd0649c9fafdf0c813357 + depends: + - python >=3.9.0,<4.0.0 + - pyyaml >=6.0.0,<7.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/conda-inject?source=hash-mapping + size: 10327 + timestamp: 1717043667069 +- conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda + sha256: 48999a7a6e300075e4ef1c85130614d75429379eea8fe78f18a38a8aab8da384 + md5: d62b8f745ff471d5594ad73605cb9b59 + depends: + - boltons >=23.0.0 + - conda >=24.11 + - libmambapy >=2.0.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/conda-libmamba-solver?source=hash-mapping + size: 41985 + timestamp: 1745834587643 +- conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda + sha256: 8b2b1c235b7cbfa8488ad88ff934bdad25bac6a4c035714681fbff85b602f3f0 + md5: 32c158f481b4fd7630c565030f7bc482 + depends: + - conda-package-streaming >=0.9.0 + - python >=3.9 + - requests + - zstandard >=0.15 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/conda-package-handling?source=hash-mapping + size: 257995 + timestamp: 1736345601691 +- conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda + sha256: 11b76b0be2f629e8035be1d723ccb6e583eb0d2af93bde56113da7fa6e2f2649 + md5: ff75d06af779966a5aeae1be1d409b96 + depends: + - python >=3.9 + - zstandard >=0.15 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/conda-package-streaming?source=hash-mapping + size: 21933 + timestamp: 1751548225624 +- conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda + sha256: 61d31e5181e29b5bcd47e0a5ef590caf0aec3ec1a6c8f19f50b42ed5bdc065d2 + md5: 18dfeef40f049992f4b46b06e6f3b497 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/configargparse?source=hash-mapping + size: 40511 + timestamp: 1748302135421 +- conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 + sha256: 799a515e9e73e447f46f60fb3f9162f437ae1a2a00defddde84282e9e225cb36 + md5: e270fff08907db8691c02a0eda8d38ae + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/connection-pool?source=hash-mapping + size: 8331 + timestamp: 1608581999360 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + sha256: 0d9405d9f2de5d4b15d746609d87807aac10e269072d6408b769159762ed113d + md5: d17488e343e4c5c0bd0db18b3934d517 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: CC0-1.0 + purls: [] + size: 24283 + timestamp: 1756734785482 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cpp-expected-1.3.1-h4f10f1e_0.conda + sha256: a7380056125a29ddc4c4efc4e39670bc8002609c70f143d92df801b42e0b486f + md5: 5cb4f9b93055faf7b6ae76da6123f927 + depends: + - __osx >=11.0 + - libcxx >=19 + license: CC0-1.0 + purls: [] + size: 24960 + timestamp: 1756734870487 +- conda: https://conda.anaconda.org/conda-forge/win-64/cpp-expected-1.3.1-h477610d_0.conda + sha256: cd24ac6768812d53c3b14c29b468cc9a5516b71e1880d67f58d98d9787f4cc3a + md5: 444e9f7d9b3f69006c3af5db59e11364 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: CC0-1.0 + purls: [] + size: 21733 + timestamp: 1756734797622 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + noarch: generic + sha256: 31da683e8a15e2062adfb29c9fb23d4253550a0b3c9be1cd45530f88796b4644 + md5: 367133808e89325690562099851529c8 + depends: + - python >=3.13,<3.14.0a0 + - python_abi * *_cp313 + license: Python-2.0 + purls: [] + size: 48397 + timestamp: 1761175097707 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 437860 + timestamp: 1747855126005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py313h5d5ffb9_0.conda + sha256: 4c12ca7541d488f64ee92d6368e9a0a418e919c0b8c51517ff329b4259b4aaf8 + md5: be318961d544421f4c8d8a91bff4f118 + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2868018 + timestamp: 1758162048107 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.17-py313hc37fe24_0.conda + sha256: ada3d5ab7e33fdefe66b7d21f2a7876e6a00ba6d8866ee1b2101b9a34d1fad66 + md5: 42070edf971f5e14d0f51670ea1fb5e0 + depends: + - python + - __osx >=11.0 + - libcxx >=19 + - python 3.13.* *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2757716 + timestamp: 1758162092566 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.17-py313h927ade5_0.conda + sha256: 83e33b2f0821ef043b502ed7261592eb18a7dcc43ec76213e2888d6fd99973e2 + md5: 9b792915c34565e7856fa9682879ccd2 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 4000809 + timestamp: 1758162072333 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 + md5: 9ce473d1d1be1cc3810856a48b3fab32 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/decorator?source=hash-mapping + size: 14129 + timestamp: 1740385067843 +- conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + sha256: 5603c7d0321963bb9b4030eadabc3fd7ca6103a38475b4e0ed13ed6d97c86f4e + md5: 0a2014fd9860f8b1eaa0b1f3d3771a08 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distro?source=hash-mapping + size: 41773 + timestamp: 1734729953882 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 + md5: abbe8c85619c87c4f4f61b44173434af + depends: + - python >=3.10 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils?source=hash-mapping + size: 436965 + timestamp: 1762425841874 +- conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda + sha256: 74e5def37983c19165beebbbfae4e5494b7cb030e97351114de31dcdbc91b951 + md5: 7b2af124684a994217e62c641bca2e48 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/dpath?source=hash-mapping + size: 21853 + timestamp: 1762165431693 +- pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl + name: editorconfig + version: 0.17.1 + sha256: 1eda9c2c0db8c16dbd50111b710572a5e6de934e39772de1959d41f64fc17c82 + requires_dist: + - mypy>=1.15 ; extra == 'dev' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + sha256: a5b51e491fec22bcc1765f5b2c8fff8a97428e9a5a7ee6730095fb9d091b0747 + md5: 057083b06ccf1c2778344b6dabace38b + depends: + - __glibc >=2.17,<3.0.a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libegl-devel + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libgl-devel + - libglx >=1.7.0,<2.0a0 + - libglx-devel + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 411735 + timestamp: 1758743520805 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + sha256: ba685b87529c95a4bf9de140a33d703d57dc46b036e9586ed26890de65c1c0d5 + md5: 3b87dabebe54c6d66a07b97b53ac5874 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 296347 + timestamp: 1758743805063 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 21284 + timestamp: 1746947398083 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad + md5: ff9efb7f7469aed3c4a8106ffa29593c + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/executing?source=hash-mapping + size: 30753 + timestamp: 1756729456476 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + md5: d90bf58b03d9a958cb4f9d3de539af17 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 197164 + timestamp: 1760369692240 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.0.0-h669d743_0.conda + sha256: 2d14f30be9ef23efd1776166a68f01d7b561b7a04a7846cb0cc5a46021ff82df + md5: 364025d9b6f6305a73f8a5e84a2310d5 + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + size: 179725 + timestamp: 1760370178553 +- conda: https://conda.anaconda.org/conda-forge/win-64/fmt-12.0.0-h29169d4_0.conda + sha256: e9996a61fc171dd16c6a2f71723091c9aa596a3360ced227ae5292b4c43d958c + md5: 538a2d266f27a80a351f15873c3e0de7 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 187703 + timestamp: 1760369874666 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + purls: [] + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + purls: [] + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + purls: [] + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 265599 + timestamp: 1730283881107 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda + sha256: f79d3d816fafbd6a2b0f75ebc3251a30d3294b08af9bb747194121f5efa364bc + md5: 7b29f48742cea5d1ccb5edd839cb5621 + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 234227 + timestamp: 1730284037572 +- conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda + sha256: ed122fc858fb95768ca9ca77e73c8d9ddc21d4b2e13aaab5281e27593e840691 + md5: 9bb0026a2131b09404c59c4290c697cd + depends: + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 192355 + timestamp: 1730284147944 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 + depends: + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e + md5: 4afc585cd97ba8a23809406cd8a9eda8 + depends: + - libfreetype 2.14.1 ha770c72_0 + - libfreetype6 2.14.1 h73754d4_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 173114 + timestamp: 1757945422243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda + sha256: 14427aecd72e973a73d5f9dfd0e40b6bc3791d253de09b7bf233f6a9a190fd17 + md5: 1ec9a1ee7a2c9339774ad9bb6fe6caec + depends: + - libfreetype 2.14.1 hce30654_0 + - libfreetype6 2.14.1 h6da58f4_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 173399 + timestamp: 1757947175403 +- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda + sha256: a9b3313edea0bf14ea6147ea43a1059d0bf78771a1336d2c8282891efc57709a + md5: d69c21967f35eb2ce7f1f85d6b6022d3 + depends: + - libfreetype 2.14.1 h57928b3_0 + - libfreetype6 2.14.1 hdbac1cb_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 184553 + timestamp: 1757946164012 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + sha256: 858283ff33d4c033f4971bf440cebff217d5552a5222ba994c49be990dacd40d + md5: f9f81ea472684d75b9dd8d0b328cf655 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + size: 61244 + timestamp: 1757438574066 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + sha256: d856dc6744ecfba78c5f7df3378f03a75c911aadac803fa2b41a583667b4b600 + md5: 04bdce8d93a4ed181d1d726163c2d447 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + size: 59391 + timestamp: 1757438897523 +- conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + sha256: 15011071ee56c216ffe276c8d734427f1f893f275ef733f728d13f610ed89e6e + md5: c27bd87e70f970010c1c6db104b88b18 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-or-later + purls: [] + size: 64394 + timestamp: 1757438741305 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozendict-2.4.6-py313h07c4f96_1.conda + sha256: 34590ce06700be824c275ab97209287784b6c7244f82e3da8f8b0ec31cf9731d + md5: 38604be480469a12f817f6a9f22d12b3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/frozendict?source=hash-mapping + size: 31344 + timestamp: 1756048072722 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozendict-2.4.6-py313hcdf3177_1.conda + sha256: 2b33347ba4208eaa9784987ac4c5915235455f54b0f8a432381c1c67cd2c7796 + md5: e97127b6918a9307e68ba2b73762c958 + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/frozendict?source=hash-mapping + size: 31640 + timestamp: 1756048167743 +- conda: https://conda.anaconda.org/conda-forge/win-64/frozendict-2.4.6-py313h5ea7bf4_1.conda + sha256: cec61f39e0c4d66d664dd8664dc49cdd00200ea933cb895e7fa6f113632d6a4f + md5: 7a860afc87fc16d78ea8b6200b891a6b + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/frozendict?source=hash-mapping + size: 31732 + timestamp: 1756048162227 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.4-h2b0a6b4_0.conda + sha256: f47222f58839bcc77c15f11a8814c1d8cb8080c5ca6ba83398a12b640fd3c85c + md5: c379d67c686fb83475c1a6ed41cc41ff + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 572093 + timestamp: 1761082340749 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.4-h7542897_0.conda + sha256: 1164ba63360736439c6e50f2d390e93f04df86901e7711de41072a32d9b8bfc9 + md5: 0b349c0400357e701cf2fa69371e5d39 + depends: + - __osx >=11.0 + - libglib >=2.86.0,<3.0a0 + - libintl >=0.25.1,<1.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 544149 + timestamp: 1761082904334 +- conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + sha256: d04c4a6c11daa72c4a0242602e1d00c03291ef66ca2d7cd0e171088411d57710 + md5: 49c36fcad2e9af6b91e91f2ce5be8ebd + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 26238 + timestamp: 1750744808182 +- conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 + md5: 93f742fe078a7b34c29a182958d4d765 + depends: + - python >=3.9 + - python-dateutil >=2.8.1 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/ghp-import?source=hash-mapping + size: 16538 + timestamp: 1734344477841 +- conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + sha256: dbbec21a369872c8ebe23cb9a3b9d63638479ee30face165aa0fccc96e93eec3 + md5: 7c14f3706e099f8fcd47af2d494616cc + depends: + - python >=3.9 + - smmap >=3.0.1,<6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/gitdb?source=hash-mapping + size: 53136 + timestamp: 1735887290843 +- conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + sha256: 12df2c971e98f30f2a9bec8aa96ea23092717ace109d16815eeb4c095f181aa2 + md5: b91d463ea8be13bcbe644ae8bc99c39f + depends: + - gitdb >=4.0.1,<5 + - python >=3.9 + - typing_extensions >=3.10.0.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/gitpython?source=hash-mapping + size: 157875 + timestamp: 1753444241693 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.1-hf516916_2.conda + sha256: 743c57390c289c771a3bc90e27c817322a6dc518a3f00970caf2ee7b09421b46 + md5: b069da7bb5db4edd45e9f8887f10b52e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libglib 2.86.1 h32235b2_2 + license: LGPL-2.1-or-later + purls: [] + size: 115896 + timestamp: 1762787507126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.1-hb9d6e3a_2.conda + sha256: 9356ad36d5a473385770e44a580a435eb7882d32cbe38994a88d8e6b59e1743d + md5: fa094eb162909927c6d5d480485c012c + depends: + - __osx >=11.0 + - libglib 2.86.1 he69a767_2 + - libintl >=0.25.1,<1.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 100487 + timestamp: 1762789333153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c + md5: 2cd94587f3a401ae05e03a6caf09539d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 99596 + timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + sha256: c507ae9989dbea7024aa6feaebb16cbf271faac67ac3f0342ef1ab747c20475d + md5: 0fc46fee39e88bbcf5835f71a9d9a209 + depends: + - __osx >=11.0 + - libcxx >=19 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 81202 + timestamp: 1755102333712 +- conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda + sha256: 5f1714b07252f885a62521b625898326ade6ca25fbc20727cfe9a88f68a54bfd + md5: b785694dd3ec77a011ccf0c24725382b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 96336 + timestamp: 1755102441729 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-13.1.2-h87b6fe6_0.conda + sha256: efbd7d483f3d79b7882515ccf229eceb7f4ff636ea2019044e98243722f428be + md5: 0adddc9b820f596638d8b0ff9e3b4823 + depends: + - __glibc >=2.17,<3.0.a0 + - adwaita-icon-theme + - cairo >=1.18.4,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.42.12,<3.0a0 + - gtk3 >=3.24.43,<4.0a0 + - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgcc >=14 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.84.3,<3.0a0 + - librsvg >=2.58.4,<3.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: EPL-1.0 + license_family: Other + purls: [] + size: 2427887 + timestamp: 1754732581595 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-13.1.2-hcd33d8b_0.conda + sha256: f25e1828d02ebd78214966f483cfca5ac6a7b18824369c748d8cda99c66ff588 + md5: 81ab85a5a8481667660c7ce6e84bd681 + depends: + - __osx >=11.0 + - adwaita-icon-theme + - cairo >=1.18.4,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.42.12,<3.0a0 + - gtk3 >=3.24.43,<4.0a0 + - gts >=0.7.6,<0.8.0a0 + - libcxx >=19 + - libexpat >=2.7.1,<3.0a0 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.84.3,<3.0a0 + - librsvg >=2.58.4,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: EPL-1.0 + license_family: Other + purls: [] + size: 2201370 + timestamp: 1754732518951 +- conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-13.1.2-ha5e8f4b_0.conda + sha256: aef252782fcfd8ebffdcc49c525702db33127535d13d7b00808bbc40919caaed + md5: a1599e42b950661f58f219f3fbe87fde + depends: + - cairo >=1.18.4,<2.0a0 + - getopt-win32 >=0.1,<0.1.1.0a0 + - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.84.3,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: EPL-1.0 + license_family: Other + purls: [] + size: 1208526 + timestamp: 1754732367050 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda + sha256: 004688fbb2c479b200a6d85ef38c3129fcd4ce13537b7ee2371d962b372761c1 + md5: f9f33c65b20e6a61f21714785e3613ec + depends: + - __glibc >=2.17,<3.0.a0 + - at-spi2-atk >=2.38.0,<3.0a0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.4,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - gdk-pixbuf >=2.44.4,<3.0a0 + - glib-tools + - harfbuzz >=11.5.1 + - hicolor-icon-theme + - libcups >=2.3.3,<2.4.0a0 + - libcups >=2.3.3,<3.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxkbcommon >=1.12.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + - wayland >=1.24.0,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxcomposite >=0.4.6,<1.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - xorg-libxinerama >=1.1.5,<1.2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 5587108 + timestamp: 1761327349586 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.43-h5febe37_6.conda + sha256: bd66a3325bf3ce63ada3bf12eaafcfe036698741ee4bb595e83e5fdd3dba9f3d + md5: a99f96906158ebae5e3c0904bcd45145 + depends: + - __osx >=11.0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.4,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fribidi >=1.0.16,<2.0a0 + - gdk-pixbuf >=2.44.4,<3.0a0 + - glib-tools + - harfbuzz >=11.5.1 + - hicolor-icon-theme + - libexpat >=2.7.1,<3.0a0 + - libglib >=2.86.0,<3.0a0 + - libintl >=0.25.1,<1.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 4768791 + timestamp: 1761328318680 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b + md5: 4d8df0b0db060d33c9a702ada998a8fe + depends: + - libgcc-ng >=12 + - libglib >=2.76.3,<3.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 318312 + timestamp: 1686545244763 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + sha256: e0f8c7bc1b9ea62ded78ffa848e37771eeaaaf55b3146580513c7266862043ba + md5: 21b4dd3098f63a74cf2aa9159cbef57d + depends: + - libcxx >=15.0.7 + - libglib >=2.76.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 304331 + timestamp: 1686545503242 +- conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + sha256: b79755d2f9fc2113b6949bfc170c067902bc776e2c20da26e746e780f4f5a2d4 + md5: a41f14768d5e377426ad60c613f2923b + depends: + - libglib >=2.76.3,<3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 188688 + timestamp: 1686545648050 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=compressed-mapping + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda + sha256: 6bd8b22beb7d40562b2889dc68232c589ff0d11a5ad3addd41a8570d11f039d9 + md5: b8690f53007e9b5ee2c2178dd4ac778c + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.1,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 2411408 + timestamp: 1762372726141 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda + sha256: 2f8d95fe1cb655fe3bac114062963f08cc77b31b042027ef7a04ebde3ce21594 + md5: 1c7ff9d458dd8220ac2ee71dd4af1be5 + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libcxx >=19 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1537764 + timestamp: 1762373922469 +- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.2.0-h5f2951f_0.conda + sha256: db73714c7f7e0c47b3b9db9302a83f2deb6f8d6081716d35710ef3c6756af6c3 + md5: e798ef748fc564e42f381d3d276850f0 + depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 1138900 + timestamp: 1762373626704 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_2.tar.bz2 + sha256: 336f29ceea9594f15cc8ec4c45fdc29e10796573c697ee0d57ebb7edd7e92043 + md5: bbf6f174dcd3254e19a2f5d2295ce808 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 13841 + timestamp: 1605162808667 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_2.tar.bz2 + sha256: 286e33fb452f61133a3a61d002890235d1d1378554218ab063d6870416440281 + md5: 237b05b7eb284d7eebc3c5d93f5e4bca + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 13800 + timestamp: 1611053664863 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda + sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d + md5: 7fe569c10905402ed47024fc481bb371 + depends: + - __unix + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/humanfriendly?source=hash-mapping + size: 73563 + timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda + sha256: acdf32d1f9600091f0efc1a4293ad217074c86a96889509d3d04c13ffbc92e5a + md5: d243aef76c0a30e4c89cd39e496ea1be + depends: + - __win + - pyreadline3 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/humanfriendly?source=hash-mapping + size: 74084 + timestamp: 1733928364561 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + sha256: 1d04369a1860a1e9e371b9fc82dd0092b616adcf057d6c88371856669280e920 + md5: 8579b6bb8d18be7c0b27fb08adeeeb40 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 14544252 + timestamp: 1720853966338 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + md5: 53abe63df7e10a6ba605dc5f9f961d36 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 50721 + timestamp: 1760286526795 +- conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py313h07c4f96_2.conda + sha256: 536bb4df2a3c6659d486b253ccac5237d2920dc366ebf7229a1646bbcd849bf4 + md5: 68ad0cf3b5c557b70e06e901f7dd3d6a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/immutables?source=hash-mapping + size: 54664 + timestamp: 1757685467253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/immutables-0.21-py313hcdf3177_2.conda + sha256: 795769b9eb19319ea2f9600703bd9f5a4c13c8cc88dd84d4a38476b261512631 + md5: 3f4e06d0ca82c434c026592bc3133069 + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/immutables?source=hash-mapping + size: 51484 + timestamp: 1757685606874 +- conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py313h5ea7bf4_2.conda + sha256: 17df5396588d3a5e1242fba8591aeed64721d44bd02db61c8d063ffdfdb1af34 + md5: 58dd1828222c60ce8a98aa5331adf073 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/immutables?source=hash-mapping + size: 55645 + timestamp: 1757685872869 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + depends: + - python >=3.9 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 34641 + timestamp: 1747934053147 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=compressed-mapping + size: 13387 + timestamp: 1760831448842 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda + sha256: 33275d537122e67df200203d541170db8b55886667d30cc7262cc1e463b04406 + md5: 044c5249ad8ea18a414d07baa1f369ea + depends: + - decorator + - ipython + - python >=3.9 + - toml >=0.10.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipdb?source=hash-mapping + size: 18713 + timestamp: 1734884952029 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh5552912_0.conda + sha256: b5f7eaba3bb109be49d00a0a8bda267ddf8fa66cc1b54fc5944529ed6f3e8503 + md5: 1849eec35b60082d2bd66b4e36dec2b6 + depends: + - appnope + - __osx + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.0.0 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.2 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 132289 + timestamp: 1761567969884 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh6dadd2b_0.conda + sha256: 75e42103bc3350422896f727041e24767795b214a20f50bf39c371626b8aae8b + md5: f22cb16c5ad68fd33d0f65c8739b6a06 + depends: + - python + - __win + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.0.0 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.2 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 132418 + timestamp: 1761567966860 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyha191276_0.conda + sha256: a9d6b74115dbd62e19017ff8fa4885b07b5164427f262cc15b5307e5aaf3ee73 + md5: c6f63cfe66adaa5650788e3106b6683a + depends: + - python + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.0.0 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio >=1.4 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.2 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 133820 + timestamp: 1761567932044 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda + sha256: b27fb08b14d82e896f35fe5ce889665aabb075bd540f9761c838d1d09a3d9704 + md5: 2d6b86a2e11b8cb2f20a432158ef10b9 + depends: + - __unix + - pexpect >4.3 + - decorator >=4.3.2 + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.1 + - matplotlib-inline >=0.1.5 + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.11.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=hash-mapping + size: 643036 + timestamp: 1762350942197 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyhe2676ad_0.conda + sha256: 3f48685fce2d2d75d24e9b18eba7d6d55f973d56cd4092064c98bb7f95a77dcc + md5: a1ac3cd378490356e0299d0ca95809d1 + depends: + - __win + - colorama >=0.4.4 + - decorator >=4.3.2 + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.1 + - matplotlib-inline >=0.1.5 + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.11.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=hash-mapping + size: 641867 + timestamp: 1762350976678 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 + md5: bd80ba060603cc228d9d81c257093119 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython-pygments-lexers?source=hash-mapping + size: 13993 + timestamp: 1737123723464 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 + md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 + depends: + - parso >=0.8.3,<0.9.0 + - python >=3.9 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/jedi?source=hash-mapping + size: 843646 + timestamp: 1733300981994 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + sha256: f1ac18b11637ddadc05642e8185a851c7fab5998c6f5470d716812fae943b2af + md5: 446bd6c8cb26050d528881df495ce646 + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 112714 + timestamp: 1741263433881 +- pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl + name: jsbeautifier + version: 1.15.4 + sha256: 72f65de312a3f10900d7685557f84cb61a9733c50dcc27271a39f5b0051bf528 + requires_dist: + - six>=1.13.0 + - editorconfig>=0.12.2 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda + sha256: 304955757d1fedbe344af43b12b5467cca072f83cce6109361ba942e186b3993 + md5: cb60ae9cf02b9fcb8004dec4089e5691 + depends: + - jsonpointer >=1.9 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpatch?source=hash-mapping + size: 17311 + timestamp: 1733814664790 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda + sha256: 9174f5209f835cc8918acddc279be919674d874179197e025181fe2a71cb0bce + md5: c1375f38e5f3ee38a9ee0e405a601c35 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 18143 + timestamp: 1756754243113 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda + sha256: 6e6097b156b2c69bcf05842f86a6650eb474477bec5e2233b4b8bcd2936cda5a + md5: 51a61cf0de7b177b4c09fa5eb4775c76 + depends: + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 18604 + timestamp: 1756754452012 +- conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda + sha256: dda25a66128a7b883515a659cd53c694e735374ccfbfa87a998160a33679424a + md5: 8da802c2a92986f7054f97c45e0f4bee + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 43276 + timestamp: 1756754377785 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda + sha256: ac377ef7762e49cb9c4f985f1281eeff471e9adc3402526eea78e6ac6589cf1d + md5: 341fd940c242cf33e832c0402face56f + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.9 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema?source=hash-mapping + size: 81688 + timestamp: 1755595646123 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 + md5: 439cd0f567d697b20a8f45cb70a1005a + depends: + - python >=3.10 + - referencing >=0.31.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications?source=hash-mapping + size: 19236 + timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + sha256: ed709a6c25b731e01563521ef338b93986cd14b5bc17f35e9382000864872ccc + md5: a8db462b01221e9f5135be466faeb3e0 + depends: + - __win + - pywin32 + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 64679 + timestamp: 1760643889625 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a + md5: b38fe4e78ee75def7e599843ef4c1ab0 + depends: + - __unix + - python + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 65503 + timestamp: 1760643864586 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + sha256: 18e8b3430d7d232dad132f574268f56b3eb1a19431d6d5de8c53c29e6c18fa81 + md5: 31aec030344e962fbd7dbbbbd68e60a9 + depends: + - openssl >=3.3.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 712034 + timestamp: 1719463874284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_5.conda + sha256: dab1fbf65abb05d3f2ee49dff90d60eeb2e02039fcb561343c7cea5dea523585 + md5: 511ed8935448c1875776b60ad3daf3a1 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + purls: [] + size: 741516 + timestamp: 1762674665675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff + md5: 9344155d33912347b37f0ae6c410a835 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 264243 + timestamp: 1745264221534 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + sha256: 12361697f8ffc9968907d1a7b5830e34c670e4a59b638117a2cdfed8f63a38f8 + md5: a74332d9b60b62905e3d30709df08bf1 + depends: + - __osx >=11.0 + - libcxx >=18 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 188306 + timestamp: 1745264362794 +- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda + sha256: 868a3dff758cc676fa1286d3f36c3e0101cca56730f7be531ab84dc91ec58e9d + md5: c1b81da6d29a14b542da14a36c9fbf3f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 164701 + timestamp: 1745264384716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + md5: 9d0eaa26e3c5d7af747b3ddee928327b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 884698 + timestamp: 1760610562105 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.2-gpl_h46575ef_100.conda + sha256: db847a255f9c61893f5ee364c194410fcdac57bf819bf1ed6e72c429c1aee055 + md5: 5ab60a0e4c99d6fa08605e0ea91e4fda + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 790591 + timestamp: 1760611525393 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.2-gpl_h26aea39_100.conda + sha256: 23b9bcba5e01fe756eb9aef875ba0237377401489b0238da871ba00ccaad6a95 + md5: ce09b133aaadd32f18a809260ac5c2c8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.4,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1107182 + timestamp: 1760611163870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda + build_number: 38 + sha256: b26a32302194e05fa395d5135699fd04a905c6ad71f24333f97c64874e053623 + md5: 3509b5e2aaa5f119013c8969fdd9a905 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - libcblas 3.9.0 38*_openblas + - blas 2.138 openblas + - liblapacke 3.9.0 38*_openblas + - mkl <2026 + - liblapack 3.9.0 38*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17522 + timestamp: 1761680084434 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-38_h51639a9_openblas.conda + build_number: 38 + sha256: 1850e189ca9b623497b857cf905bb2c8d57c8a42de5aed63a9b0bd857a1af2ae + md5: 90a49011b477170c063b385cbacf9138 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapack 3.9.0 38*_openblas + - libcblas 3.9.0 38*_openblas + - mkl <2026 + - liblapacke 3.9.0 38*_openblas + - blas 2.138 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17695 + timestamp: 1761680554564 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-38_hf2e6a31_mkl.conda + build_number: 38 + sha256: 363920dbd6a4c09f419a4e032568d5468dc9196e8c9e401af4e8026ecf88f2b7 + md5: dcee15907da751895e20b4d1ac94568d + depends: + - mkl >=2025.3.0,<2026.0a0 + constrains: + - blas 2.138 mkl + - liblapacke 3.9.0 38*_mkl + - libcblas 3.9.0 38*_mkl + - liblapack 3.9.0 38*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 66706 + timestamp: 1761680784374 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda + build_number: 38 + sha256: 7fe653f45c01eb16d7b48ad934b068dad2885d6f4a7c41512b6a5f1f522bffe9 + md5: bcd928a9376a215cd9164a4312dd5e98 + depends: + - libblas 3.9.0 38_h4a7cf45_openblas + constrains: + - blas 2.138 openblas + - liblapack 3.9.0 38*_openblas + - liblapacke 3.9.0 38*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17503 + timestamp: 1761680091587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-38_hb0561ab_openblas.conda + build_number: 38 + sha256: 5ab5a9aa350a5838d91f0e4feed30f765cbea461ee9515bf214d459c3378a531 + md5: eab61fcb277d6fa9f059bba437fd3612 + depends: + - libblas 3.9.0 38_h51639a9_openblas + constrains: + - liblapack 3.9.0 38*_openblas + - liblapacke 3.9.0 38*_openblas + - blas 2.138 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17685 + timestamp: 1761680563279 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-38_h2a3cdd5_mkl.conda + build_number: 38 + sha256: f2bec12b960877387e5e8f84af5a50e19e97f52ddb1bed6b93ea38c4fb18ab62 + md5: 0c1602b1d15eb3d4da15bad122740df8 + depends: + - libblas 3.9.0 38_hf2e6a31_mkl + constrains: + - blas 2.138 mkl + - liblapacke 3.9.0 38*_mkl + - liblapack 3.9.0 38*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 67055 + timestamp: 1761680819734 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 + md5: d4a250da4737ee127fb1fa6452a9002e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4523621 + timestamp: 1749905341688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 + md5: 01e149d4a53185622dc2e788281961f2 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 460366 + timestamp: 1762333743748 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + sha256: 2980c5de44ac3ca2ecbd4a00756da1648ea2945d9e4a2ad9f216c7787df57f10 + md5: 791003efe92c17ed5949b309c61a5ab1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 394183 + timestamp: 1762334288445 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda + sha256: 651daa5d2bad505b5c72b1d5d4d8c7fc0776ab420e67af997ca9391b6854b1b3 + md5: cfade9be135edb796837e7d4c288c0fb + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + purls: [] + size: 378897 + timestamp: 1762333969177 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.5-hf598326_0.conda + sha256: cb441b85669eec99a593f59e6bb18c1d8a46d13eebadfc6a55f0b298109bf510 + md5: fbfdbf6e554275d2661c4541f45fed53 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 569449 + timestamp: 1762258167196 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 + md5: 6c77a605a7a689d17d4819c0f8ac9a00 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 73490 + timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 55420 + timestamp: 1761980066242 +- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + sha256: 834e4881a18b690d5ec36f44852facd38e13afe599e369be62d29bd675f107ee + md5: e77030e67343e28b084fabd7db0ce43e + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 156818 + timestamp: 1761979842440 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 + md5: 9314bc5a1fe7d1044dc9dfd3ef400535 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + purls: [] + size: 310785 + timestamp: 1757212153962 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 44840 + timestamp: 1731330973553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + sha256: f6e7095260305dc05238062142fb8db4b940346329b5b54894a90610afa6749f + md5: b513eb83b3137eca1192c34bf4f013a7 + depends: + - __glibc >=2.17,<3.0.a0 + - libegl 1.7.0 ha4b6fd6_2 + - libgl-devel 1.7.0 ha4b6fd6_2 + - xorg-libx11 + license: LicenseRef-libglvnd + purls: [] + size: 30380 + timestamp: 1731331017249 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 74811 + timestamp: 1752719572741 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 65971 + timestamp: 1752719657566 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 141322 + timestamp: 1752719767870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 57821 + timestamp: 1760295480630 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f + md5: 411ff7cd5d1472bba0f55c0faf04453b + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40251 + timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 + md5: ba4ad812d2afc22b9a34ce8327a0930f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 44866 + timestamp: 1760295760649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec + md5: f4084e4e6577797150f9b04a4560ceb0 + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 7664 + timestamp: 1757945417134 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda + sha256: 9de25a86066f078822d8dd95a83048d7dc2897d5d655c0e04a8a54fca13ef1ef + md5: f35fb38e89e2776994131fbf961fa44b + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 7810 + timestamp: 1757947168537 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.1-h57928b3_0.conda + sha256: 2029702ec55e968ce18ec38cc8cf29f4c8c4989a0d51797164dab4f794349a64 + md5: 3235024fe48d4087721797ebd6c9d28c + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 8109 + timestamp: 1757946135015 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + sha256: 4a7af818a3179fafb6c91111752954e29d3a2a950259c14a2fc7ba40a8b03652 + md5: 8e7251989bca326a28f4a5ffbd74557a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 386739 + timestamp: 1757945416744 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda + sha256: cc4aec4c490123c0f248c1acd1aeab592afb6a44b1536734e20937cda748f7cd + md5: 6d4ede03e2a8e20eb51f7f681d2a2550 + depends: + - __osx >=11.0 + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 346703 + timestamp: 1757947166116 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda + sha256: 223710600b1a5567163f7d66545817f2f144e4ef8f84e99e90f6b8a4e19cb7ad + md5: 6e7c5c5ab485057b5d07fd8188ba5c28 + depends: + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 340264 + timestamp: 1757946133889 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 + md5: c0374badb3a5d4b1372db28d19462c53 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 h767d61c_7 + - libgcc-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 822552 + timestamp: 1759968052178 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h1383e82_7.conda + sha256: 174c4c75b03923ac755f227c96d956f7b4560a4b7dd83c0332709c50ff78450f + md5: 926a82fc4fa5b284b1ca1fb74f20dee2 + depends: + - _openmp_mutex >=4.5 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - msys2-conda-epoch <0.0a0 + - libgomp 15.2.0 h1383e82_7 + - libgcc-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 667897 + timestamp: 1759976063036 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad + md5: 280ea6eee9e2ddefde25ff799c4f0363 + depends: + - libgcc 15.2.0 h767d61c_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29313 + timestamp: 1759968065504 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6f5c62b_11.conda + sha256: 19e5be91445db119152217e8e8eec4fd0499d854acc7d8062044fb55a70971cd + md5: 68fc66282364981589ef36868b1a7c78 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.45,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + purls: [] + size: 177082 + timestamp: 1737548051015 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hb2c3a21_11.conda + sha256: be038eb8dfe296509aee2df21184c72cb76285b0340448525664bc396aa6146d + md5: 4581aa3cfcd1a90967ed02d4a9f3db4b + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.45,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + purls: [] + size: 156868 + timestamp: 1737548290283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h7208af6_11.conda + sha256: 485a30af9e710feeda8d5b537b2db1e32e41f29ef24683bbe7deb6f7fd915825 + md5: 2070a706123b2d5e060b226a00e96488 + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.45,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xorg-libxpm >=3.5.17,<4.0a0 + license: GD + license_family: BSD + purls: [] + size: 165838 + timestamp: 1737548342665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + sha256: 9ca24328e31c8ef44a77f53104773b9fe50ea8533f4c74baa8489a12de916f02 + md5: 8621a450add4e231f676646880703f49 + depends: + - libgfortran5 15.2.0 hcd61629_7 + constrains: + - libgfortran-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29275 + timestamp: 1759968110483 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + sha256: e9a5d1208b9dc0b576b35a484d527d9b746c4e65620e0d77c44636033b2245f0 + md5: f699348e3f4f924728e33551b1920f79 + depends: + - libgfortran5 15.2.0 h742603c_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 134016 + timestamp: 1759712902814 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + sha256: e93ceda56498d98c9f94fedec3e2d00f717cbedfc97c49be0e5a5828802f2d34 + md5: f116940d825ffc9104400f0d7f1a4551 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1572758 + timestamp: 1759968082504 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + sha256: 18808697013a625ca876eeee3d86ee5b656f17c391eca4a4bc70867717cc5246 + md5: afccf412b03ce2f309f875ff88419173 + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 764028 + timestamp: 1759712189275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 134712 + timestamp: 1731330998354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + sha256: e281356c0975751f478c53e14f3efea6cd1e23c3069406d10708d6c409525260 + md5: 53e7cbb2beb03d69a478631e23e340e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgl 1.7.0 ha4b6fd6_2 + - libglx-devel 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 113911 + timestamp: 1731331012126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_2.conda + sha256: fc82277d0d6340743732c48dcbac3f4e9ee36902649a7d9a02622b0713ce3666 + md5: 986dcf488a1aced411da84753d93d078 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.1 *_2 + license: LGPL-2.1-or-later + purls: [] + size: 3933707 + timestamp: 1762787455198 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.1-he69a767_2.conda + sha256: ea49abd747b91cddf555f4ccd184cee8c1916363a78d4a7fe24b24d1163423c6 + md5: 6d6f8c7d3a52e2c193fb2f9ba2e0ef0b + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.1 *_2 + license: LGPL-2.1-or-later + purls: [] + size: 3661248 + timestamp: 1762789184977 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.1-hd9c3897_2.conda + sha256: d3316c26e2a84a5f38eab2e113feb484522a31dc2a9b75f9f35eefb5821f69ba + md5: 1f3effb70f1bb9dcdc469d03522bbe2e + depends: + - libffi >=3.5.2,<3.6.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - glib 2.86.1 *_2 + license: LGPL-2.1-or-later + purls: [] + size: 3789588 + timestamp: 1762787475745 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + purls: [] + size: 132463 + timestamp: 1731330968309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + purls: [] + size: 75504 + timestamp: 1731330988898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + sha256: 0a930e0148ab6e61089bbcdba25a2e17ee383e7de82e7af10cc5c12c82c580f3 + md5: 27ac5ae872a21375d980bd4a6f99edf3 + depends: + - __glibc >=2.17,<3.0.a0 + - libglx 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-xorgproto + license: LicenseRef-libglvnd + purls: [] + size: 26388 + timestamp: 1731331003255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca + md5: f7b4d76975aac7e5d9e6ad13845f92fe + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 447919 + timestamp: 1759967942498 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h1383e82_7.conda + sha256: b8b569a9d3ec8f13531c220d3ad8e1ff35c75902c89144872e7542a77cb8c10d + md5: 7f970a7f9801622add7746aa3cbc24d5 + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - msys2-conda-epoch <0.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 535898 + timestamp: 1759975963604 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + sha256: 266dfe151066c34695dbdc824ba1246b99f016115ef79339cbcf005ac50527c1 + md5: b0cac6e5b06ca5eeb14b4f7cf908619f + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2414731 + timestamp: 1757624335056 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + purls: [] + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + purls: [] + size: 696926 + timestamp: 1754909290005 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 90957 + timestamp: 1751558394144 +- conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + sha256: c7e4600f28bcada8ea81456a6530c2329312519efcf0c886030ada38976b0511 + md5: 2cf0cf76cc15d360dfa2f17fd6cf9772 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 95568 + timestamp: 1723629479451 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 + md5: 8397539e3a0bbd1695584fb4f927485a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 633710 + timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f + md5: f0695fbecf1006f27f4395d64bd0c4b8 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 551197 + timestamp: 1762095054358 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda + sha256: 795e2d4feb2f7fc4a2c6e921871575feb32b8082b5760726791f080d1e2c2597 + md5: 56a686f92ac0273c0f6af58858a3f013 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 841783 + timestamp: 1762094814336 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda + build_number: 38 + sha256: 63d6073dd4f82ab46943ad99a22fc4edda83b0f8fe6170bdaba7a43352bed007 + md5: 88f10bff57b423a3fd2d990c6055771e + depends: + - libblas 3.9.0 38_h4a7cf45_openblas + constrains: + - libcblas 3.9.0 38*_openblas + - blas 2.138 openblas + - liblapacke 3.9.0 38*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17501 + timestamp: 1761680098660 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-38_hd9741b5_openblas.conda + build_number: 38 + sha256: df4f43d2ba45b7b80a45e8c0e51d3d7675a00047089beea7dc54e685825df9f6 + md5: 4525f30079caf1a2290538c2c531f354 + depends: + - libblas 3.9.0 38_h51639a9_openblas + constrains: + - liblapacke 3.9.0 38*_openblas + - blas 2.138 openblas + - libcblas 3.9.0 38*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17709 + timestamp: 1761680572118 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-38_hf9ab0e9_mkl.conda + build_number: 38 + sha256: 3b8d2d800f48fb9045a976c5a10cefe742142df88decf5a5108fe6b7c8fb5b50 + md5: eb3167046ffba0ceb4a8824fb1b79a69 + depends: + - libblas 3.9.0 38_hf2e6a31_mkl + constrains: + - blas 2.138 mkl + - liblapacke 3.9.0 38*_mkl + - libcblas 3.9.0 38*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 79298 + timestamp: 1761680854566 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-38_h6ae95b6_openblas.conda + build_number: 38 + sha256: 27c19cce8b741f18630a7dffce02d4650cee402e3d1862c3171ccb99a78ea4cd + md5: 2fc2296edb9a6b0ae29467d83dcd2ccb + depends: + - libblas 3.9.0 38_h4a7cf45_openblas + - libcblas 3.9.0 38_h0358290_openblas + - liblapack 3.9.0 38_h47877c9_openblas + constrains: + - blas 2.138 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17511 + timestamp: 1761680105884 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-38_h1b118fd_openblas.conda + build_number: 38 + sha256: 05f2bcd60150969d21a93e88469ed578053477b411c86167338f61e3ad9e58ca + md5: 6e824381db695040581cec05c891b091 + depends: + - libblas 3.9.0 38_h51639a9_openblas + - libcblas 3.9.0 38_hb0561ab_openblas + - liblapack 3.9.0 38_hd9741b5_openblas + constrains: + - blas 2.138 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17720 + timestamp: 1761680583534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 104935 + timestamp: 1749230611612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_1.conda + sha256: e167c10b021ab30838f10a2e165a8c3febad74e46d14d95be26e05fcaecf0b23 + md5: 56b2c9e25ad3d5b9d152d3d222447309 + depends: + - cpp-expected >=1.3.1,<1.3.2.0a0 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - reproc-cpp >=14.2,<15.0a0 + - libcurl >=8.14.1,<9.0a0 + - fmt >=12.0.0,<12.1.0a0 + - libarchive >=3.8.2,<3.9.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - simdjson >=4.0.7,<4.1.0a0 + - nlohmann_json-abi ==3.12.0 + - libsolv >=0.7.35,<0.8.0a0 + - reproc >=14.2,<15.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2490929 + timestamp: 1760729597537 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmamba-2.3.3-h1370271_2.conda + sha256: e8fd538a86be3d8cd59a1000e7d4b12cc59b4677f25cb8f29ef0ce7ef3e96684 + md5: 4a62b38ff1856f01d17f4d6f0810618e + depends: + - cpp-expected >=1.3.1,<1.3.2.0a0 + - __osx >=11.0 + - libcxx >=19 + - libsolv >=0.7.35,<0.8.0a0 + - simdjson >=4.0.7,<4.1.0a0 + - libarchive >=3.8.2,<3.9.0a0 + - fmt >=12.0.0,<12.1.0a0 + - reproc >=14.2,<15.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - reproc-cpp >=14.2,<15.0a0 + - nlohmann_json-abi ==3.12.0 + - openssl >=3.5.4,<4.0a0 + - libcurl >=8.14.1,<9.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1643793 + timestamp: 1760967438157 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmamba-2.3.3-h5fbfb43_1.conda + sha256: 9a4477c2160030bdbe61a4edc30ce0cbe5d154efe3c34468a4fbfb9d063b8d39 + md5: 8fec357a87b474ae290437f11ac301eb + depends: + - cpp-expected >=1.3.1,<1.3.2.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - openssl >=3.5.4,<4.0a0 + - nlohmann_json-abi ==3.12.0 + - simdjson >=4.0.7,<4.1.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - libarchive >=3.8.2,<3.9.0a0 + - zstd >=1.5.7,<1.6.0a0 + - reproc-cpp >=14.2,<15.0a0 + - reproc >=14.2,<15.0a0 + - libsolv >=0.7.35,<0.8.0a0 + - libcurl >=8.14.1,<9.0a0 + - fmt >=12.0.0,<12.1.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5123368 + timestamp: 1760729705250 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmambapy-2.3.3-py313hda67085_1.conda + sha256: 69537a88f9663dabcf35f70ae779c317f56b504f58ea73006df6eb4cc3d414f8 + md5: 43d1543c08b6aeb7f52f45b4df1e9a97 + depends: + - python + - libmamba ==2.3.3 h09abcb8_1 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + - fmt >=12.0.0,<12.1.0a0 + - nlohmann_json-abi ==3.12.0 + - libmamba >=2.3.3,<2.4.0a0 + - openssl >=3.5.4,<4.0a0 + - pybind11-abi ==4 + - zstd >=1.5.7,<1.6.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/libmambapy?source=hash-mapping + size: 778838 + timestamp: 1760729597546 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmambapy-2.3.3-py313h7196231_2.conda + sha256: d878495fdb4441d486f359b4cdbd7e3912dc2554afb1073d5b46fa7237520625 + md5: 97e6f195bd0c0440ed885886f74db103 + depends: + - python >=3.10 + - libmamba ==2.3.3 h1370271_2 + - python 3.13.* *_cp313 + - libcxx >=19 + - __osx >=11.0 + - fmt >=12.0.0,<12.1.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + - zstd >=1.5.7,<1.6.0a0 + - pybind11-abi ==11 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - nlohmann_json-abi ==3.12.0 + - libmamba >=2.3.3,<2.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/libmambapy?source=hash-mapping + size: 729450 + timestamp: 1760967438164 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmambapy-2.3.3-py313h17165e1_1.conda + sha256: 7dafe8b40b98c7971e73d2ccb9db64c06464cd67d1529d6dc525001687b39ac0 + md5: f70239e7f93998c4309e91cd20d2648a + depends: + - python + - libmamba ==2.3.3 h5fbfb43_1 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.13.* *_cp313 + - libmamba >=2.3.3,<2.4.0a0 + - nlohmann_json-abi ==3.12.0 + - pybind11-abi ==4 + - openssl >=3.5.4,<4.0a0 + - fmt >=12.0.0,<12.1.0a0 + - yaml-cpp >=0.8.0,<0.9.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/libmambapy?source=hash-mapping + size: 504223 + timestamp: 1760729705264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 91183 + timestamp: 1748393666725 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 71829 + timestamp: 1748393749336 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 88657 + timestamp: 1723861474602 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 + md5: b499ce4b026493a13774bcf0f4c33849 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 666600 + timestamp: 1756834976695 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + sha256: a07cb53b5ffa2d5a18afc6fd5a526a5a53dd9523fbc022148bd2f9395697c46d + md5: a4b4dd73c67df470d091312ab87bf6ae + depends: + - __osx >=11.0 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 575454 + timestamp: 1756835746393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda + sha256: 200899e5acc01fa29550d2782258d9cf33e55ce4cbce8faed9c6fe0b774852aa + md5: ac2e4832427d6b159576e8a68305c722 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5918287 + timestamp: 1761748180250 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda + sha256: dcc626c7103503d1dfc0371687ad553cb948b8ed0249c2a721147bdeb8db4a73 + md5: a18a7f471c517062ee71b843ef95eb8a + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4285762 + timestamp: 1761749506256 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 + md5: 70e3400cbbfa03e96dcde7fc13e38c7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 28424 + timestamp: 1749901812541 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + sha256: e75a2723000ce3a4b9fd9b9b9ce77553556c93e475a4657db6ed01abc02ea347 + md5: 7af8e91b0deb5f8e25d1a595dea79614 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 317390 + timestamp: 1753879899951 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda + sha256: a2e0240fb0c79668047b528976872307ea80cb330baf8bf6624ac2c6443449df + md5: 4d0f5ce02033286551a32208a5519884 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 287056 + timestamp: 1753879907258 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda + sha256: e84b041f91c94841cb9b97952ab7f058d001d4a15ed4ce226ec5fdb267cc0fa5 + md5: 3ae6e9f5c47c495ebeed95651518be61 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 382709 + timestamp: 1753879944850 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.0-h61e6d4b_0.conda + sha256: 960b137673b2b8293e2a12d194add72967b3bf12fcdf691e7ad8bd5c8318cec3 + md5: 91e6d4d684e237fba31b9815c4b40edf + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - gdk-pixbuf >=2.44.3,<3.0a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libxml2-16 >=2.14.6 + - pango >=1.56.4,<2.0a0 + constrains: + - __glibc >=2.17 + license: LGPL-2.1-or-later + purls: [] + size: 3421977 + timestamp: 1759327942156 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.60.0-h5c55ec3_0.conda + sha256: ca5a2de5d3f68e8d6443ea1bf193c1596a278e6f86018017c0ccd4928eaf8971 + md5: 05ad1d6b6fb3b384f7a07128025725cb + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - gdk-pixbuf >=2.44.3,<3.0a0 + - libglib >=2.86.0,<3.0a0 + - libxml2-16 >=2.14.6 + - pango >=1.56.4,<2.0a0 + constrains: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + size: 2344343 + timestamp: 1759328503184 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + sha256: 7bcb3edccea30f711b6be9601e083ecf4f435b9407d70fc48fbcf9e5d69a0fc6 + md5: 198bb594f202b205c7d18b936fa4524f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: ISC + purls: [] + size: 202344 + timestamp: 1716828757533 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + sha256: 2fc2cdc8ea4dfd9277ae910fa3cfbf342d7890837a2002cf427fd306a869150b + md5: 21769ce326958ec230cdcbd0f2ad97eb + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 518374 + timestamp: 1754325691186 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsolv-0.7.35-h5f525b2_0.conda + sha256: 6da97a1c572659c2be3c3f2f39d9238dac5af2b1fd546adf2b735b0fda2ed8ec + md5: b7ffc6dc926929b9b35af5084a761f26 + depends: + - libcxx >=19 + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 428408 + timestamp: 1754325703193 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsolv-0.7.35-h8883371_0.conda + sha256: 80ccb7857fa2b60679a5209ca04334c86c46a441e8f4f2859308b69f8e1e928a + md5: 987be7025314bcfe936de3f0e91082b5 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 466924 + timestamp: 1754325716718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 + md5: 729a572a3ebb8c43933b30edcc628ceb + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 945576 + timestamp: 1762299687230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + sha256: b43d198f147f46866e5336c4a6b91668beef698bfba69d1706158460eadb2c1b + md5: 5fb1945dbc6380e6fe7e939a62267772 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 909508 + timestamp: 1762300078624 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + sha256: 2373bd7450693bd0f624966e1bee2f49b0bf0ffbc114275ed0a43cf35aec5b21 + md5: d2c9300ebd2848862929b18c264d1b1e + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1292710 + timestamp: 1762299749044 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304790 + timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09 + md5: 9dce2f112bfd3400f4f432b3d0ac07b2 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 292785 + timestamp: 1745608759342 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 + md5: 5b767048b1b3ee9a954b06f4084f93dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 h767d61c_7 + constrains: + - libstdcxx-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3898269 + timestamp: 1759968103436 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f + md5: f627678cf829bd70bccf141a19c3ad3e + depends: + - libstdcxx 15.2.0 h8f9b012_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29343 + timestamp: 1759968157195 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 + md5: cd5a90476766d53e901500df9215e927 + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 435273 + timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f + md5: e2a72ab2fa54ecb6abab2b26cde93500 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 373892 + timestamp: 1762022345545 +- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda + sha256: f1b8cccaaeea38a28b9cd496694b2e3d372bb5be0e9377c9e3d14b330d1cba8a + md5: 549845d5133100142452812feb9ba2e8 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 993166 + timestamp: 1762022118895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 + md5: 80c07c68d2f6870250959dcc95b209d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 37135 + timestamp: 1758626800002 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b + md5: aea31d2e5b1091feca96fcfe945c3cf9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 429011 + timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd + md5: e5e7d467f80da752be17796b87fe6385 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 294974 + timestamp: 1752159906788 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + sha256: 7b6316abfea1007e100922760e9b8c820d6fc19df3f42fb5aca684cfacb31843 + md5: f9bbae5e2537e3b06e0f7310ba76c893 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 279176 + timestamp: 1752159543911 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + purls: [] + size: 36621 + timestamp: 1759768399557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + sha256: 08dec73df0e161c96765468847298a420933a36bc4f09b50e062df8793290737 + md5: a69bbf778a462da324489976c84cfc8c + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - pthread-stubs + - ucrt >=10.0.20348.0 + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 1208687 + timestamp: 1727279378819 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.0-hca5e8e5_0.conda + sha256: 576ce5378cc6a2b722ff33d2359ccb74dea1e6465daa45116e57550f1eb4ba7e + md5: aa65b4add9574bb1d23c76560c5efd4c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + purls: [] + size: 843995 + timestamp: 1762341607312 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 + md5: e512be7dc1f84966d50959e900ca121f + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 ha9997c6_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 45283 + timestamp: 1761015644057 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + sha256: c409e384ddf5976a42959265100d6b2c652017d250171eb10bae47ef8166193f + md5: fb5ce61da27ee937751162f86beba6d1 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h0ff4647_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 40607 + timestamp: 1761016108361 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda + sha256: fb51b91a01eac9ee5e26c67f4e081f09f970c18a3da5231b8172919a1e1b3b6b + md5: 87116b9de9c1825c3fd4ef92c984877b + depends: + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h06f855e_0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 43042 + timestamp: 1761016261024 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 + md5: e7733bc6785ec009e47a224a71917e84 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + purls: [] + size: 556302 + timestamp: 1761015637262 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + sha256: ebe2dd9da94280ad43da936efa7127d329b559f510670772debc87602b49b06d + md5: 438c97d1e9648dd7342f86049dd44638 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + purls: [] + size: 464952 + timestamp: 1761016087733 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda + sha256: 3f65ea0f04c7738116e74ca87d6e40f8ba55b3df31ef42b8cb4d78dd96645e90 + md5: 4a5ea6ec2055ab0dfd09fd0c498f834a + depends: + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + purls: [] + size: 518616 + timestamp: 1761016240185 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.5-h4a912ad_0.conda + sha256: a9707045db6a1b9dc2b196f02c3e31d72fe3dbab4ebc4976f3b913c26394dca0 + md5: 9ae7847a3bef5e050f3921260032033c + depends: + - __osx >=11.0 + constrains: + - intel-openmp <0.0a0 + - openmp 21.1.5|21.1.5.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 285516 + timestamp: 1762315951771 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.5-hfa2b4ca_0.conda + sha256: 8c5106720e5414f48344fd28eae4db4f1a382336d8a0f30f71d41d8ae730fbb6 + md5: 3bd3154b24a1b9489d4ab04d62ffcc86 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - openmp 21.1.5|21.1.5.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 347688 + timestamp: 1762315988146 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148824 + timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + sha256: 632cf3bdaf7a7aeb846de310b6044d90917728c73c77f138f08aa9438fc4d6b5 + md5: 0b69331897a92fac3d8923549d48d092 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 139891 + timestamp: 1733741168264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 + md5: 45161d96307e3a447cc3eb5896cf6f8c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 191060 + timestamp: 1753889274283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda + sha256: db40fd25c6306bfda469f84cddd8b5ebb9aa08d509cecb49dfd0bb8228466d0c + md5: e56eaa1beab0e7fed559ae9c0264dd88 + depends: + - __osx >=11.0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 152755 + timestamp: 1753889267953 +- conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + sha256: 344f4f225c6dfb523fb477995545542224c37a5c86161f053a1a18fe547aa979 + md5: c5cb4159f0eea65663b31dd1e49bbb71 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 165589 + timestamp: 1753889311940 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda + sha256: 32af5d32e3193b7c0ea02c33cc8753bfc0965d07e1aa58418a851d0bb94a7792 + md5: 934afb77580165027b869d4104ee002f + depends: + - importlib-metadata >=4.4 + - python >=3.10 + - python + license: BSD-3-Clause + purls: + - pkg:pypi/markdown?source=hash-mapping + size: 85401 + timestamp: 1762856570927 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda + sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 + md5: c14389156310b8ed3520d84f854be1ee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 25909 + timestamp: 1759055357045 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda + sha256: e06902a1bf370fdd4ada0a8c81c504868fdb7e9971b72c6bd395aa4e5a497bd2 + md5: 3df5979cc0b761dda0053ffdb0bca3ea + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 25778 + timestamp: 1759055530601 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda + sha256: 988d14095c1392e055fd75e24544da2db01ade73b0c2f99ddc8e2b8678ead4cc + md5: 47eaaa4405741beb171ea6edc6eaf874 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 28959 + timestamp: 1759055685616 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + sha256: 9d690334de0cd1d22c51bc28420663f4277cfa60d34fa5cad1ce284a13f1d603 + md5: 00e120ce3e40bad7bfc78861ce3c4a25 + depends: + - python >=3.10 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/matplotlib-inline?source=compressed-mapping + size: 15175 + timestamp: 1761214578417 +- conda: https://conda.anaconda.org/conda-forge/linux-64/menuinst-2.4.1-py313h78bf25f_0.conda + sha256: ae07f4579fe134c3cb58c48d094b68225f7a6932b59fafc3bd8bfaa55eea65be + md5: e5b8f37425983507c3c2d6e7073c3d08 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause AND MIT + purls: + - pkg:pypi/menuinst?source=hash-mapping + size: 180827 + timestamp: 1761299857535 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/menuinst-2.4.1-py313h8f79df9_0.conda + sha256: cb66098c9d3a2a47a4ccc5d61f05438d3a721239accbddd2ce3161ecdd9a5a4f + md5: c66eca9bb2f562fcb8ad652df8f13b1a + depends: + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause AND MIT + purls: + - pkg:pypi/menuinst?source=hash-mapping + size: 181631 + timestamp: 1761300301427 +- conda: https://conda.anaconda.org/conda-forge/win-64/menuinst-2.4.1-py313hfe59770_0.conda + sha256: ba16f52542bf07e217413afcacd24013f6ccd41c322d44c28215c961907242ed + md5: d396ce851ba054808b68accc1eda898d + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause AND MIT + purls: + - pkg:pypi/menuinst?source=hash-mapping + size: 174013 + timestamp: 1761300214367 +- conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + sha256: e5b555fd638334a253d83df14e3c913ef8ce10100090e17fd6fb8e752d36f95d + md5: d9a8fc1f01deae61735c88ec242e855c + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mergedeep?source=hash-mapping + size: 11676 + timestamp: 1734157119152 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + sha256: 902d2e251f9a7ffa7d86a3e62be5b2395e28614bd4dbe5f50acf921fd64a8c35 + md5: 14661160be39d78f2b210f2cc2766059 + depends: + - click >=7.0 + - colorama >=0.4 + - ghp-import >=1.0 + - importlib-metadata >=4.4 + - jinja2 >=2.11.1 + - markdown >=3.3.6 + - markupsafe >=2.0.1 + - mergedeep >=1.3.4 + - mkdocs-get-deps >=0.2.0 + - packaging >=20.5 + - pathspec >=0.11.1 + - python >=3.9 + - pyyaml >=5.1 + - pyyaml-env-tag >=0.1 + - watchdog >=2.0 + constrains: + - babel >=2.9.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/mkdocs?source=hash-mapping + size: 3524754 + timestamp: 1734344673481 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + sha256: e0b501b96f7e393757fb2a61d042015966f6c5e9ac825925e43f9a6eafa907b6 + md5: 84382acddb26c27c70f2de8d4c830830 + depends: + - importlib-metadata >=4.3 + - mergedeep >=1.3.4 + - platformdirs >=2.2.0 + - python >=3.9 + - pyyaml >=5.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mkdocs-get-deps?source=hash-mapping + size: 14757 + timestamp: 1734353035244 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda + sha256: c14cfff88be4ea779071f1ddb9c1944fa7d2a2c7f9ea09b8e0b9f5b84a70e6c1 + md5: 0ee60d02b6ffe184d355e1318d7e9207 + depends: + - python >=3.10 + - jinja2 >=3.0,<4.dev0 + - markdown >=3.2,<4.dev0 + - mkdocs >=1.6,<2.dev0 + - mkdocs-material-extensions >=1.3,<2.dev0 + - pygments >=2.16,<3.dev0 + - pymdown-extensions >=10.2,<11.dev0 + - babel >=2.10,<3.dev0 + - colorama >=0.4,<1.dev0 + - paginate >=0.5,<1.dev0 + - backrefs >=5.7.post1,<6.dev0 + - requests >=2.26,<3.dev0 + - python + license: MIT + purls: + - pkg:pypi/mkdocs-material?source=hash-mapping + size: 4793171 + timestamp: 1762865411798 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + sha256: f62955d40926770ab65cc54f7db5fde6c073a3ba36a0787a7a5767017da50aa3 + md5: de8af4000a4872e16fb784c649679c8e + depends: + - python >=3.9 + constrains: + - mkdocs-material >=5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mkdocs-material-extensions?source=hash-mapping + size: 16122 + timestamp: 1734641109286 +- pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl + name: mkdocs-mermaid2-plugin + version: 1.2.3 + sha256: 33f60c582be623ed53829a96e19284fc7f1b74a1dbae78d4d2e47fe00c3e190d + requires_dist: + - beautifulsoup4>=4.6.3 + - jsbeautifier + - mkdocs>=1.0.4 + - pymdown-extensions>=8.0 + - requests + - setuptools>=18.5 + - mkdocs-macros-test ; extra == 'test' + - mkdocs-material ; extra == 'test' + - packaging ; extra == 'test' + - requests-html ; extra == 'test' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda + sha256: 3c432e77720726c6bd83e9ee37ac8d0e3dd7c4cf9b4c5805e1d384025f9e9ab6 + md5: c83ec81713512467dfe1b496a8292544 + depends: + - llvm-openmp >=21.1.4 + - tbb >=2022.2.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 99909095 + timestamp: 1761668703167 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_454.conda + sha256: 76576dd314735de99ccc9443c7f7c900c85783f797d2102617498fbbfc404041 + md5: 763d029dbaa14187a29ca55433221003 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 700532 + timestamp: 1761668942468 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hbcdf7a0_454.conda + sha256: 681040dd02b73b5145219fadafd6a097cef215cbdcf88afc71ef1612b6a70281 + md5: 7f8252abee6a24c11b08e86bf51d7d77 + depends: + - mkl-include 2025.3.0 h57928b3_454 + - tbb 2022.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 110454181 + timestamp: 1761669682917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py313h07c4f96_0.conda + sha256: 7f3a86169171af4c13726ae81e0ac9e6730398bee169e4889c9e58691297bca4 + md5: d1975d5be0252584439d580d15434559 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 18026686 + timestamp: 1758278519618 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.18.2-py313h6535dbc_0.conda + sha256: 6e2290e4a7ded8577a010669a889daeb913f695b28c0208d68959531b3ef9030 + md5: 28f9e7fc622b5214c8f859a210a8d40f + depends: + - __osx >=11.0 + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - typing_extensions >=4.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 10883940 + timestamp: 1758279614368 +- conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.18.2-py313h5ea7bf4_0.conda + sha256: 342bd9afea12d8016fab91297a604ad6f4a3f9e0fd112d9f62dfb0a462747e2b + md5: 8a1d0d6238a68322a36e806ea1f40a1d + depends: + - mypy_extensions >=1.0.0 + - pathspec >=0.9.0 + - psutil >=4.0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - typing_extensions >=4.6.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + size: 8648616 + timestamp: 1758278664539 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 11766 + timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 + md5: bbe1963f1e47f594070ffe87cdf612ea + depends: + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbformat?source=hash-mapping + size: 100945 + timestamp: 1733402844974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 + md5: 598fd7d4d0de2455fb74f56063969a97 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/nest-asyncio?source=hash-mapping + size: 11543 + timestamp: 1733325673691 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda + sha256: 02019191a2597865940394ff42418b37bc585a03a1c643d7cea9981774de2128 + md5: 16bff3d37a4f99e3aa089c36c2b8d650 + depends: + - python >=3.11 + - python + constrains: + - numpy >=1.25 + - scipy >=1.11.2 + - matplotlib >=3.8 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/networkx?source=hash-mapping + size: 1564462 + timestamp: 1749078300258 +- conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + sha256: 2a909594ca78843258e4bda36e43d165cda844743329838a29402823c8f20dec + md5: 59659d0213082bc13be8500bab80c002 + license: MIT + license_family: MIT + purls: [] + size: 4335 + timestamp: 1758194464430 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py313hf6604e3_0.conda + sha256: 41084b68fbbcbaba0bce28872ec338371f4ccbe40a5464eb8bed2c694197faa5 + md5: c47c527e215377958d28c470ce4863e1 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=compressed-mapping + size: 8889991 + timestamp: 1761162144475 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.4-py313h9771d21_0.conda + sha256: 33c73a156ce2b48cea3a67810832b2eba830f5d0671858789518554582c9b450 + md5: 1c27b9306edd808fdfc718c0c6c93cf9 + depends: + - python + - __osx >=11.0 + - python 3.13.* *_cp313 + - libcxx >=19 + - python_abi 3.13.* *_cp313 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6751745 + timestamp: 1761161612340 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.4-py313hce7ae62_0.conda + sha256: 0ab0c3a5fb404f5a501506aca0cc7eeb5be92bd3ce6d4811dbd7963ed330d33f + md5: 348041d099d11ab630124d7135bf233a + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7461895 + timestamp: 1761161591941 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3165399 + timestamp: 1762839186699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3108371 + timestamp: 1762839712322 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3 + md5: 84f8fb4afd1157f59098f618cd2437e4 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9440812 + timestamp: 1762841722179 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 62477 + timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + sha256: f6fef1b43b0d3d92476e1870c08d7b9c229aebab9a0556b073a5e1641cf453bd + md5: c3f35453097faf911fd3f6023fc2ab24 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/paginate?source=hash-mapping + size: 18865 + timestamp: 1734618649164 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py313h08cd8bf_1.conda + sha256: c4ce5f75d175cb264dc98af6db14378222b63955c63bf1b5e30e042e81624fae + md5: 9e87d4bda0c2711161d765332fa38781 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + constrains: + - xlrd >=2.0.1 + - scipy >=1.10.0 + - fsspec >=2022.11.0 + - odfpy >=1.4.1 + - beautifulsoup4 >=4.11.2 + - python-calamine >=0.1.7 + - numexpr >=2.8.4 + - pytables >=3.8.0 + - pandas-gbq >=0.19.0 + - tzdata >=2022.7 + - pyxlsb >=1.0.10 + - xarray >=2022.12.0 + - pyqt5 >=5.15.9 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - openpyxl >=3.1.0 + - qtpy >=2.3.0 + - psycopg2 >=2.9.6 + - pyarrow >=10.0.1 + - tabulate >=0.9.0 + - zstandard >=0.19.0 + - html5lib >=1.1 + - bottleneck >=1.3.6 + - numba >=0.56.4 + - sqlalchemy >=2.0.0 + - pyreadstat >=1.2.0 + - gcsfs >=2022.11.0 + - fastparquet >=2022.12.0 + - s3fs >=2022.11.0 + - blosc >=1.21.3 + - xlsxwriter >=3.0.5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15131510 + timestamp: 1759266202915 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py313h7d16b84_1.conda + sha256: 39c1ceac0e4484fd3ec1324f0550a21aee7578f6ed2f21981b878573c197a40e + md5: 5ddddcc319d3aee21cc4fe4640a61f8a + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + constrains: + - sqlalchemy >=2.0.0 + - openpyxl >=3.1.0 + - pytables >=3.8.0 + - gcsfs >=2022.11.0 + - tabulate >=0.9.0 + - bottleneck >=1.3.6 + - pandas-gbq >=0.19.0 + - odfpy >=1.4.1 + - beautifulsoup4 >=4.11.2 + - xarray >=2022.12.0 + - html5lib >=1.1 + - matplotlib >=3.6.3 + - pyreadstat >=1.2.0 + - zstandard >=0.19.0 + - scipy >=1.10.0 + - lxml >=4.9.2 + - s3fs >=2022.11.0 + - blosc >=1.21.3 + - fastparquet >=2022.12.0 + - numba >=0.56.4 + - numexpr >=2.8.4 + - xlsxwriter >=3.0.5 + - pyxlsb >=1.0.10 + - psycopg2 >=2.9.6 + - pyqt5 >=5.15.9 + - python-calamine >=0.1.7 + - pyarrow >=10.0.1 + - fsspec >=2022.11.0 + - tzdata >=2022.7 + - xlrd >=2.0.1 + - qtpy >=2.3.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14052072 + timestamp: 1759266462037 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py313hc90dcd4_1.conda + sha256: 4117c0ecf6ac2544d956038446df70884b48cf745cf50a28872cec54d189d6f8 + md5: 72e76484d7629ec9217e71d9c6281e09 + depends: + - numpy >=1.22.4 + - numpy >=1.23,<3 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.13.* *_cp313 + - pytz >=2020.1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - xlrd >=2.0.1 + - numba >=0.56.4 + - zstandard >=0.19.0 + - odfpy >=1.4.1 + - openpyxl >=3.1.0 + - bottleneck >=1.3.6 + - numexpr >=2.8.4 + - tzdata >=2022.7 + - html5lib >=1.1 + - gcsfs >=2022.11.0 + - qtpy >=2.3.0 + - xlsxwriter >=3.0.5 + - s3fs >=2022.11.0 + - tabulate >=0.9.0 + - xarray >=2022.12.0 + - pandas-gbq >=0.19.0 + - lxml >=4.9.2 + - pyqt5 >=5.15.9 + - pyarrow >=10.0.1 + - pytables >=3.8.0 + - pyxlsb >=1.0.10 + - pyreadstat >=1.2.0 + - scipy >=1.10.0 + - fsspec >=2022.11.0 + - matplotlib >=3.6.3 + - sqlalchemy >=2.0.0 + - beautifulsoup4 >=4.11.2 + - blosc >=1.21.3 + - psycopg2 >=2.9.6 + - fastparquet >=2022.12.0 + - python-calamine >=0.1.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 13956530 + timestamp: 1759266304527 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda + sha256: 24558fcb6fa04a58807457060ec7122321263d74666ea3b16b899fffdd357b4a + md5: ec76428eacdff80cb9093789fe5452a2 + depends: + - numpy >=1.24.4 + - pandas >=2.1.1 + - pandera-base 0.26.1 pyhd8ed1ab_0 + license: MIT + license_family: MIT + purls: [] + size: 7459 + timestamp: 1756343498140 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda + sha256: 764fd54add6c8ae32753337c0d53fdeb46e78f8683be2bc6875a744f6a2137fb + md5: 0828883b7195bdb41c146bc5ff14c1b2 + depends: + - packaging >=20.0 + - pydantic + - python >=3.9 + - typeguard + - typing_inspect >=0.6.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pandera?source=hash-mapping + size: 165985 + timestamp: 1756343497153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda + sha256: 3613774ad27e48503a3a6a9d72017087ea70f1426f6e5541dbdb59a3b626eaaf + md5: 79f71230c069a287efe3a8614069ddf1 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=11.0.1 + - libexpat >=2.7.0,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=13 + - libglib >=2.84.2,<3.0a0 + - libpng >=1.6.49,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 455420 + timestamp: 1751292466873 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda + sha256: 705484ad60adee86cab1aad3d2d8def03a699ece438c864e8ac995f6f66401a6 + md5: 7d57f8b4b7acfc75c777bc231f0d31be + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=11.0.1 + - libexpat >=2.7.0,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libglib >=2.84.2,<3.0a0 + - libpng >=1.6.49,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 426931 + timestamp: 1751292636271 +- conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda + sha256: dcda7e9bedc1c87f51ceef7632a5901e26081a1f74a89799a3e50dbdc801c0bd + md5: 452d6d3b409edead3bd90fc6317cd6d4 + depends: + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=11.0.1 + - libexpat >=2.7.0,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libglib >=2.84.2,<3.0a0 + - libpng >=1.6.49,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-or-later + purls: [] + size: 454854 + timestamp: 1751292618315 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda + sha256: 30de7b4d15fbe53ffe052feccde31223a236dae0495bab54ab2479de30b2990f + md5: a110716cdb11cf51482ff4000dc253d7 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/parso?source=hash-mapping + size: 81562 + timestamp: 1755974222274 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + sha256: 5c7380c8fd3ad5fc0f8039069a45586aa452cf165264bc5a437ad80397b32934 + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1209177 + timestamp: 1756742976157 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + sha256: 5bf2eeaa57aab6e8e95bea6bd6bb2a739f52eb10572d8ed259d25864d3528240 + md5: 0e6e82c3cc3835f4692022e9b9cd5df8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 835080 + timestamp: 1756743041908 +- conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda + sha256: 29c2ed44a8534d27faad96bdce16efe29c2788f556f4c5409d4ae8ae074681ec + md5: 889053e920d15353c2665fa6310d7a7a + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1034703 + timestamp: 1756743085974 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea + depends: + - ptyprocess >=0.5 + - python >=3.9 + license: ISC + purls: + - pkg:pypi/pexpect?source=hash-mapping + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a + md5: c01af13bdc553d1a8fbfff6e8db075f0 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 450960 + timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + sha256: 29c9b08a9b8b7810f9d4f159aecfd205fce051633169040005c0b7efad4bc718 + md5: 17c3d745db6ea72ae2fce17e7338547f + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + size: 248045 + timestamp: 1754665282033 +- conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + sha256: 246fce4706b3f8b247a7d6142ba8d732c95263d3c96e212b9d63d6a4ab4aff35 + md5: 08c8fa3b419df480d985e304f7884d35 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 542795 + timestamp: 1754665193489 +- conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda + sha256: bc4885f1ebd818b01832f5a26cdc5703248e26e12de33117985e9e4d96b0e3da + md5: 3f30dc72be42bb4619502fa496f8d86a + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/plac?source=hash-mapping + size: 26484 + timestamp: 1743816198 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + sha256: 7efd51b48d908de2d75cbb3c4a2e80dd9454e1c5bb8191b261af3136f7fa5888 + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 23625 + timestamp: 1759953252315 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + size: 24246 + timestamp: 1747339794916 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae + md5: edb16f14d920fb3faf17f5ce582942d6 + depends: + - python >=3.10 + - wcwidth + constrains: + - prompt_toolkit 3.0.52 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/prompt-toolkit?source=hash-mapping + size: 273927 + timestamp: 1756321848365 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py313h54dd161_0.conda + sha256: 26cf5a69d04ef66f03516b8a8211a43bb23d5225faacd7d36e5c987b0d66af0a + md5: 1d719fc61f91ab2644a2eeb35fcab360 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 501735 + timestamp: 1762092897061 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.1.3-py313h9734d34_0.conda + sha256: a175fee131b28ecd2dadd2b3fdc9b75b50ad5ad502d984280ae064152739c567 + md5: b17da028e6650dce95f8247faf84ba48 + depends: + - python + - python 3.13.* *_cp313 + - __osx >=11.0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 515398 + timestamp: 1762093071645 +- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.1.3-py313h5fd188c_0.conda + sha256: 460ad6347bcd4d83533322af7e09b41347491f867142972cde24ea16c8d8680b + md5: d61d8550d0dfe99408532c33e7ec26b5 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 520035 + timestamp: 1762092908165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + sha256: 7e446bafb4d692792310ed022fe284e848c6a868c861655a92435af7368bae7b + md5: 3c8f2573569bb816483e5cf57efbbe29 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 9389 + timestamp: 1726802555076 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/ptyprocess?source=hash-mapping + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py313hf1034c9_3.conda + sha256: 3aa56f2706251a7da1e591bd6e47f292d526b8b9c1ce7b520c97fd61b9ba397b + md5: 78f128f3808ce5fc44f901b87d479764 + depends: + - amply >=0.1.2 + - coin-or-cbc + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pulp?source=hash-mapping + size: 228171 + timestamp: 1757853258550 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pulp-2.8.0-py313h02cf4f5_3.conda + sha256: 703c126afbb70b34c8c37a855523985ddec169669037cad840d3b5697626f175 + md5: a2840bd568edda9880f186a47e94893f + depends: + - amply >=0.1.2 + - coin-or-cbc + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pulp?source=hash-mapping + size: 226858 + timestamp: 1757853482596 +- conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py313h4a748c7_3.conda + sha256: 8f776d8a22da48f6c8dc2fb9a740719cacf634c00558aaa6e30c41d5288b7cb6 + md5: 47d9509c36da375882e1a9fb6cd9e16c + depends: + - amply >=0.1.2 + - coin-or-cbc + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pulp?source=hash-mapping + size: 14503682 + timestamp: 1757853669764 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 + md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pure-eval?source=hash-mapping + size: 16668 + timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + sha256: 9e7fe12f727acd2787fb5816b2049cef4604b7a00ad3e408c5e709c298ce8bf1 + md5: f0599959a2447c1e544e216bddf393fa + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14671 + timestamp: 1752769938071 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 + sha256: d4fb485b79b11042a16dc6abfb0c44c4f557707c2653ac47c81e5d32b24a3bb0 + md5: 878f923dd6acc8aeb47a75da6c4098be + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 9906 + timestamp: 1610372835205 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.6-py313h07c4f96_3.conda + sha256: c8dee181d424b405914d87344abec25302927ce69f07186f3a01c4fc42ec6aee + md5: 7b943aff00c5b521fe35332b1dd6aeeb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pycosat?source=hash-mapping + size: 87894 + timestamp: 1757744775176 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pycosat-0.6.6-py313hcdf3177_3.conda + sha256: 59384b3df6783fb9826f75bfac1ae90a30908f9eb5ec5d516074a6b63d03ca4b + md5: ea1ac4959a65715e89d09390d03041a8 + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pycosat?source=hash-mapping + size: 92405 + timestamp: 1757745077396 +- conda: https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.6-py313h5ea7bf4_3.conda + sha256: 5abbaeac3da38dcfa619b176eb5ed1b883a40f05b8ab39a73f93857611742a68 + md5: f56d49d76a26e9d14cbe90eb825b63f9 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pycosat?source=hash-mapping + size: 79423 + timestamp: 1757744986845 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda + sha256: c51297f0f6ef13776cc5b61c37d00c0d45faaed34f81d196e64bebc989f3e497 + md5: bf6ce72315b6759453d8c90a894e9e4c + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.41.5 + - python >=3.10 + - typing-extensions >=4.6.1 + - typing-inspection >=0.4.2 + - typing_extensions >=4.14.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic?source=hash-mapping + size: 320446 + timestamp: 1762379584494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_0.conda + sha256: ef873b022656313991ec6e07ad1708e64b7d712de896b1907bd091dfe453b1e0 + md5: b7ecbb230837ea4f4f60227dc8b491b7 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1944972 + timestamp: 1762358832380 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_0.conda + sha256: ed566989eb88875262ac0010397e1ee5461d33d9f8ec5a88d2546a47eb9f0561 + md5: 37c559fd0c45f443f232486baf49e971 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - __osx >=11.0 + - python 3.13.* *_cp313 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1793302 + timestamp: 1762358922860 +- conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_0.conda + sha256: 82ee80cb7272551031d7e8a42494ce3d67897288605bcb76269c995ea8aa69fc + md5: 639e9460fc15dce7b0eed455c84d6c8d + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1976270 + timestamp: 1762358914181 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydot-4.0.1-py313h78bf25f_1.conda + sha256: aad1c35e93db51295d57eb7ed38a97519919e38e83070be9672c9749e6c46e24 + md5: 767a1d613f969cbd35ed55c148b4727e + depends: + - graphviz >=2.38.0 + - pyparsing >=3.0.9 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydot?source=hash-mapping + size: 85098 + timestamp: 1756812414901 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydot-4.0.1-py313h8f79df9_1.conda + sha256: b77ffcdbcd12317befce4740007a6aa3e5b16c7dea66e6bda1eaee0f54aa946f + md5: 21b26aa957668a13a81367b82c21c659 + depends: + - graphviz >=2.38.0 + - pyparsing >=3.0.9 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydot?source=hash-mapping + size: 85115 + timestamp: 1756812677256 +- conda: https://conda.anaconda.org/conda-forge/win-64/pydot-4.0.1-py313hfa70ccb_1.conda + sha256: d39ff28b3a56465c7924ea00259705ae4119e93b19b72b081c2870020af247c9 + md5: dcfcb1a73627f46855f4456370162237 + depends: + - graphviz >=2.38.0 + - pyparsing >=3.0.9 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydot?source=hash-mapping + size: 85139 + timestamp: 1756812463289 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 889287 + timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + sha256: 8f575f123694e5acd2829440da55828f2cea60b0af5d8fa5406d83251ba80f61 + md5: 26e013bc453e643991cfa9b76911fb79 + depends: + - markdown >=3.6 + - python >=3.9 + - pyyaml + license: MIT + license_family: MIT + purls: + - pkg:pypi/pymdown-extensions?source=hash-mapping + size: 170121 + timestamp: 1753743741894 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + sha256: 6814b61b94e95ffc45ec539a6424d8447895fef75b0fec7e1be31f5beee883fb + md5: 6c8979be6d7a17692793114fa26916e8 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=hash-mapping + size: 104044 + timestamp: 1758436411254 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.4-py313hfa70ccb_2.conda + sha256: 2476c4e9edf2b381096309517b0d3effe3a2b9fef6fc410443792f47b23b79da + md5: 6fe4ba7aafe65b6dd9f3bbce6b0e552d + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyreadline3?source=hash-mapping + size: 171632 + timestamp: 1756887863806 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca + md5: e2fd202833c4a981ce8a65974fe4abd1 + depends: + - __win + - python >=3.9 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21784 + timestamp: 1733217448189 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda + sha256: afd413cd919bd3cca1d45062b9822be8935e1f61ce6d6b2642364e8c19e2873d + md5: 499e8e2df95ad3d263bee8d41cc3d475 + depends: + - pygments >=2.7.2 + - python >=3.10 + - iniconfig >=1.0.1 + - packaging >=22 + - pluggy >=1.5,<2 + - tomli >=1 + - colorama >=0.4 + - exceptiongroup >=1 + - python + constrains: + - pytest-faulthandler >=2 + license: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 298822 + timestamp: 1762632428892 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + build_number: 101 + sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 + md5: 4780fe896e961722d0623fa91d0d3378 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 37174029 + timestamp: 1761178179147 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + build_number: 101 + sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 + md5: a4241bce59eecc74d4d2396e108c93b8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 11915380 + timestamp: 1761176793936 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda + build_number: 101 + sha256: bc855b513197637c2083988d5cbdcc407a23151cdecff381bd677df33d516a01 + md5: 89d992b9d4b9e88ed54346c9c4a24c1c + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.13.* *_cp313 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Python-2.0 + purls: [] + size: 16613183 + timestamp: 1761175050438 + python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 + md5: 23029aae904a2ba587daba708208012f + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fastjsonschema?source=hash-mapping + size: 244628 + timestamp: 1755304154927 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda + sha256: 7535b9cb2414e34c73ed4a97a90bcadcc76b9d47d0bb8ef5002c592d85fe022d + md5: f41e3c1125e292e6bfcea8392a3de3d8 + depends: + - cpython 3.13.9.* + - python_abi * *_cp313 + license: Python-2.0 + purls: [] + size: 48385 + timestamp: 1761175154112 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 + md5: 88476ae6ebd24f39261e0854ac244f33 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 144160 + timestamp: 1742745254292 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7002 + timestamp: 1752805902938 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 + md5: bc8e3267d44011051f2eb14d22fb0960 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 189015 + timestamp: 1742920947249 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda + sha256: 87eaeb79b5961e0f216aa840bc35d5f0b9b123acffaecc4fda4de48891901f20 + md5: 1ce4f826332dca56c76a5b0cc89fb19e + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/pywin32?source=hash-mapping + size: 6695114 + timestamp: 1756487139550 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda + sha256: 40dcd6718dce5fbee8aabdd0519f23d456d8feb2e15ac352eaa88bbfd3a881af + md5: 4794ea0adaebd9f844414e594b142cb2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=compressed-mapping + size: 207109 + timestamp: 1758892173548 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda + sha256: f5be0d84f72a567b7333b9efa74a65bfa44a25658cf107ffa3fc65d3ae6660d7 + md5: 0e8e3235217b4483a7461b63dca5826b + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 191630 + timestamp: 1758892258120 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda + sha256: 5d9fd32d318b9da615524589a372b33a6f3d07db2708de16570d70360bf638c2 + md5: c067122d76f8dcbe0848822942ba07be + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=compressed-mapping + size: 182043 + timestamp: 1758892011955 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + sha256: 69ab63bd45587406ae911811fc4d4c1bf972d643fa57a009de7c01ac978c4edd + md5: e8e53c4150a1bba3b160eacf9d53a51b + depends: + - python >=3.9 + - pyyaml + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml-env-tag?source=hash-mapping + size: 11137 + timestamp: 1747237061448 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + noarch: python + sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 + md5: 3399d43f564c905250c1aea268ebb935 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - _python_abi3_support 1.* + - cpython >=3.12 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 212218 + timestamp: 1757387023399 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + noarch: python + sha256: ef33812c71eccf62ea171906c3e7fc1c8921f31e9cc1fbc3f079f3f074702061 + md5: bbd22b0f0454a5972f68a5f200643050 + depends: + - python + - __osx >=11.0 + - libcxx >=19 + - _python_abi3_support 1.* + - cpython >=3.12 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 191115 + timestamp: 1757387128258 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda + noarch: python + sha256: fd46b30e6a1e4c129045e3174446de3ca90da917a595037d28595532ab915c5d + md5: 808d263ec97bbd93b41ca01552b5fbd4 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zeromq >=4.3.5,<4.3.6.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 185711 + timestamp: 1757387025899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 + md5: 870293df500ca7e18bedefa5838a22ab + depends: + - attrs >=22.2.0 + - python >=3.10 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing?source=hash-mapping + size: 51788 + timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + sha256: a1973f41a6b956f1305f9aaefdf14b2f35a8c9615cfe5f143f1784ed9aa6bf47 + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 34194 + timestamp: 1731925834928 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.5.post0-h5505292_0.conda + sha256: a5f0dbfa8099a3d3c281ea21932b6359775fd8ce89acc53877a6ee06f50642bc + md5: f1d129089830365d9dac932c4dd8c675 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 32023 + timestamp: 1731926255834 +- conda: https://conda.anaconda.org/conda-forge/win-64/reproc-14.2.5.post0-h2466b09_0.conda + sha256: 112dee79da4f55de91f029dd9808f4284bc5e0cf0c4d308d4cec3381bf5bc836 + md5: c3ca4c18c99a3b9832e11b11af227713 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 37058 + timestamp: 1731926140985 +- conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + sha256: 568485837b905b1ea7bdb6e6496d914b83db57feda57f6050d5a694977478691 + md5: 828302fca535f9cfeb598d5f7c204323 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - reproc 14.2.5.post0 hb9d3cd8_0 + license: MIT + license_family: MIT + purls: [] + size: 25665 + timestamp: 1731925852714 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.5.post0-h286801f_0.conda + sha256: f1b6aa9d9131ea159a5883bc5990b91b4b8f56eb52e0dc2b01aa9622e14edc81 + md5: 11a3d09937d250fc4423bf28837d9363 + depends: + - __osx >=11.0 + - libcxx >=18 + - reproc 14.2.5.post0 h5505292_0 + license: MIT + license_family: MIT + purls: [] + size: 24834 + timestamp: 1731926355120 +- conda: https://conda.anaconda.org/conda-forge/win-64/reproc-cpp-14.2.5.post0-he0c23c2_0.conda + sha256: ccf49fb5149298015ab410aae88e43600954206608089f0dfb7aea8b771bbe8e + md5: d2ce31fa746dddeb37f24f32da0969e9 + depends: + - reproc 14.2.5.post0 h2466b09_0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 30096 + timestamp: 1731926177599 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + sha256: 8dc54e94721e9ab545d7234aa5192b74102263d3e704e6d0c8aa7008f2da2a7b + md5: db0c6b99149880c8ba515cf4abe93ee4 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 59263 + timestamp: 1755614348400 +- conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda + sha256: f010d25e0ab452c0339a42807c84316bf30c5b8602b9d74d566abf1956d23269 + md5: b965b0dfdb3c89966a6a25060f73aa67 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/reretry?source=hash-mapping + size: 12563 + timestamp: 1735477549872 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.28.0-py313h843e2db_1.conda + sha256: d0bcf40c20b4c4921b0c244b2ae1a9188f511cdeff5974602900257d7aa2ee0c + md5: b4e5c52948b191bfb04da5788217afdb + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 380486 + timestamp: 1761178917553 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.28.0-py313h2c089d5_1.conda + sha256: eeb30e6e990451b14faf5a563f2d5c705e8ca2700eaf7372220d9fc1c56b5485 + md5: a552a3f9c3911dfaeba79023065a5762 + depends: + - python + - python 3.13.* *_cp313 + - __osx >=11.0 + - python_abi 3.13.* *_cp313 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=compressed-mapping + size: 354372 + timestamp: 1761178479895 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.28.0-py313hfbe8231_1.conda + sha256: 98a042a41e9c14b3500b560d3cc83ad4d05180dc1bbfadb9e416826016b4649e + md5: b78312a5f81f1a7f20cabc5efe5b15ce + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 240192 + timestamp: 1761178419906 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda + sha256: fa1667f1c61610191960d0f6c33a55f3afacfd9c43ff4c9b1507ba164eb3f28f + md5: 88717b72e54ee6ef081c9ecfafd728c8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ruamel.yaml.clib >=0.1.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml?source=hash-mapping + size: 272227 + timestamp: 1761160797563 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda + sha256: ddd6eaaa278772b760dd3e3176b70db71b26a8e8f1f27d7619ec2a638bf872af + md5: d9915dc9a5b3ce03810bd0024b62afac + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - ruamel.yaml.clib >=0.1.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml?source=hash-mapping + size: 272094 + timestamp: 1761160998422 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda + sha256: b7325bc79a4b91c1b9f3f1aded5add5b277f65566502e6d78ef75a08bdf29496 + md5: d86a7e27eb75cbd0966ff66b807d4fe0 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ruamel.yaml.clib >=0.1.2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml?source=hash-mapping + size: 272290 + timestamp: 1761160849835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda + sha256: 1d5607b463001ed480aea45b7f3c1035151c0c44a3bf4f3539a00fe097c5e30a + md5: 3cff82488dd3935fdb3ba37911387fec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml-clib?source=hash-mapping + size: 140261 + timestamp: 1760564339468 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda + sha256: ade7d57e7c4b92bc4b003a59e9a40d8d241d113fc8e4c051ecb7dd689d9360f4 + md5: 844260acfdd85139049b9c806862e15c + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml-clib?source=hash-mapping + size: 116501 + timestamp: 1760564812152 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda + sha256: 28af1c4e9f57a24ae6d71368b94caad33261b3d7063d06f70649bbdd77184ce3 + md5: 956b695fac4c5066bd05ecc63adad785 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruamel-yaml-clib?source=hash-mapping + size: 105450 + timestamp: 1760564606434 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.4-h813ae00_0.conda + noarch: python + sha256: 23121b3e5d6f0cfe8cf6600a2b1e63e4f8cdd3aa2ceee25625b98a3caa2d93e5 + md5: a62b7614fdd1b448700d7e4078cc1b28 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 11120550 + timestamp: 1762483239399 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.4-h382de68_0.conda + noarch: python + sha256: a672c1310b844f32495d62a4db0d1fd0ac1cd154839425f0f3ff64c95c01356d + md5: 26b89c217a5f7c17ac8bd8082ec37a2a + depends: + - python + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 10067548 + timestamp: 1762483365075 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.14.4-h15e3a1f_0.conda + noarch: python + sha256: 16c4afd851c3ced17ac6b5308b5434b26032f55d700ab202e701c8bfa286f52f + md5: fbd57518cd61e83e5bafa8ac24f12358 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 11583754 + timestamp: 1762483250576 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 + md5: 4de79c071274a53dcaf2a8c749d1499e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 748788 + timestamp: 1748804951958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + sha256: 5e29efa1927929885e00909c0386b160d13100a73e031432c42e74df2151f775 + md5: cc9c262a71dd584aa5a3a22fc963255c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 267708 + timestamp: 1759262988515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/simdjson-4.0.7-ha7d2532_0.conda + sha256: a0c961c56ad6606841576ae179172eed30f8b2ae435632e00f91689a6a675dea + md5: 66990c8e1331805f3a553e76b9d1a62a + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 225118 + timestamp: 1759263294981 +- conda: https://conda.anaconda.org/conda-forge/win-64/simdjson-4.0.7-h49e36cd_0.conda + sha256: 302812e8a027c6ad4055a3eb6453f9ba3ec54e98d391e85b1760eafa00c8e0d4 + md5: 575eb71ecf0cf5fcf26ee0237094058f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 270514 + timestamp: 1759263215124 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda + sha256: 8b4684aac4547852fdf6339edb99d1aeb8dbd8280436ce9b27b463341fd68dde + md5: 9d1659c8332e9822e347e115e6bb4d0c + depends: + - python >=3.10 + - wrapt + - python + license: MIT + purls: + - pkg:pypi/smart-open?source=hash-mapping + size: 56781 + timestamp: 1762641207780 +- conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + sha256: eb92d0ad94b65af16c73071cc00cc0e10f2532be807beb52758aab2b06eb21e2 + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/smmap?source=hash-mapping + size: 26051 + timestamp: 1739781801801 +- conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda + sha256: d1a08fca3b788331d2c38a8dbc2b154625d60c2701e7ff2e5f9ff85bf5322f91 + md5: e24e657d087c778d77da633912e8c163 + depends: + - black >=24.3,<25.0 + - click >=8.2.0 + - python >=3.11 + license: MIT + license_family: MIT + purls: + - pkg:pypi/snakefmt?source=hash-mapping + size: 33339 + timestamp: 1756948827679 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda + sha256: d13802cb086c1b6be2c4e903e01f946fc973436e6100514169df82e537166bce + md5: e9bb00d8c7d26a5cd220d3d73bee45fb + depends: + - argparse-dataclass >=2.0.0 + - configargparse >=1.7 + - packaging >=24.0,<26.0 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/snakemake-interface-common?source=hash-mapping + size: 21989 + timestamp: 1759253200205 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 + sha256: fe84cb2f9dbae898c9aa3f5a44b9f4d150cc05b5d0aa21561c5f9207c7184b23 + md5: e75b9c422bcc3c9b52679dedb84f3b71 + depends: + - argparse-dataclass >=2.0.0,<3.0.0 + - python >=3.11.0,<4.0.0 + - snakemake-interface-common >=1.19.0 + - throttler >=1.2.2,<2.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/snakemake-interface-executor-plugins?source=hash-mapping + size: 22946 + timestamp: 1753822168221 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda + sha256: a6a0bf0393586974b278715df5131cc50e69fba515ecc5d0e974d1825ad0ea21 + md5: 98f75f2ca3a222992e2230d7afc54bb8 + depends: + - python >=3.11.0,<4.0.0 + - snakemake-interface-common >=1.17.4,<2.0.0 + license: MIT + purls: + - pkg:pypi/snakemake-interface-logger-plugins?source=hash-mapping + size: 18660 + timestamp: 1759090830197 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda + sha256: 7b7be41b59f2d904acb014ee182561610c930bef5f607742011ee23befe73831 + md5: e6fd8cfb23b294da699e395dbc968d11 + depends: + - python >=3.11.0,<4.0.0 + - snakemake-interface-common >=1.16.0,<2.0.0 + license: MIT + purls: + - pkg:pypi/snakemake-interface-report-plugins?source=hash-mapping + size: 14490 + timestamp: 1761910544502 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda + sha256: d5234883768d5876707df6897151a100581293336a599195ead32894bea4fa2f + md5: 1500fccf5e46c7f91d14925449ff3632 + depends: + - python >=3.11.0,<4.0.0 + - snakemake-interface-common >=1.20.1,<2.0.0 + license: MIT + purls: + - pkg:pypi/snakemake-interface-scheduler-plugins?source=hash-mapping + size: 16446 + timestamp: 1760984180933 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda + sha256: 50f8a95c5686f36c7d0dfed75390486262e90fc9ed61ead1cd7370e4b2d9e2df + md5: 0de5b58d7772fb879c4117fb37121e0b + depends: + - python >=3.11.0,<4.0.0 + - reretry >=0.11.8,<0.12.0 + - snakemake-interface-common >=1.12.0,<2.0.0 + - throttler >=1.2.2,<2.0.0 + - wrapt >=1.15.0,<2.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/snakemake-interface-storage-plugins?source=hash-mapping + size: 21160 + timestamp: 1757532381070 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + sha256: 5dc6bd1af61df9feafd465dbec137c01662b97eaab869f935a874b4ab419c982 + md5: 73ec528671afc935af025f5e2489deae + depends: + - appdirs + - conda-inject >=1.3.1,<2.0 + - configargparse + - connection_pool >=0.0.3 + - docutils + - dpath >=2.1.6,<3.0.0 + - gitpython + - humanfriendly + - immutables + - jinja2 >=3.0,<4.0 + - jsonschema + - nbformat + - packaging >=24.0 + - psutil + - pulp >=2.3.1,<3.4 + - python >=3.11,<3.14 + - pyyaml + - requests >=2.8.1,<3.0 + - reretry + - smart_open >=4.0,<8.0 + - snakemake-interface-common >=1.20.1,<2.0 + - snakemake-interface-executor-plugins >=9.3.2,<10.0 + - snakemake-interface-logger-plugins >=1.1.0,<3.0.0 + - snakemake-interface-report-plugins >=1.2.0,<2.0.0 + - snakemake-interface-scheduler-plugins >=2.0.0,<3.0.0 + - snakemake-interface-storage-plugins >=4.1.0,<5.0 + - tabulate + - throttler + - wrapt + - yte >=1.5.5,<2.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/snakemake?source=hash-mapping + size: 866236 + timestamp: 1762533314130 +- pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl + name: soupsieve + version: '2.8' + sha256: 0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc + depends: + - asttokens + - executing + - pure_eval + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/stack-data?source=hash-mapping + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + sha256: 090023bddd40d83468ef86573976af8c514f64119b2bd814ee63a838a542720a + md5: 959484a66b4b76befcddc4fa97c95567 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tabulate?source=hash-mapping + size: 37554 + timestamp: 1733589854804 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda + sha256: c31cac57913a699745d124cdc016a63e31c5749f16f60b3202414d071fc50573 + md5: 17c38aaf14c640b85c4617ccb59c1146 + depends: + - libhwloc >=2.12.1,<2.12.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + purls: [] + size: 155714 + timestamp: 1762510341121 +- conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda + sha256: cdd2067b03db7ed7a958de74edc1a4f8c4ae6d0aa1a61b5b70b89de5013f0f78 + md5: 6fc48bef3b400c82abaee323a9d4e290 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/throttler?source=hash-mapping + size: 12341 + timestamp: 1691135604942 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3285204 + timestamp: 1748387766691 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125538 + timestamp: 1748388189063 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + purls: [] + size: 3466348 + timestamp: 1748388121356 +- conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + md5: b0dd904de08b7db706167240bf37b164 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/toml?source=hash-mapping + size: 22132 + timestamp: 1734091907682 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + sha256: cb77c660b646c00a48ef942a9e1721ee46e90230c7c570cdeb5a893b5cce9bff + md5: d2732eb636c264dc9aa4cbee404b1a53 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=compressed-mapping + size: 20973 + timestamp: 1760014679845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_2.conda + sha256: 8ef12814ebf787553b351c919d40a599e2331aefec639aef5ce6117cbcfc6a28 + md5: 7824f18e343d1f846dcde7b23c9bf31a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 871569 + timestamp: 1762506888003 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313h6535dbc_2.conda + sha256: 621bcd6a7ca399bb739aa32a2fb639b2389dd5f030af3c7a2d5e639cfe194be4 + md5: c7fea1e31871009ff882a327ba4b7d9a + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 876232 + timestamp: 1762507414014 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_2.conda + sha256: 79a13678078dbdcb800b75d32e7d60f460a2284f1d6ede15ff5478b656608a28 + md5: 81bf54645cb6686c47158450cd913ec2 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 876064 + timestamp: 1762506921139 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda + sha256: df334b8978edc4f42e7056764db1a26f1e4c6e6a29d5e2ca426ed5b2f09d24a0 + md5: 15afca3bec34c3ecbeb2028f81a51772 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/truststore?source=hash-mapping + size: 23801 + timestamp: 1753886790616 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda + sha256: 591e03a61b4966a61b15a99f91d462840b6e77bf707ecb48690b24649fee921a + md5: 8b2613dbfd4e2bc9080b2779b53fc210 + depends: + - importlib-metadata >=3.6 + - python >=3.9 + - typing-extensions >=4.10.0 + - typing_extensions >=4.14.0 + constrains: + - pytest >=7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typeguard?source=hash-mapping + size: 35158 + timestamp: 1750249264892 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c + md5: edd329d7d3a4ab45dcf905899a7a6115 + depends: + - typing_extensions ==4.15.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 91383 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + sha256: 8aaf69b828c2b94d0784f18f70f11aa032950d304e57e88467120b45c18c24fd + md5: 399701494e731ce73fdd86c185a3d1b4 + depends: + - python >=3.10 + - typing_extensions >=4.12.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typing-inspection?source=compressed-mapping + size: 18799 + timestamp: 1759301271883 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: 0caa1af407ecff61170c9437a808404d + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 51692 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda + sha256: a3fbdd31b509ff16c7314e8d01c41d9146504df632a360ab30dbc1d3ca79b7c0 + md5: fa31df4d4193aabccaf09ce78a187faf + depends: + - mypy_extensions >=0.3.0 + - python >=3.9 + - typing_extensions >=3.7.4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typing-inspect?source=hash-mapping + size: 14919 + timestamp: 1733845966415 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + purls: [] + size: 122968 + timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + sha256: 4fb9789154bd666ca74e428d973df81087a697dbb987775bc3198d2215f240f8 + md5: 436c165519e140cb08d246a4472a9d6a + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 101735 + timestamp: 1750271478254 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf + md5: ef02bbe151253a72b8eda264a935db66 + depends: + - vc14_runtime >=14.42.34433 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18861 + timestamp: 1760418772353 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd + md5: 378d5dcec45eaea8d303da6f00447ac0 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_32 + constrains: + - vs2015_runtime 14.44.35208.* *_32 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 682706 + timestamp: 1760418629729 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 + md5: 58f67b437acbf2764317ba273d731f1d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_32 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 114846 + timestamp: 1760418593847 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py313h78bf25f_1.conda + sha256: 73225611a442fdebc9d333951037a428f6e9b8449d4194030457c026970a3283 + md5: d643d87d7df61d3d47db87bdd4571ec6 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - pyyaml >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 144014 + timestamp: 1756135338277 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py313hcdf3177_1.conda + sha256: ba78762d8b75bc1278861c81860685a82bf5f5b2c6cf1aadfbb9e08d7904161e + md5: 1aeffac355c1e143fb0564e9f756be16 + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + - pyyaml >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 152813 + timestamp: 1756135648190 +- conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_1.conda + sha256: 06263427dcd0100706d26c0461f2ff8356f23f4b2ee047f67d0cd7f073e2c842 + md5: ff8bfc0c2479faccdfa9ec9859ed663b + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - pyyaml >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 168440 + timestamp: 1756135584322 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 + md5: 035da2e4f5770f036ff704fa17aace24 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 329779 + timestamp: 1761174273487 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda + sha256: e311b64e46c6739e2a35ab8582c20fa30eb608da130625ed379f4467219d4813 + md5: 7e1e5ff31239f9cd5855714df8a3783d + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wcwidth?source=hash-mapping + size: 33670 + timestamp: 1758622418893 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 + depends: + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + purls: + - pkg:pypi/win-inet-pton?source=hash-mapping + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py313h07c4f96_1.conda + sha256: 3688598866224e3fbeed8a74f12fd0a3c19dadcb931ce778bdc6cc2e04621b3b + md5: c2662497e9a9ff2153753682f53989c9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 64865 + timestamp: 1756851811052 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py313hcdf3177_1.conda + sha256: 5919f7142db9344116760b797e4a5d28ca3961f927a2ba1c4a61d3f0f3282dd2 + md5: cd6b5084444b0b4ed22dde20355d4c4b + depends: + - __osx >=11.0 + - python >=3.13,<3.14.0a0 + - python >=3.13,<3.14.0a0 *_cp313 + - python_abi 3.13.* *_cp313 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 62577 + timestamp: 1756851972334 +- conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py313h5ea7bf4_1.conda + sha256: 260a3295f39565c28be9232a11ca7ee435af6e9366ffd2569ff29a63e7c144a0 + md5: 3e199c8db04833fe628867462aeaca24 + depends: + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 63385 + timestamp: 1756851987645 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda + sha256: aa03b49f402959751ccc6e21932d69db96a65a67343765672f7862332aa32834 + md5: 71ae752a748962161b4740eaff510258 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 396975 + timestamp: 1759543819846 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + sha256: bf1d34142b1bf9b5a4eed96bcc77bc4364c0e191405fd30d2f9b48a04d783fd3 + md5: 105cb93a47df9c548e88048dc9cbdbc9 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 236306 + timestamp: 1734228116846 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 + md5: 1c74ff8c35dcadf952a16f752ca5aa49 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 27590 + timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + sha256: 065d49b0d1e6873ed1238e962f56cb8204c585cdc5c9bd4ae2bf385cadb5bd65 + md5: 570c9a6d9b4909e45d49e9a5daa528de + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 97096 + timestamp: 1741896840170 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 835896 + timestamp: 1741901112627 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.12-hf48077a_0.conda + sha256: 3f0854bc592d31a5742c6c4550914a976c89d73b74d052545b418521d21b3043 + md5: c4f435ac09fd41606bba9f0deb12e412 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxcb >=1.17.0,<2.0a0 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 951392 + timestamp: 1741902072732 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.conda + sha256: 047836241b2712aab1e29474a6f728647bff3ab57de2806b0bb0a6cf9a2d2634 + md5: 2ffbfae4548098297c033228256eb96e + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 108013 + timestamp: 1734229474049 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f + md5: d3c295b50f092ab525ffe3c2aa4b7413 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13603 + timestamp: 1727884600744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13217 + timestamp: 1727891438799 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda + sha256: 9075f98dcaa8e9957e4a3d9d30db05c7578a536950a31c200854c5c34e1edb2c + md5: 8393c0f7e7870b4eb45553326f81f0ff + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 69920 + timestamp: 1727795651979 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 50060 + timestamp: 1727752228921 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.6-h0e40799_0.conda + sha256: 7fdc3135a340893aa544921115c3994ef4071a385d47cc11232d818f006c63e4 + md5: 4cd74e74f063fb6900d6eed2e9288112 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 284715 + timestamp: 1727752838922 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20071 + timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a + md5: 17dcc85db3c7886650b8908b183d6876 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 47179 + timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.5-h5888daf_1.conda + sha256: 1b9141c027f9d84a9ee5eb642a0c19457c788182a5a73c5a9083860ac5c20a8c + md5: 5e2eb9bf77394fc2e5918beefec9f9ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13891 + timestamp: 1727908521531 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.17-h0e40799_1.conda + sha256: a605b43b2622a4cae8df6edc148c02b527da4ea165ec67cabb5c9bc4f3f8ef13 + md5: e8b816fb37bc61aa3f1c08034331ef53 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxt >=1.3.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 236112 + timestamp: 1727801849623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d + md5: 2de7f99d6581a4a7adbff607b5c278ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 29599 + timestamp: 1727794874300 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + sha256: c940a6b71a1e59450b01ebfb3e21f3bbf0a8e611e5fbfc7982145736b0f20133 + md5: 31baf0ce8ef19f5617be73aee0527618 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 918674 + timestamp: 1731861024233 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32808 + timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + sha256: 8a4e2ee642f884e6b78c20c0892b85dd9b2a6e64a6044e903297e616be6ca35b + md5: 5efa5fa6243a622445fdfd72aee15efa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 17819 + timestamp: 1734214575628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + sha256: 1316680be6edddee0156b86ec1102fc8286f51c1a5440366ed1db596a2dc3731 + md5: 7c21106b851ec72c037b162c216d8f05 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 565425 + timestamp: 1726846388217 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 83386 + timestamp: 1753484079473 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 63944 + timestamp: 1753484092156 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + sha256: 4b0b713a4308864a59d5f0b66ac61b7960151c8022511cdc914c0c0458375eca + md5: 92b90f5f7a322e74468bb4909c7354b5 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 223526 + timestamp: 1745307989800 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda + sha256: 66ba31cfb8014fdd3456f2b3b394df123bbd05d95b75328b7c4131639e299749 + md5: 30475b3d0406587cf90386a283bb3cd0 + depends: + - libcxx >=18 + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 136222 + timestamp: 1745308075886 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda + sha256: 031642d753e0ebd666a76cea399497cc7048ff363edf7d76a630ee0a19e341da + md5: 9bb5064a9fca5ca8e7d7f1ae677354b6 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 148572 + timestamp: 1745308037198 +- conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda + sha256: 439ebef131ef2e4711f286375240f8d779fce2fe54b4ec786fb58c6c9141b17b + md5: 55a52c71e7919a4951cfc6cccf4fa16f + depends: + - dpath + - plac + - python >=3.7 + - pyyaml + license: MIT + license_family: MIT + purls: + - pkg:pypi/yte?source=hash-mapping + size: 15805 + timestamp: 1749657286268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda + sha256: 47cfe31255b91b4a6fa0e9dbaf26baa60ac97e033402dbc8b90ba5fee5ffe184 + md5: 8035e5b54c08429354d5d64027041cad + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsodium >=1.0.20,<1.0.21.0a0 + - krb5 >=1.21.3,<1.22.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 310648 + timestamp: 1757370847287 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda + sha256: b6f9c130646e5971f6cad708e1eee278f5c7eea3ca97ec2fdd36e7abb764a7b8 + md5: 26f39dfe38a2a65437c29d69906a0f68 + depends: + - __osx >=11.0 + - libcxx >=19 + - libsodium >=1.0.20,<1.0.21.0a0 + - krb5 >=1.21.3,<1.22.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 244772 + timestamp: 1757371008525 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h5bddc39_9.conda + sha256: 690cf749692c8ea556646d1a47b5824ad41b2f6dfd949e4cdb6c44a352fcb1aa + md5: a6c8f8ee856f7c3c1576e14b86cd8038 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libsodium >=1.0.20,<1.0.21.0a0 + - krb5 >=1.21.3,<1.22.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 265212 + timestamp: 1757370864284 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad + md5: df5e78d904988eb55042c0c97446079f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 22963 + timestamp: 1749421737203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda + sha256: e6921de3669e1bbd5d050a3b771b46a887e7f4ffeb1ddd5e4d9fb01062a2f6e9 + md5: 710d4663806d0f72b2fb414e936223b5 + depends: + - python + - cffi >=1.11 + - zstd >=1.5.7,<1.5.8.0a0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 471496 + timestamp: 1762512679097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda + sha256: c8525ae1a739db3c9b4f901d08fd7811402cf46b61ddf5d63419a3c533e02071 + md5: 7ac13a947d4d9f57859993c06faf887b + depends: + - python + - cffi >=1.11 + - zstd >=1.5.7,<1.5.8.0a0 + - __osx >=11.0 + - python 3.13.* *_cp313 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 396449 + timestamp: 1762512722894 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda + sha256: 5f751687a64cf5a6d69ad79aa437f45d6cc388d9e887dcdecff9d3b08cf7fd87 + md5: 46f6f9bb324a58a9b081bbc56ade37f2 + depends: + - python + - cffi >=1.11 + - zstd >=1.5.7,<1.5.8.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 380854 + timestamp: 1762512720226 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 567578 + timestamp: 1742433379869 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 399979 + timestamp: 1742433432699 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 + md5: 21f56217d6125fb30c3c3f10c786d751 + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 354697 + timestamp: 1742433568506 From ad7e446fd0c486adc9fe07c82968b7d4fe349e47 Mon Sep 17 00:00:00 2001 From: Stefan Pfenninger Date: Wed, 12 Nov 2025 14:30:45 +0100 Subject: [PATCH 35/59] Update to newest template; fix INTERFACE and integration Snakefile --- .gitignore | 6 +++--- INTERFACE.yaml | 5 +++++ README.md | 15 +++------------ mypy.ini | 1 + pixi.toml | 18 +++--------------- tests/clio_test.py | 4 ++-- tests/integration/Snakefile | 8 ++++---- 7 files changed, 21 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index c508d02..f03928b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ __pycache__ *.pyc +### Environments +.pixi/ + ### Snakemake .snakemake/ gurobi.log @@ -24,6 +27,3 @@ gurobi.log **/results/* **/temp/* **/tmp/* - -# Manually downloaded test files -tests/files diff --git a/INTERFACE.yaml b/INTERFACE.yaml index 8c2b073..caafc3f 100644 --- a/INTERFACE.yaml +++ b/INTERFACE.yaml @@ -10,3 +10,8 @@ resources: "cutout_era5.nc": Cutout of meteorological data downloaded from ERA5. results: "{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc": Capacity factors for the specified technology. +wildcards: + name_cutout: Cutout name + name_tech: Technology name + name_layout: Layout name + name_spatial_units: Spatial units name diff --git a/README.md b/README.md index 3d80401..cd53129 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,14 @@ # PV and wind capacity factors This data module produces capacity factors for PV and wind at arbitrary spatial resolution. -It is a configurable, modular `snakemake` workflow as part of the [`clio`](https://clio.readthedocs.io/) data modules. -The module uses [atlite](https://atlite.readthedocs.io/) as a backend. -The module runs the following steps: -- Download meteorological reanalysis data (optional, can also be provided by the user). -- Given a technology specification, a capacity layout (raster or point data), and regions for aggregation, the module produces time series that are the weighted average of the capacity factor for each region. -- Outputs are saved as `.nc` files and visualised as maps. +A modular `snakemake` workflow built for [`clio`](https://clio.readthedocs.io/) data modules. ## Using this module This module can be imported directly into any `snakemake` workflow. Please consult the integration example in `tests/integration/Snakefile` for more information. -To use this module, you need to specify the wind or PV technology, provide a capacity layout that is used as weights, and the regions for aggregation. -Meteorological reanalysis data can be either manually placed in the directory `resources/user`, or can be downloaded internally. -Please refer to `INTERFACE.yaml` for a full documentation of the module's interface. - ## Development We use [`pixi`](https://pixi.sh/) as our package manager for development. @@ -32,7 +23,7 @@ pixi install --all For testing, simply run: ```shell -pixi run test +pixi run test-integration ``` To view the documentation locally, use: @@ -46,5 +37,5 @@ To test a minimal example of a workflow using this module: ```shell pixi shell # activate this project's environment cd tests/integration/ # navigate to the integration example -snakemake --use-conda # run the workflow! +snakemake --use-conda --cores 2 # run the workflow! ``` diff --git a/mypy.ini b/mypy.ini index d787271..c7b2d53 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,2 +1,3 @@ [mypy] disable_error_code = import-untyped +exclude = (^|/)\.(snakemake|pixi)(/|$) diff --git a/pixi.toml b/pixi.toml index 9c6658f..84e8879 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,7 +1,7 @@ [project] name = "module_pv_wind" authors = ["See AUTHORS file"] -description = "This data module produces area potentials and capacity factors for PV and wind at arbitrary spatial resolution." +description = "This data module produces capacity factors for PV and wind at arbitrary spatial resolution." license = "MIT" readme = "README.md" channels = ["conda-forge", "bioconda"] @@ -13,6 +13,7 @@ clio-tools = ">=2025.03.03" conda = ">=25.0.0" ipdb = ">=0.13.13" ipykernel = ">=6.29.5" +jsonschema = ">=4.0.0" mypy = ">=1.15.0" pytest = ">=8.3.5" python = ">=3.12" @@ -21,17 +22,4 @@ snakefmt = ">=0.10.2" snakemake-minimal = ">=8.29.0" [tasks] -test = {cmd = "pytest tests/"} - -[feature.docs.dependencies] -mkdocs-material = ">=9.6.7" - -[feature.docs.pypi-dependencies] -mkdocs-mermaid2-plugin = ">=1.2.1" - -[feature.docs.tasks] -serve-docs = {cmd = "mkdocs serve"} -build-docs = {cmd = "mkdocs build"} - -[environments] -docs = ["docs"] +test-integration = {cmd = "pytest tests/clio_test.py"} diff --git a/tests/clio_test.py b/tests/clio_test.py index fcd4971..d810e92 100644 --- a/tests/clio_test.py +++ b/tests/clio_test.py @@ -40,7 +40,7 @@ def test_standard_file_existance(module_path, file): def test_snakemake_all_failure(module_path): """The snakemake 'all' rule should return an error by default.""" process = subprocess.run( - "snakemake --cores 4", shell=True, cwd=module_path, capture_output=True + "snakemake --cores 1", shell=True, cwd=module_path, capture_output=True ) assert "INVALID (missing locally)" in str(process.stderr) @@ -48,7 +48,7 @@ def test_snakemake_all_failure(module_path): def test_snakemake_integration_testing(module_path): """Run a light-weight test simulating someone using this module.""" assert subprocess.run( - "snakemake --use-conda --cores 4", + "snakemake --use-conda --cores 1", shell=True, check=True, cwd=module_path / "tests/integration", diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index fb87ee5..433cdae 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -34,7 +34,7 @@ rule copy_user_resources: # Import the module and configure it to use a raster layout. # `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers # `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. -module module_pv_wind: +module module_pv_wind_raster: snakefile: "../../workflow/Snakefile" config: @@ -44,7 +44,7 @@ module module_pv_wind: # rename all module rules with a prefix, to avoid naming conflicts. -use rule * from module_pv_wind as module_pv_wind_* +use rule * from module_pv_wind_raster as module_pv_wind_raster_* # Request something from the module @@ -66,7 +66,7 @@ rule europe_raster: # Import the module and configure it to use a point layout. # `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers # `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. -module module_pv_wind: +module module_pv_wind_point: snakefile: "../../workflow/Snakefile" config: @@ -76,7 +76,7 @@ module module_pv_wind: # rename all module rules with a prefix, to avoid naming conflicts. -use rule * from module_pv_wind as module_pv_wind_* +use rule * from module_pv_wind_point as module_pv_wind_point_* # Request something from the module From 187e6e062a425d4679fa4123df7b358d38f96909 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 13 Nov 2025 09:58:14 +0100 Subject: [PATCH 36/59] Define default target after module re-import --- tests/integration/Snakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index 433cdae..2c1a430 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -83,5 +83,6 @@ use rule * from module_pv_wind_point as module_pv_wind_point_* rule nld_point: message: "Create capacity factors for onshore wind based on a point layout." + default_target: True input: "results/module_pv_wind/results/era5/NLD_NUTS2_onshore/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", From 71268ac9da271f6c30ac340478c890a9fefd7163 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 13 Nov 2025 17:28:46 +0100 Subject: [PATCH 37/59] Delete obsolete files --- .readthedocs.yaml | 19 -------------- mkdocs.yaml | 67 ----------------------------------------------- 2 files changed, 86 deletions(-) delete mode 100644 .readthedocs.yaml delete mode 100644 mkdocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index 0480acd..0000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details -version: 2 - -build: - os: ubuntu-22.04 - tools: - python: "3.12" - jobs: - install: - - asdf plugin add pixi - - asdf install pixi latest - - asdf global pixi latest - build: - html: - - pixi run build-docs -d $READTHEDOCS_OUTPUT/html - -mkdocs: - configuration: mkdocs.yaml diff --git a/mkdocs.yaml b/mkdocs.yaml deleted file mode 100644 index 6eaf66d..0000000 --- a/mkdocs.yaml +++ /dev/null @@ -1,67 +0,0 @@ -# yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json - -site_name: PV and wind area potentials and capacity factors -site_url: https://module_pv_wind.readthedocs.io/ -repo_name: module_pv_wind -repo_url: https://github.com/calliope-project/module_pv_wind/ -edit_uri: edit/main/docs/ -theme: - name: material - features: - - navigation.footer - - navigation.instant - - navigation.tabs - - navigation.tabs.sticky - - navigation.indexes - - search.suggest - - search.highlight - - toc.follow - palette: - # Palette toggle for automatic mode - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - primary: red - accent: pink - # Palette toggle for light mode - - media: "(prefers-color-scheme: light)" - scheme: default - toggle: - icon: material/weather-sunny - name: Switch to dark mode - primary: red - accent: pink - # Palette toggle for dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - toggle: - icon: material/weather-night - name: Switch to system preference - primary: red - accent: pink -markdown_extensions: - - admonition - - pymdownx.arithmatex: - generic: true - - pymdownx.betterem: - smart_enable: all - - pymdownx.details - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.snippets: - check_paths: true - restrict_base_path: true - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:mermaid2.fence_mermaid_custom - - toc: - anchorlink: true -plugins: - - search -copyright: Copyright © since 2025 module_pv_wind contributors (MIT licensed) From 16f85bcb480c31decb06e8469fe062f6aa47f957 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 13 Nov 2025 17:31:37 +0100 Subject: [PATCH 38/59] Prepend _ to follow naming convention for python modules --- workflow/scripts/{backend_atlite.py => _backend_atlite.py} | 0 workflow/scripts/prepare_capacityfactors_point_layout.py | 5 +++-- workflow/scripts/prepare_capacityfactors_raster_layout.py | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) rename workflow/scripts/{backend_atlite.py => _backend_atlite.py} (100%) diff --git a/workflow/scripts/backend_atlite.py b/workflow/scripts/_backend_atlite.py similarity index 100% rename from workflow/scripts/backend_atlite.py rename to workflow/scripts/_backend_atlite.py diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 0dc79b3..ba5c8df 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -1,13 +1,14 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" import _plots -import backend_atlite import geopandas as gpd import pandas as pd import xarray as xr import yaml from _schemas import PointLayout, Shapes +import workflow.scripts._backend_atlite as _backend_atlite + def read_yaml(filepath): """Open a yaml file as python dictionary.""" @@ -30,7 +31,7 @@ def prepare_capacityfactors_point_layout( spatial_units = spatial_units.set_index("shape_id") # compute capacityfactors - capacityfactors = backend_atlite.cf_agg_from_point_layout( + capacityfactors = _backend_atlite.cf_agg_from_point_layout( path_cutout=path_cutout, layout=layout, spatial_units=spatial_units, diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index b8c8477..68bb00d 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,13 +1,14 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" import _plots -import backend_atlite import geopandas as gpd import rioxarray as rxr import xarray as xr import yaml from _schemas import Shapes +import workflow.scripts._backend_atlite as _backend_atlite + def read_yaml(filepath): """Open a yaml file as python dictionary.""" @@ -30,7 +31,7 @@ def prepare_capacityfactors_raster_layout( layout = layout.fillna(0) # compute capacityfactors - capacityfactors = backend_atlite.cf_agg_from_raster_layout( + capacityfactors = _backend_atlite.cf_agg_from_raster_layout( path_cutout=path_cutout, layout=layout, spatial_units=spatial_units, From 212491c015f94070ae24939cc51ea2c68082c982 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 13 Nov 2025 17:32:20 +0100 Subject: [PATCH 39/59] Delete dummy content --- workflow/internal/settings.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/workflow/internal/settings.yaml b/workflow/internal/settings.yaml index cbb8ff5..97d635d 100644 --- a/workflow/internal/settings.yaml +++ b/workflow/internal/settings.yaml @@ -1,5 +1 @@ # Module settings that users cannot modify. -resources: - automatic: - # Links for automatically downloaded files - dummy_readme: "https://raw.githubusercontent.com/calliope-project/clio/refs/heads/main/README.md" From 9d83d7adf7e405baceb767d8827726223678deb2 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Thu, 13 Nov 2025 18:01:57 +0100 Subject: [PATCH 40/59] Fix name of python module when adding to source path --- workflow/Snakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/Snakefile b/workflow/Snakefile index 212a31b..0344427 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -18,7 +18,7 @@ with open(workflow.source_path("internal/settings.yaml"), "r") as f: # Load python files in scripts that are used in other scripts, but not run itself. # This is necessary for integrating the snakemake module via reference to GitHub. -workflow.source_path("scripts/backend_atlite.py") +workflow.source_path("scripts/_backend_atlite.py") # Add all your includes here. From 1ba5f138d77d2daa686ac7967a84b1ccbab5a308 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 14 Nov 2025 09:40:50 +0100 Subject: [PATCH 41/59] Make sure all python modules are in source_path --- workflow/Snakefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflow/Snakefile b/workflow/Snakefile index 0344427..d1bc8a7 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -19,6 +19,8 @@ with open(workflow.source_path("internal/settings.yaml"), "r") as f: # Load python files in scripts that are used in other scripts, but not run itself. # This is necessary for integrating the snakemake module via reference to GitHub. workflow.source_path("scripts/_backend_atlite.py") +workflow.source_path("scripts/_plots.py") +workflow.source_path("scripts/_schema.py") # Add all your includes here. From 1bfb4c3dbd743cb57c4382ae39f7014f023cbd27 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 14 Nov 2025 13:00:33 +0100 Subject: [PATCH 42/59] Fix reference --- workflow/Snakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/Snakefile b/workflow/Snakefile index d1bc8a7..0c6ff18 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -20,7 +20,7 @@ with open(workflow.source_path("internal/settings.yaml"), "r") as f: # This is necessary for integrating the snakemake module via reference to GitHub. workflow.source_path("scripts/_backend_atlite.py") workflow.source_path("scripts/_plots.py") -workflow.source_path("scripts/_schema.py") +workflow.source_path("scripts/_schemas.py") # Add all your includes here. From f16dfe32d3721ae488b485c0874e00f362d0da05 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 14 Nov 2025 13:05:22 +0100 Subject: [PATCH 43/59] Relative import --- workflow/scripts/prepare_capacityfactors_point_layout.py | 3 +-- workflow/scripts/prepare_capacityfactors_raster_layout.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index ba5c8df..1321aa0 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -1,5 +1,6 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" +import _backend_atlite as _backend_atlite import _plots import geopandas as gpd import pandas as pd @@ -7,8 +8,6 @@ import yaml from _schemas import PointLayout, Shapes -import workflow.scripts._backend_atlite as _backend_atlite - def read_yaml(filepath): """Open a yaml file as python dictionary.""" diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 68bb00d..5b93169 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,5 +1,6 @@ """Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" +import _backend_atlite as _backend_atlite import _plots import geopandas as gpd import rioxarray as rxr @@ -7,8 +8,6 @@ import yaml from _schemas import Shapes -import workflow.scripts._backend_atlite as _backend_atlite - def read_yaml(filepath): """Open a yaml file as python dictionary.""" From 23f559ceefd504a9c155b066879090870ba07a9a Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:21:23 +0100 Subject: [PATCH 44/59] Update tests/integration/test_config.yaml Co-authored-by: Stefan Pfenninger-Lee --- tests/integration/test_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/test_config.yaml b/tests/integration/test_config.yaml index 945478d..14abe47 100644 --- a/tests/integration/test_config.yaml +++ b/tests/integration/test_config.yaml @@ -14,7 +14,7 @@ module_pv_wind_point: download_cutout: False backend: atlite layout: point # raster or point - aggregate: true + aggregate: True cutout_params: module: era5 x: [3.4, 7.2] From bde2d46f8cf898de3a5db3ad2b293915ee17c786 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:02:35 +0200 Subject: [PATCH 45/59] Copier update and change license to Apache --- .copier-answers.yml | 6 +- LICENSE | 222 +++++++++++++++++++++++++++++++++++++++----- README.md | 2 +- config/README.md | 15 ++- figures/.gitkeep | 1 + pixi.toml | 2 +- 6 files changed, 214 insertions(+), 34 deletions(-) create mode 100644 figures/.gitkeep diff --git a/.copier-answers.yml b/.copier-answers.yml index be52861..85fd300 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,12 +1,12 @@ # Changes here will be overwritten by Copier -# DO NOT MANUALLY MODIFY THIS FILE +# !!!!! DO NOT MANUALLY MODIFY THIS FILE !!!!! _commit: latest _src_path: https://github.com/calliope-project/data-module-template.git author_email: j.a.c.launer@tudelft.nl author_family_name: Launer author_given_name: Jann -github_org: calliope-project -license: MIT +github_org: modelblocks-org +license: Apache-2.0 module_description: This data module produces capacity factors for PV and wind at arbitrary spatial resolution. module_long_name: PV and wind capacity factors diff --git a/LICENSE b/LICENSE index aa9b1bb..3946dd7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,201 @@ -MIT License - -Copyright (c) 2025 AUTHORS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 AUTHORS + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index cd53129..698445d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ We use [`pixi`](https://pixi.sh/) as our package manager for development. Once installed, run the following to clone this repo and install all dependencies. ```shell -git clone git@github.com:calliope-project/module_pv_wind.git +git clone git@github.com:modelblocks-org/module_pv_wind.git cd module_pv_wind pixi install --all ``` diff --git a/config/README.md b/config/README.md index 2bd88fa..720820c 100644 --- a/config/README.md +++ b/config/README.md @@ -1,9 +1,8 @@ -# Configuration +We recommend consulting the following before using this module: +- `config/config.yaml`: a generic example configuration of this module. +- `workflow/internal/config.schema.yaml`: a schematic overview of all the configuration options of this module. +- `INTERFACE.yaml`: lists module input and output files, and their default locations. +- `tests/integration/Snakefile`: an example of how to call this module from another workflow. -This workflow is part of the [clio project](https://clio.readthedocs.io/en/latest/). -Please consult our documentation for more details. -Other useful resources are: - -- `INTERFACE.yaml`: user input files (placed in `resources/user`) and module output files (placed in `results`). -- `workflow/internal/config.schema.yaml`: general configuration options. -- `tests/integration/`: a simple example of how to use this module. +This data module is part of the [Modelblocks](https://www.modelblocks.org/) project. +Please consult the [Modelblocks documentation](https://modelblocks.readthedocs.io/) for more details. diff --git a/figures/.gitkeep b/figures/.gitkeep new file mode 100644 index 0000000..dcafcbe --- /dev/null +++ b/figures/.gitkeep @@ -0,0 +1 @@ +# For module documentation figures diff --git a/pixi.toml b/pixi.toml index 84e8879..fbd1cfd 100644 --- a/pixi.toml +++ b/pixi.toml @@ -2,7 +2,7 @@ name = "module_pv_wind" authors = ["See AUTHORS file"] description = "This data module produces capacity factors for PV and wind at arbitrary spatial resolution." -license = "MIT" +license = "Apache-2.0" readme = "README.md" channels = ["conda-forge", "bioconda"] platforms = ["win-64", "linux-64", "osx-arm64"] From b01f5491fe2ff375cfa83f9f4215814b40a8b52b Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:04:29 +0200 Subject: [PATCH 46/59] Drop user/automatic from INTERFACE.yaml --- INTERFACE.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/INTERFACE.yaml b/INTERFACE.yaml index caafc3f..7fbde14 100644 --- a/INTERFACE.yaml +++ b/INTERFACE.yaml @@ -6,8 +6,6 @@ resources: "layout/{name_layout}.tif": Raster layout file describing the spatial distribution of capacity. "layout/{name_layout}.parquet": Point layout file describing the spatial distribution of capacity. "spatial_units/{name_spatial_units}.parquet": Geometries of spatial units (e.g., administrative regions). - automatic: - "cutout_era5.nc": Cutout of meteorological data downloaded from ERA5. results: "{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc": Capacity factors for the specified technology. wildcards: From 07caabb4f4571ef8b976f85bb3105447e0de0d13 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:16:04 +0200 Subject: [PATCH 47/59] Rename spatial_units as shapes --- INTERFACE.yaml | 6 ++-- tests/integration/Snakefile | 4 +-- workflow/internal/config.schema.yaml | 2 +- workflow/rules/capacity_factors.smk | 12 +++---- workflow/scripts/_backend_atlite.py | 14 ++++---- workflow/scripts/_plots.py | 2 +- .../prepare_capacityfactors_point_layout.py | 33 ++++++++----------- .../prepare_capacityfactors_raster_layout.py | 33 ++++++++----------- 8 files changed, 47 insertions(+), 59 deletions(-) diff --git a/INTERFACE.yaml b/INTERFACE.yaml index 7fbde14..ca91086 100644 --- a/INTERFACE.yaml +++ b/INTERFACE.yaml @@ -5,11 +5,11 @@ resources: "tech_specs/{name_tech}.yaml": Technology specification of PV/wind. "layout/{name_layout}.tif": Raster layout file describing the spatial distribution of capacity. "layout/{name_layout}.parquet": Point layout file describing the spatial distribution of capacity. - "spatial_units/{name_spatial_units}.parquet": Geometries of spatial units (e.g., administrative regions). + "shapes/{shape}.parquet": Geometries of shapes (e.g., administrative regions). results: - "{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc": Capacity factors for the specified technology. + "{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc": Capacity factors for the specified technology. wildcards: name_cutout: Cutout name name_tech: Technology name name_layout: Layout name - name_spatial_units: Spatial units name + shape: Shape name diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index 2c1a430..d110c9e 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -16,8 +16,8 @@ rule copy_user_resources: output: layout_points="results/module_pv_wind/resources/user/layout/wind_onshore_point.csv", layout_raster="results/module_pv_wind/resources/user/layout/wind_onshore_raster.tif", - shapes_nld="results/module_pv_wind/resources/user/spatial_units/NLD_NUTS2_onshore.parquet", - shapes_europe="results/module_pv_wind/resources/user/spatial_units/Europe_NUTS2_onshore.parquet", + shapes_nld="results/module_pv_wind/resources/user/shapes/NLD_NUTS2_onshore.parquet", + shapes_europe="results/module_pv_wind/resources/user/shapes/Europe_NUTS2_onshore.parquet", cutout="results/module_pv_wind/resources/user/cutout_era5.nc", tech_specs="results/module_pv_wind/resources/user/tech_specs/wind_onshore_3MW.yaml", shell: diff --git a/workflow/internal/config.schema.yaml b/workflow/internal/config.schema.yaml index 0ebd273..f6cf7fd 100644 --- a/workflow/internal/config.schema.yaml +++ b/workflow/internal/config.schema.yaml @@ -23,7 +23,7 @@ properties: description: "The layout type, either raster or point." aggregate: type: boolean - description: "Whether to aggregate the data to spatial_units or not." + description: "Whether to aggregate the data to shapes or not." # if download_cutout is True, need to provide these parameters, which are used to download the cutout cutout_params: type: object diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 5c826ac..00dd60f 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -5,10 +5,10 @@ if config["layout"] == "raster": cutout=path_cutout, tech_specs="resources/user/tech_specs/{name_tech}.yaml", layout="resources/user/layout/{name_layout}.tif", - spatial_units="resources/user/spatial_units/{name_spatial_units}.parquet", + shapes="resources/user/shapes/{shape}.parquet", output: - data="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", - plot_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", + data="results/{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc", + plot_map="results/{name_cutout}/{shape}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", conda: "../envs/atlite.yaml" script: @@ -21,10 +21,10 @@ elif config["layout"] == "point": cutout=path_cutout, tech_specs="resources/user/tech_specs/{name_tech}.yaml", layout="resources/user/layout/{name_layout}.csv", - spatial_units="resources/user/spatial_units/{name_spatial_units}.parquet", + shapes="resources/user/shapes/{shape}.parquet", output: - data="results/{name_cutout}/{name_spatial_units}/{name_layout}/capacityfactors_{name_tech}.nc", - plot_map="results/{name_cutout}/{name_spatial_units}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", + data="results/{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc", + plot_map="results/{name_cutout}/{shape}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", conda: "../envs/atlite.yaml" script: diff --git a/workflow/scripts/_backend_atlite.py b/workflow/scripts/_backend_atlite.py index edb49bf..6ee9572 100644 --- a/workflow/scripts/_backend_atlite.py +++ b/workflow/scripts/_backend_atlite.py @@ -11,7 +11,7 @@ def cf_agg_from_point_layout( path_cutout: str | Path, layout: xr.DataArray, - spatial_units: gpd.GeoDataFrame, + shapes: gpd.GeoDataFrame, tech_specs: dict, ) -> xr.DataArray: """Aggregated capacity factors from a point layout.""" @@ -27,7 +27,7 @@ def cf_agg_from_point_layout( specs = tech_specs["specs"] get_capacityfactors = getattr(cutout, tech) - capacityfactors = get_capacityfactors(shapes=spatial_units, layout=layout, **specs) + capacityfactors = get_capacityfactors(shapes=shapes, layout=layout, **specs) return capacityfactors @@ -35,7 +35,7 @@ def cf_agg_from_point_layout( def cf_agg_from_raster_layout( path_cutout: str | Path, layout: xr.DataArray, - spatial_units: gpd.GeoDataFrame, + shapes: gpd.GeoDataFrame, tech_specs: dict, ) -> xr.DataArray: """Aggregated capacity factors from a raster layout.""" @@ -58,9 +58,7 @@ def cf_agg_from_raster_layout( specs = tech_specs["specs"] get_capacityfactors = getattr(cutout, tech) - capacityfactors = get_capacityfactors( - shapes=spatial_units, layout=layout_matched, **specs - ) + capacityfactors = get_capacityfactors(shapes=shapes, layout=layout_matched, **specs) return capacityfactors @@ -68,7 +66,7 @@ def cf_agg_from_raster_layout( def cf_from_point_layout( cutout: atlite.Cutout, layout: xr.DataArray, - spatial_units: gpd.GeoDataFrame, + shapes: gpd.GeoDataFrame, tech_specs: dict, ) -> xr.DataArray: """Capacity factors from a point layout.""" @@ -78,7 +76,7 @@ def cf_from_point_layout( def cf_from_raster_layout( cutout: atlite.Cutout, layout: xr.DataArray, - spatial_units: gpd.GeoDataFrame, + shapes: gpd.GeoDataFrame, tech_specs: dict, ) -> xr.DataArray: """Capacity factors from a raster layout.""" diff --git a/workflow/scripts/_plots.py b/workflow/scripts/_plots.py index 1f7f1a8..ce3bd0a 100644 --- a/workflow/scripts/_plots.py +++ b/workflow/scripts/_plots.py @@ -10,7 +10,7 @@ def average_capacity_factors( cf: xr.DataArray, shapes: gpd.GeoDataFrame ) -> gpd.GeoDataFrame: - """Calculate average capacity factors per spatial unit.""" + """Calculate average capacity factors per shape.""" df_mean_cf = cf.mean(dim="time").to_dataframe(name="average_cf").reset_index() df_mean_cf.index.name = "id" diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 1321aa0..9d57a23 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -1,4 +1,4 @@ -"""Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" +"""Prepare PV capacityfactors, given a cutout, a layout, shapes to aggregate to and technology specifications.""" import _backend_atlite as _backend_atlite import _plots @@ -16,41 +16,36 @@ def read_yaml(filepath): def prepare_capacityfactors_point_layout( - path_cutout, path_spatial_units, path_tech_specs, path_layout, path_output + path_cutout, path_shapes, path_tech_specs, path_layout, path_output ): - """Prepare capacityfactors aggregated to spatial units weighted by a point layout.""" + """Prepare capacityfactors aggregated to shapes weighted by a point layout.""" # load inputs - spatial_units = gpd.read_parquet(path_spatial_units) - spatial_units = Shapes.validate(spatial_units) + shapes = gpd.read_parquet(path_shapes) + shapes = Shapes.validate(shapes) layout = pd.read_csv(path_layout, index_col=0) layout = PointLayout.validate(layout) tech_specs = read_yaml(path_tech_specs) # prepare inputs - spatial_units = spatial_units.set_index("shape_id") + shapes = shapes.set_index("shape_id") # compute capacityfactors capacityfactors = _backend_atlite.cf_agg_from_point_layout( - path_cutout=path_cutout, - layout=layout, - spatial_units=spatial_units, - tech_specs=tech_specs, + path_cutout=path_cutout, layout=layout, shapes=shapes, tech_specs=tech_specs ) # save output capacityfactors.to_netcdf(path_output) -def plot(path_capacityfactors, path_spatial_units, path_map): +def plot(path_capacityfactors, path_shapes, path_map): """Plot capacityfactors.""" # load inputs cf = xr.open_dataarray(path_capacityfactors) - spatial_units = gpd.read_parquet(path_spatial_units) - spatial_units = Shapes.validate(spatial_units) - spatial_units = spatial_units.set_index("shape_id") - gdf_mean_cf = spatial_units.join( - cf.mean(dim="time").to_dataframe(name="wind_onshore") - ) + shapes = gpd.read_parquet(path_shapes) + shapes = Shapes.validate(shapes) + shapes = shapes.set_index("shape_id") + gdf_mean_cf = shapes.join(cf.mean(dim="time").to_dataframe(name="wind_onshore")) # plot a map of annual capacityfactors fig, ax = _plots.map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="wind_onshore") @@ -60,13 +55,13 @@ def plot(path_capacityfactors, path_spatial_units, path_map): if __name__ == "__main__": prepare_capacityfactors_point_layout( path_cutout=snakemake.input.cutout, - path_spatial_units=snakemake.input.spatial_units, + path_shapes=snakemake.input.shapes, path_tech_specs=snakemake.input.tech_specs, path_layout=snakemake.input.layout, path_output=snakemake.output.data, ) plot( path_capacityfactors=snakemake.output.data, - path_spatial_units=snakemake.input.spatial_units, + path_shapes=snakemake.input.shapes, path_map=snakemake.output.plot_map, ) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 5b93169..8b00aba 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,4 +1,4 @@ -"""Prepare PV capacityfactors, given a cutout, a layout, spatial units to aggregate to and technology specifications.""" +"""Prepare PV capacityfactors, given a cutout, a layout, shapes to aggregate to and technology specifications.""" import _backend_atlite as _backend_atlite import _plots @@ -16,42 +16,37 @@ def read_yaml(filepath): def prepare_capacityfactors_raster_layout( - path_cutout, path_spatial_units, path_tech_specs, path_layout, path_output + path_cutout, path_shapes, path_tech_specs, path_layout, path_output ): - """Prepare capacityfactors aggregated to spatial units weighted by a raster layout.""" + """Prepare capacityfactors aggregated to shapes weighted by a raster layout.""" # load inputs - spatial_units = gpd.read_parquet(path_spatial_units) - spatial_units = Shapes.validate(spatial_units) + shapes = gpd.read_parquet(path_shapes) + shapes = Shapes.validate(shapes) tech_specs = read_yaml(path_tech_specs) layout = rxr.open_rasterio(path_layout, masked=True) # prepare inputs - spatial_units = spatial_units.set_index("shape_id") + shapes = shapes.set_index("shape_id") layout = layout.fillna(0) # compute capacityfactors capacityfactors = _backend_atlite.cf_agg_from_raster_layout( - path_cutout=path_cutout, - layout=layout, - spatial_units=spatial_units, - tech_specs=tech_specs, + path_cutout=path_cutout, layout=layout, shapes=shapes, tech_specs=tech_specs ) # save output capacityfactors.to_netcdf(path_output) -def plot(path_capacityfactors, path_spatial_units, path_map): +def plot(path_capacityfactors, path_shapes, path_map): """Plot capacityfactors.""" # load inputs cf = xr.open_dataarray(path_capacityfactors) - spatial_units = gpd.read_parquet(path_spatial_units) - spatial_units = Shapes.validate(spatial_units) - spatial_units = spatial_units.set_index("shape_id") + shapes = gpd.read_parquet(path_shapes) + shapes = Shapes.validate(shapes) + shapes = shapes.set_index("shape_id") - gdf_mean_cf = spatial_units.join( - cf.mean(dim="time").to_dataframe(name="wind_onshore") - ) + gdf_mean_cf = shapes.join(cf.mean(dim="time").to_dataframe(name="wind_onshore")) # plot a map of annual capacityfactors fig, ax = _plots.map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="wind_onshore") @@ -61,13 +56,13 @@ def plot(path_capacityfactors, path_spatial_units, path_map): if __name__ == "__main__": prepare_capacityfactors_raster_layout( path_cutout=snakemake.input.cutout, - path_spatial_units=snakemake.input.spatial_units, + path_shapes=snakemake.input.shapes, path_tech_specs=snakemake.input.tech_specs, path_layout=snakemake.input.layout, path_output=snakemake.output.data, ) plot( path_capacityfactors=snakemake.output.data, - path_spatial_units=snakemake.input.spatial_units, + path_shapes=snakemake.input.shapes, path_map=snakemake.output.plot_map, ) From 2c9f7396198030c19425d37ddf208c0e85e97e18 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:25:05 +0200 Subject: [PATCH 48/59] Wrap download into function --- workflow/scripts/download_cutout.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/workflow/scripts/download_cutout.py b/workflow/scripts/download_cutout.py index e119f7f..302ba70 100644 --- a/workflow/scripts/download_cutout.py +++ b/workflow/scripts/download_cutout.py @@ -7,17 +7,25 @@ logger = logging.getLogger(__name__) -if __name__ == "__main__": - logger.info(f"Using atlite version: {atlite.__version__}") - cutout_params = snakemake.config["cutout_params"] - +def download_cutout(cutout_path, cutout_params): + """Downloads a cutout based on the provided parameters.""" cutout_params["x"] = slice(*cutout_params["x"]) cutout_params["y"] = slice(*cutout_params["y"]) cutout_params["time"] = slice(*cutout_params["time"]) features = cutout_params.pop("features", None) monthly_requests = cutout_params.pop("monthly_requests", False) + logger.info(f"Preparing cutout with cutout_params: {cutout_params}") logger.info(f"Preparing cutout with features: {features}") - cutout = atlite.Cutout(snakemake.output[0], **cutout_params) + + cutout = atlite.Cutout(cutout_path, **cutout_params) cutout.prepare(features=features, monthly_requests=monthly_requests) + + +if __name__ == "__main__": + logger.info(f"Using atlite version: {atlite.__version__}") + + download_cutout( + cutout_path=snakemake.output[0], cutout_params=snakemake.config["cutout_params"] + ) From 5a24951c5aa50bdee84f665c22f640e86417a3f5 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:29:47 +0200 Subject: [PATCH 49/59] Rename functions for clarity --- workflow/scripts/_backend_atlite.py | 4 ++-- workflow/scripts/prepare_capacityfactors_point_layout.py | 2 +- workflow/scripts/prepare_capacityfactors_raster_layout.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow/scripts/_backend_atlite.py b/workflow/scripts/_backend_atlite.py index 6ee9572..91126f8 100644 --- a/workflow/scripts/_backend_atlite.py +++ b/workflow/scripts/_backend_atlite.py @@ -8,7 +8,7 @@ import xarray as xr -def cf_agg_from_point_layout( +def cf_aggregated_from_point_layout( path_cutout: str | Path, layout: xr.DataArray, shapes: gpd.GeoDataFrame, @@ -32,7 +32,7 @@ def cf_agg_from_point_layout( return capacityfactors -def cf_agg_from_raster_layout( +def cf_aggregated_from_raster_layout( path_cutout: str | Path, layout: xr.DataArray, shapes: gpd.GeoDataFrame, diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 9d57a23..2ee6f82 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -30,7 +30,7 @@ def prepare_capacityfactors_point_layout( shapes = shapes.set_index("shape_id") # compute capacityfactors - capacityfactors = _backend_atlite.cf_agg_from_point_layout( + capacityfactors = _backend_atlite.cf_aggregated_from_point_layout( path_cutout=path_cutout, layout=layout, shapes=shapes, tech_specs=tech_specs ) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 8b00aba..af5e3bf 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -30,7 +30,7 @@ def prepare_capacityfactors_raster_layout( layout = layout.fillna(0) # compute capacityfactors - capacityfactors = _backend_atlite.cf_agg_from_raster_layout( + capacityfactors = _backend_atlite.cf_aggregated_from_raster_layout( path_cutout=path_cutout, layout=layout, shapes=shapes, tech_specs=tech_specs ) From 82eb8394db0b299f9bcb9b203a027d75581b637f Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:32:07 +0200 Subject: [PATCH 50/59] Not define new variables for techs_specs --- workflow/scripts/_backend_atlite.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/workflow/scripts/_backend_atlite.py b/workflow/scripts/_backend_atlite.py index 91126f8..4f043d4 100644 --- a/workflow/scripts/_backend_atlite.py +++ b/workflow/scripts/_backend_atlite.py @@ -23,11 +23,11 @@ def cf_aggregated_from_point_layout( layout = cutout.layout_from_capacity_list(layout, col="capacity") # compute capacity factors - tech = tech_specs["tech"] - specs = tech_specs["specs"] - get_capacityfactors = getattr(cutout, tech) + get_capacityfactors = getattr(cutout, tech_specs["tech"]) - capacityfactors = get_capacityfactors(shapes=shapes, layout=layout, **specs) + capacityfactors = get_capacityfactors( + shapes=shapes, layout=layout, **tech_specs["specs"] + ) return capacityfactors @@ -54,11 +54,11 @@ def cf_aggregated_from_raster_layout( ) # compute capacity factors - tech = tech_specs["tech"] - specs = tech_specs["specs"] - get_capacityfactors = getattr(cutout, tech) + get_capacityfactors = getattr(cutout, tech_specs["tech"]) - capacityfactors = get_capacityfactors(shapes=shapes, layout=layout_matched, **specs) + capacityfactors = get_capacityfactors( + shapes=shapes, layout=layout_matched, **tech_specs["specs"] + ) return capacityfactors From 1402f4e49f8b858736edeceb1cb2e82b151a1fb2 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:35:05 +0200 Subject: [PATCH 51/59] Generic naming --- workflow/scripts/prepare_capacityfactors_point_layout.py | 8 ++++++-- workflow/scripts/prepare_capacityfactors_raster_layout.py | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 2ee6f82..7771e0d 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -45,10 +45,14 @@ def plot(path_capacityfactors, path_shapes, path_map): shapes = gpd.read_parquet(path_shapes) shapes = Shapes.validate(shapes) shapes = shapes.set_index("shape_id") - gdf_mean_cf = shapes.join(cf.mean(dim="time").to_dataframe(name="wind_onshore")) + gdf_mean_cf = shapes.join( + cf.mean(dim="time").to_dataframe(name="mean_capacityfactor") + ) # plot a map of annual capacityfactors - fig, ax = _plots.map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="wind_onshore") + fig, ax = _plots.map_capacity_factor( + gdf_mean_cf=gdf_mean_cf, column="mean_capacityfactor" + ) fig.savefig(path_map) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index af5e3bf..556f3be 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -46,10 +46,14 @@ def plot(path_capacityfactors, path_shapes, path_map): shapes = Shapes.validate(shapes) shapes = shapes.set_index("shape_id") - gdf_mean_cf = shapes.join(cf.mean(dim="time").to_dataframe(name="wind_onshore")) + gdf_mean_cf = shapes.join( + cf.mean(dim="time").to_dataframe(name="mean_capacityfactor") + ) # plot a map of annual capacityfactors - fig, ax = _plots.map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="wind_onshore") + fig, ax = _plots.map_capacity_factor( + gdf_mean_cf=gdf_mean_cf, column="mean_capacityfactor" + ) fig.savefig(path_map) From a1b65c145af56168e1f26a6731a35496b3e31a99 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:47:07 +0200 Subject: [PATCH 52/59] Write specific error message --- workflow/scripts/_backend_atlite.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/workflow/scripts/_backend_atlite.py b/workflow/scripts/_backend_atlite.py index 4f043d4..970c1af 100644 --- a/workflow/scripts/_backend_atlite.py +++ b/workflow/scripts/_backend_atlite.py @@ -70,7 +70,10 @@ def cf_from_point_layout( tech_specs: dict, ) -> xr.DataArray: """Capacity factors from a point layout.""" - raise NotImplementedError + raise NotImplementedError( + "We are planning to support capacity factors from point layout, " + "without aggregating to shapes, but it is not implemented yet." + ) def cf_from_raster_layout( @@ -80,4 +83,7 @@ def cf_from_raster_layout( tech_specs: dict, ) -> xr.DataArray: """Capacity factors from a raster layout.""" - raise NotImplementedError + raise NotImplementedError( + "We are planning to support capacity factors from raster layout, " + "without aggregating to shapes, but it is not implemented yet." + ) From 8c96e3e3a85a8ffe7d2ed9f27155aa8f92de218f Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:40:43 +0200 Subject: [PATCH 53/59] Rename test to conform to new template --- tests/{clio_test.py => integration_test.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{clio_test.py => integration_test.py} (100%) diff --git a/tests/clio_test.py b/tests/integration_test.py similarity index 100% rename from tests/clio_test.py rename to tests/integration_test.py From c4ec7c6dd1dec6fa610d8787a179a124905e3f8a Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:47:18 +0200 Subject: [PATCH 54/59] Run copier recopy --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/config.yaml | 5 +++ .github/pull_request_template.md | 11 +++++-- .github/workflows/check-version.yml | 6 +++- .github/workflows/pr-ci.yml | 40 ++++++++++++++++++++--- .github/workflows/release.yml | 4 ++- .pre-commit-config.yaml | 3 +- README.md | 48 +++++++++++++++++++++------- mypy.ini | 1 + pixi.toml | 11 ++++--- tests/integration_test.py | 13 +++++--- 11 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index cd94c32..1b66ddc 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,7 +24,7 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. Linux Fedora 41, Windows 10...] + - OS: [e.g. Linux Fedora 43, Windows 11...] - Version [e.g. v0.1.1] **Additional context** diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 0000000..28da94d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: General information + url: https://www.modelblocks.org/ + about: Please consult our website for general information on the Modelblocks methodology. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9610b97..400a69f 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,6 +8,11 @@ Fixes # ## Reviewer checklist -* [ ] `INTERFACE.yaml` is up-to-date with all relevant user resources and results. -* [ ] The integration example is up-to-date with a minimal use-case of the module. -* [ ] Module documentation is up-to-date. +* [ ] There are no `pip` dependencies in the module's environment files (`workflow/envs/`). +* [ ] All rules use `pathvars` (e.g., ``) in their inputs and outputs. +* [ ] The integration test-suite is successful, including: + * [ ] `pre-commit.ci` tests pass. + * [ ] tests pass for all relevant OS configurations (linux, osx, windows). +* [ ] Module documentation is up-to-date, including: + * [ ] `INTERFACE.yaml` mentions all relevant `pathvars` and `wildcards`. + * [ ] `README.md` describes how to use the module and has the necessary citations. diff --git a/.github/workflows/check-version.yml b/.github/workflows/check-version.yml index 8e57b32..7bde778 100644 --- a/.github/workflows/check-version.yml +++ b/.github/workflows/check-version.yml @@ -1,9 +1,13 @@ # Check for changes in the upstream template. If changes are found, an issue is created name: Template check. on: + workflow_dispatch: schedule: - cron: '0 0 1 * *' # Runs at 00:00 UTC on the 1st day of every month jobs: copier-update: - uses: calliope-project/data-module-template/.github/workflows/template-check-version.yml@latest + permissions: + contents: read + issues: write + uses: modelblocks-org/data-module-template/.github/workflows/template-check-version.yml@latest diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index a216bf5..0e17ea4 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -1,9 +1,41 @@ -name: CI +# !!!!! DO NOT MODIFY UNLESS ABSOLUTELY NECESSARY !!!!! +# This workflow helps standardise integration tests across data modules +name: Pull Request CI tests for Modelblocks data modules on: pull_request: branches: - "main" - jobs: - ci-tests: - uses: calliope-project/data-module-template/.github/workflows/template-pr-ci.yml@latest + build: + name: Build + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.12"] + steps: + - uses: actions/checkout@v4 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.8.3 + - name: Run integration tests + id: tests + run: pixi run test-integration + continue-on-error: true + - name: Run snakemake linting + id: linting + run: | + pixi run snakemake --lint --snakefile workflow/Snakefile + pixi run snakemake --lint --snakefile tests/integration/Snakefile + continue-on-error: true + - name: Save integration logs + if: ${{ always() }} + uses: actions/upload-artifact@v4 + with: + name: integration-test-logs-${{ matrix.os }} + path: tests/integration/resources/module/logs + if-no-files-found: ignore + retention-days: 30 + - name: Fail if integration or linting failed + if: ${{ steps.tests.outcome == 'failure' || steps.linting.outcome == 'failure' }} + run: exit 1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 32ab6f2..7e25226 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,4 +6,6 @@ on: jobs: release-workflow: - uses: calliope-project/data-module-template/.github/workflows/template-release.yml@latest + permissions: + contents: write + uses: modelblocks-org/data-module-template/.github/workflows/template-release.yml@latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c29fc99..ee59aa3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,6 +12,7 @@ repos: # Repo quality - id: check-added-large-files args: [--enforce-all] + exclude: ^pixi\.lock$ - id: forbid-submodules - id: check-case-conflict - id: check-illegal-windows-names @@ -44,4 +45,4 @@ repos: files: .*\.(py|smk|md)$|^Snakefile$ ci: # https://pre-commit.ci/ - autoupdate_schedule: monthly + autoupdate_schedule: quarterly diff --git a/README.md b/README.md index 698445d..38188b4 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,41 @@ This data module produces capacity factors for PV and wind at arbitrary spatial resolution. -A modular `snakemake` workflow built for [`clio`](https://clio.readthedocs.io/) data modules. + -## Using this module -This module can be imported directly into any `snakemake` workflow. -Please consult the integration example in `tests/integration/Snakefile` for more information. +## About + + +This is a modular `snakemake` workflow created as part of the [Modelblocks project](https://www.modelblocks.org/). It can be imported directly into any `snakemake` workflow. + +For more information, please consult the Modelblocks [documentation](https://modelblocks.readthedocs.io/en/latest/), +the [integration example](./tests/integration/Snakefile), +and the `snakemake` [documentation](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html). + +## Overview + + +Data processing steps: + +1. +2. + +## Configuration + + +Please consult the configuration [README](./config/README.md) and the [configuration example](./config/config.yaml) for a general overview on the configuration options of this module. + +## Input / output structure + + +Please consult the [interface file](./INTERFACE.yaml) for more information. ## Development + We use [`pixi`](https://pixi.sh/) as our package manager for development. -Once installed, run the following to clone this repo and install all dependencies. +Once installed, run the following to clone this repository and install all dependencies. ```shell git clone git@github.com:modelblocks-org/module_pv_wind.git @@ -26,12 +50,6 @@ For testing, simply run: pixi run test-integration ``` -To view the documentation locally, use: - -```shell -pixi run serve-docs -``` - To test a minimal example of a workflow using this module: ```shell @@ -39,3 +57,11 @@ pixi shell # activate this project's environment cd tests/integration/ # navigate to the integration example snakemake --use-conda --cores 2 # run the workflow! ``` + +## References + + +This module is based on the following research and datasets: + +* +* diff --git a/mypy.ini b/mypy.ini index c7b2d53..6769a42 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,4 @@ [mypy] disable_error_code = import-untyped exclude = (^|/)\.(snakemake|pixi)(/|$) +exclude_gitignore = True diff --git a/pixi.toml b/pixi.toml index fbd1cfd..40787cf 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,4 +1,4 @@ -[project] +[workspace] name = "module_pv_wind" authors = ["See AUTHORS file"] description = "This data module produces capacity factors for PV and wind at arbitrary spatial resolution." @@ -6,10 +6,10 @@ license = "Apache-2.0" readme = "README.md" channels = ["conda-forge", "bioconda"] platforms = ["win-64", "linux-64", "osx-arm64"] -homepage = "https://clio.readthedocs.io/" +homepage = "https://www.modelblocks.org/" [dependencies] -clio-tools = ">=2025.03.03" +clio-tools = ">=2026.03.30" conda = ">=25.0.0" ipdb = ">=0.13.13" ipykernel = ">=6.29.5" @@ -19,7 +19,8 @@ pytest = ">=8.3.5" python = ">=3.12" ruff = ">=0.9.9" snakefmt = ">=0.10.2" -snakemake-minimal = ">=8.29.0" +snakemake-minimal = ">=9.19.0" +pytz = ">=2026.1.post1" [tasks] -test-integration = {cmd = "pytest tests/clio_test.py"} +test-integration = {cmd = "pytest tests/integration_test.py"} diff --git a/tests/integration_test.py b/tests/integration_test.py index d810e92..009e87f 100644 --- a/tests/integration_test.py +++ b/tests/integration_test.py @@ -1,7 +1,7 @@ -"""Set of standard clio tests. +"""Set of standard Modelblocks tests. -DO NOT MANUALLY MODIFY THIS FILE! -It should be updated through our templating functions. +PLEASE ENSURE THIS SET OF MINIMAL TESTS WORKS BEFORE PUBLISHING YOUR MODULE. +Contents may be updated in future template updates. """ import subprocess @@ -25,15 +25,18 @@ def test_interface_file(module_path): @pytest.mark.parametrize( "file", [ - "CITATION.cff", "AUTHORS", + "CITATION.cff", "INTERFACE.yaml", "LICENSE", + "README.md", + "config/config.yaml", + "workflow/internal/config.schema.yaml", "tests/integration/Snakefile", ], ) def test_standard_file_existance(module_path, file): - """Check that a minimal set of files used for clio automatic docs are present.""" + """Check that a minimal set of files used for documentation are present.""" assert Path(module_path / file).exists() From dd43ce367e3d39453543119d47c8cd1cb3d6e9ef Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:08:42 +0200 Subject: [PATCH 55/59] Delete dummy script --- workflow/rules/dummy.smk | 16 ---------------- workflow/scripts/dummy_script.py | 20 -------------------- 2 files changed, 36 deletions(-) delete mode 100644 workflow/rules/dummy.smk delete mode 100644 workflow/scripts/dummy_script.py diff --git a/workflow/rules/dummy.smk b/workflow/rules/dummy.smk deleted file mode 100644 index af09f22..0000000 --- a/workflow/rules/dummy.smk +++ /dev/null @@ -1,16 +0,0 @@ -rule dummy_add_text: - message: - "Dummy rule combining user inputs and automatic downloads." - params: - config_text=config["dummy_text"], - input: - user_file="resources/user/user_message.md", - readme="resources/automatic/dummy_readme.md", - output: - combined="results/combined_text.md", - log: - "logs/dummy_add_text.log", - conda: - "../envs/shell.yaml" - script: - "../scripts/dummy_script.py" diff --git a/workflow/scripts/dummy_script.py b/workflow/scripts/dummy_script.py deleted file mode 100644 index 2ae0049..0000000 --- a/workflow/scripts/dummy_script.py +++ /dev/null @@ -1,20 +0,0 @@ -"""A simple script to serve as an example. - -Should be deleted in real workflows. -""" - -import sys -from pathlib import Path -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - snakemake: Any -sys.stderr = open(snakemake.log[0], "w") - -config = snakemake.params.config_text -readme = Path(snakemake.input.readme).read_text() -user = Path(snakemake.input.user_file).read_text() - -output_text = "\n\n".join([readme, user, config]) - -Path(snakemake.output.combined).write_text(output_text) From 257b561359bd282325f99864a0b182fc3ce85efd Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 9 Jun 2026 13:07:24 +0200 Subject: [PATCH 56/59] Use pathvars --- INTERFACE.yaml | 40 +- pixi.lock | 1294 ++++----------------------- tests/conftest.py | 28 + tests/integration/Snakefile | 70 +- tests/integration/test_config.yaml | 4 +- tests/integration_test.py | 32 +- workflow/Snakefile | 17 +- workflow/rules/automatic.smk | 6 +- workflow/rules/capacity_factors.smk | 20 +- 9 files changed, 283 insertions(+), 1228 deletions(-) create mode 100644 tests/conftest.py diff --git a/INTERFACE.yaml b/INTERFACE.yaml index ca91086..0f2f767 100644 --- a/INTERFACE.yaml +++ b/INTERFACE.yaml @@ -1,13 +1,35 @@ # Module Input-Output structure for automated doc. generation -resources: - user: - "cutout_{name_cutout}.nc": Cutout of meteorological data provided by user. - "tech_specs/{name_tech}.yaml": Technology specification of PV/wind. - "layout/{name_layout}.tif": Raster layout file describing the spatial distribution of capacity. - "layout/{name_layout}.parquet": Point layout file describing the spatial distribution of capacity. - "shapes/{shape}.parquet": Geometries of shapes (e.g., administrative regions). -results: - "{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc": Capacity factors for the specified technology. +pathvars: + snakemake_defaults: + logs: + default: "" + description: location of rule log files. + resources: + default: "" + description: "location of module resource files." + results: + default: "" + description: "location of module results." + user_resources: + cutout: + default: "/user/cutout_{name_cutout}.nc" + description: "Cutout of meteorological data provided by user." + tech_specs: + default: "/user/tech_specs/{name_tech}.yaml" + description: "Technology specification of PV/wind." + layout_raster: + default: "/user/layout/{name_layout}.tif" + description: "Raster layout file describing the spatial distribution of capacity." + layout_point: + default: "/user/layout/{name_layout}.parquet" + description: "Point layout file describing the spatial distribution of capacity." + shapes: + default: "/user/shapes/{shape}.parquet" + description: "Geometries of shapes (e.g., administrative regions)." + results: + capacity_factors: + default: "/{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc" + description: Capacity factors for the specified technology. wildcards: name_cutout: Cutout name name_tech: Technology name diff --git a/pixi.lock b/pixi.lock index 521ffd8..6a94e00 100644 --- a/pixi.lock +++ b/pixi.lock @@ -4,6 +4,8 @@ environments: channels: - url: https://conda.anaconda.org/conda-forge/ - url: https://conda.anaconda.org/bioconda/ + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 @@ -12,7 +14,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda @@ -31,7 +32,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2026.03.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.12-h4d16d09_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.9-hc46dffc_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.10-hc03379b_3.conda @@ -74,6 +75,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.1-hf516916_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-13.1.2-h87b6fe6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.1-py313h5d5ffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -206,7 +208,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda @@ -214,7 +216,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.28.0-py313h843e2db_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda @@ -230,10 +231,13 @@ environments: - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.4.1-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.22.0-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.50-py313h54dd161_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlmodel-0.0.37-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda @@ -282,7 +286,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda @@ -300,7 +303,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2026.03.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cbc-2.10.12-h0c75da4_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cgl-0.60.9-h24d7dbf_6.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-clp-1.17.10-ha5fe85a_3.conda @@ -342,6 +345,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.1-hb9d6e3a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-13.1.2-hcd33d8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/greenlet-3.5.1-py313h1188861_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.43-h5febe37_6.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -456,7 +460,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda @@ -464,7 +468,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.5.post0-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.5.post0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.28.0-py313h2c089d5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda @@ -480,10 +483,13 @@ environments: - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.4.1-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.22.0-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.50-py313h6688731_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlmodel-0.0.37-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda @@ -513,7 +519,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda @@ -528,7 +533,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2026.03.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda @@ -568,6 +573,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-13.1.2-ha5e8f4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.5.1-py313h927ade5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.2.0-h5f2951f_0.conda @@ -678,7 +684,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda @@ -686,7 +692,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-14.2.5.post0-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-cpp-14.2.5.post0-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.28.0-py313hfbe8231_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda @@ -702,11 +707,14 @@ environments: - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.4.1-pyh84498cf_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.22.0-pyhdfd78af_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.50-py313h5fd188c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlmodel-0.0.37-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda @@ -744,806 +752,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - docs: - channels: - - url: https://conda.anaconda.org/conda-forge/ - - url: https://conda.anaconda.org/bioconda/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.10.0-py313h78bf25f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313h09d1b84_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.12-h4d16d09_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cgl-0.60.9-hc46dffc_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-clp-1.17.10-hc03379b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-osi-0.108.11-hf4fecb4_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-utils-2.11.12-hc93afbd_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-25.9.1-py313h78bf25f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.17-py313h5d5ffb9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/frozendict-2.4.6-py313h07c4f96_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.4-h2b0a6b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.1-hf516916_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-13.1.2-h87b6fe6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py313h07c4f96_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyha191276_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-3.0.0-py313h78bf25f_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6f5c62b_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-38_h6ae95b6_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmambapy-2.3.3-py313hda67085_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.0-h61e6d4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.0-hca5e8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/menuinst-2.4.1-py313h78bf25f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py313h07c4f96_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py313hf6604e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py313h08cd8bf_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py313h54dd161_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pulp-2.8.0-py313hf1034c9_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.6-py313h07c4f96_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydot-4.0.1-py313h78bf25f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.28.0-py313h843e2db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.16-py313h07c4f96_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py313h07c4f96_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.4-h813ae00_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py313h78bf25f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py313h07c4f96_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.5-h5888daf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.10.0-py313h8f79df9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313h79bbab8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h6a3b0d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cbc-2.10.12-h0c75da4_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-cgl-0.60.9-h24d7dbf_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-clp-1.17.10-ha5fe85a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-osi-0.108.11-ha2b0f8f_8.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coin-or-utils-2.11.12-hbea9910_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-25.9.1-py313h8f79df9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cpp-expected-1.3.1-h4f10f1e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.17-py313hc37fe24_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.0.0-h669d743_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozendict-2.4.6-py313hcdf3177_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.4-h7542897_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.86.1-hb9d6e3a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-13.1.2-hcd33d8b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.43-h5febe37_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/immutables-0.21-py313hcdf3177_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh5552912_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyh53cf698_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-3.0.0-py313h8f79df9_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.2-gpl_h46575ef_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-38_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-38_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.5-hf598326_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hb2c3a21_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.1-he69a767_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-38_hd9741b5_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapacke-3.9.0-38_h1b118fd_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmamba-2.3.3-h1370271_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmambapy-2.3.3-py313h7196231_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.50-h280e0eb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.60.0-h5c55ec3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsolv-0.7.35-h5f525b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.5-h4a912ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/menuinst-2.4.1-py313h8f79df9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.18.2-py313h6535dbc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.4-py313h9771d21_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py313h7d16b84_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.1.3-py313h9734d34_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pulp-2.8.0-py313h02cf4f5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pycosat-0.6.6-py313hcdf3177_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydot-4.0.1-py313h8f79df9_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-14.2.5.post0-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/reproc-cpp-14.2.5.post0-h286801f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.28.0-py313h2c089d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py313h6535dbc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py313h6535dbc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.4-h382de68_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simdjson-4.0.7-ha7d2532_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313h6535dbc_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py313hcdf3177_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py313hcdf3177_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-cpp-0.8.0-ha1acc90_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - win-64: - - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-2_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/archspec-0.2.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/argparse-dataclass-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.10.0-py313hfa70ccb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py313hf510273_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py313h5ea7bf4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cbc-2.10.12-hd3ed8bd_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-cgl-0.60.9-hacf86d0_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-clp-1.17.10-h626fd10_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-osi-0.108.11-hd3a4230_8.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coin-or-utils-2.11.12-ha0a29f2_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/conda-25.9.1-py313hfa70ccb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-inject-1.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-libmamba-solver-25.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/connection_pool-0.0.3-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/cpp-expected-1.3.1-h477610d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.17-py313h927ade5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/dpath-2.2.0-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/fmt-12.0.0-h29169d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/frozendict-2.4.6-py313h5ea7bf4_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-13.1.2-ha5e8f4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.2.0-h5f2951f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh7428d3b_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/immutables-0.21-py313h5ea7bf4_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipdb-0.13.13-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh6dadd2b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.7.0-pyhe2676ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-3.0.0-py313hfa70ccb_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.2-gpl_h26aea39_100.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-38_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-38_h2a3cdd5_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.1-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h1383e82_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h7208af6_11.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.1-hd9c3897_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h1383e82_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-38_hf9ab0e9_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmamba-2.3.3-h5fbfb43_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmambapy-2.3.3-py313h17165e1_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.50-h7351971_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsolv-0.7.35-h8883371_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h06f855e_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.5-hfa2b4ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py313hd650c13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/menuinst-2.4.1-py313hfe59770_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2025.3.0-h57928b3_454.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-static-2025.3.0-hbcdf7a0_454.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.18.2-py313h5ea7bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.5-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.4-py313hce7ae62_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py313hc90dcd4_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-0.26.1-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandera-base-0.26.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.46-h3402e2f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plac-1.4.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.1.3-py313h5fd188c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pulp-2.8.0-py313h4a748c7_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-4-hd8ed1ab_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.6-py313h5ea7bf4_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.4-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py313hfbe8231_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydot-4.0.1-py313hfa70ccb_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyreadline3-3.5.4-py313hfa70ccb_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.9-h09917c8_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py313hd650c13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-14.2.5.post0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/reproc-cpp-14.2.5.post0-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.28.0-py313hfbe8231_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.16-py313h5ea7bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py313h5ea7bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.14.4-h15e3a1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/simdjson-4.0.7-h49e36cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakefmt-0.11.2-pyha6daafd_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.22.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-executor-plugins-9.3.9-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-logger-plugins-2.0.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-report-plugins-1.3.0-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-scheduler-plugins-2.0.2-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.2-py313h5ea7bf4_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/truststore-0.10.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_inspect-0.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py313h5ea7bf4_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.12-hf48077a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-h0e40799_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-h0e40799_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.6-h0e40799_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.17-h0e40799_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-cpp-0.8.0-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/yte-1.8.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h5bddc39_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py313h5fd188c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda - - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -1628,17 +836,6 @@ packages: - pkg:pypi/annotated-types?source=hash-mapping size: 18074 timestamp: 1733247158254 -- conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - sha256: 5b9ef6d338525b332e17c3ed089ca2f53a5d74b7a7b432747d29c6466e39346d - md5: f4e90937bbfc3a4a92539545a37bb448 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/appdirs?source=hash-mapping - size: 14835 - timestamp: 1733754069532 - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf md5: 54898d0f524c9dee622d44bbb081a8ab @@ -1753,42 +950,6 @@ packages: - pkg:pypi/attrs?source=hash-mapping size: 60101 timestamp: 1759762331492 -- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac - md5: 0a01c169f0ab0f91b26e77a3301fbfe4 - depends: - - python >=3.9 - - pytz >=2015.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/babel?source=hash-mapping - size: 6938256 - timestamp: 1738490268466 -- conda: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda - sha256: 3a0af23d357a07154645c41d035a4efbd15b7a642db397fa9ea0193fd58ae282 - md5: b16e2595d3a9042aa9d570375978835f - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/backrefs?source=hash-mapping - size: 143810 - timestamp: 1740887689966 -- pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - name: beautifulsoup4 - version: 4.14.2 - sha256: 5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515 - requires_dist: - - soupsieve>1.2 - - typing-extensions>=4.0.0 - - cchardet ; extra == 'cchardet' - - chardet ; extra == 'chardet' - - charset-normalizer ; extra == 'charset-normalizer' - - html5lib ; extra == 'html5lib' - - lxml ; extra == 'lxml' - requires_python: '>=3.7.0' - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.10.0-py313h78bf25f_0.conda sha256: cf9a47712ee5f086d7b88bdb2c7d475886213aab945c81d0be4c851ab2c11e18 md5: 2cb3d25fa279bf0661bc12c5fad99b76 @@ -2134,9 +1295,9 @@ packages: - pkg:pypi/click?source=hash-mapping size: 92148 timestamp: 1758270588199 -- conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2025.03.03-pyhd8ed1ab_0.conda - sha256: aeefe88574384f212db396a6b16e2980daa298239bce51a096d22317c839d856 - md5: 1eb44fb84e5eef6f73c491890ca0dd4b +- conda: https://conda.anaconda.org/conda-forge/noarch/clio-tools-2026.03.30-pyhd8ed1ab_0.conda + sha256: a8b34e4bb8854ad899e461430fbabad81fa694805e45421bfe3e56da031d44ad + md5: 169bb144044321bb1cec1bfa4ea82a5b depends: - networkx >=3.4.2 - numpy >=2.2.3 @@ -2148,10 +1309,8 @@ packages: - pyyaml >=6.0.2 license: MIT license_family: MIT - purls: - - pkg:pypi/clio-tools?source=hash-mapping - size: 14536 - timestamp: 1741282465165 + size: 15754 + timestamp: 1774882664468 - conda: https://conda.anaconda.org/conda-forge/linux-64/coin-or-cbc-2.10.12-h4d16d09_4.conda sha256: f0d30355938591dbb45530f86484e0786b7eae0afdf1790ca3640cf0e7af6899 md5: 603a1a18878030b5e6793ba558fac972 @@ -2847,13 +2006,6 @@ packages: - pkg:pypi/dpath?source=hash-mapping size: 21853 timestamp: 1762165431693 -- pypi: https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl - name: editorconfig - version: 0.17.1 - sha256: 1eda9c2c0db8c16dbd50111b710572a5e6de934e39772de1959d41f64fc17c82 - requires_dist: - - mypy>=1.15 ; extra == 'dev' - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda sha256: a5b51e491fec22bcc1765f5b2c8fff8a97428e9a5a7ee6730095fb9d091b0747 md5: 057083b06ccf1c2778344b6dabace38b @@ -3193,18 +2345,6 @@ packages: purls: [] size: 26238 timestamp: 1750744808182 -- conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 - md5: 93f742fe078a7b34c29a182958d4d765 - depends: - - python >=3.9 - - python-dateutil >=2.8.1 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/ghp-import?source=hash-mapping - size: 16538 - timestamp: 1734344477841 - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda sha256: dbbec21a369872c8ebe23cb9a3b9d63638479ee30face165aa0fccc96e93eec3 md5: 7c14f3706e099f8fcd47af2d494616cc @@ -3357,6 +2497,45 @@ packages: purls: [] size: 1208526 timestamp: 1754732367050 +- conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.1-py313h5d5ffb9_0.conda + sha256: 877e63a855f344c389160720055621c4aeb872d9c7b5ad3beb2af18952efe4f5 + md5: 9867806877cf07748b06ed37462473e3 + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + size: 263116 + timestamp: 1779292372878 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/greenlet-3.5.1-py313h1188861_0.conda + sha256: 5b2da35b7b6ca1124c0d9c19167b711810f12f06674c0e7ef845e6c698676b80 + md5: 6844fa63ef5a00e2c0a4a58463cf2ad0 + depends: + - python + - python 3.13.* *_cp313 + - libcxx >=19 + - __osx >=11.0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + size: 259778 + timestamp: 1779292735843 +- conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.5.1-py313h927ade5_0.conda + sha256: 3c307eb81151061e3ea1008e8037a806490ca04a81bda2cf7100f8778fdb0702 + md5: 1c49f7dca225db3667bd140478d8bcdc + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + size: 245078 + timestamp: 1779292429301 - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda sha256: 004688fbb2c479b200a6d85ef38c3129fcd4ce13537b7ee2371d962b372761c1 md5: f9f33c65b20e6a61f21714785e3613ec @@ -3885,13 +3064,6 @@ packages: - pkg:pypi/jinja2?source=hash-mapping size: 112714 timestamp: 1741263433881 -- pypi: https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl - name: jsbeautifier - version: 1.15.4 - sha256: 72f65de312a3f10900d7685557f84cb61a9733c50dcc27271a39f5b0051bf528 - requires_dist: - - six>=1.13.0 - - editorconfig>=0.12.2 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.33-pyhd8ed1ab_1.conda sha256: 304955757d1fedbe344af43b12b5467cca072f83cce6109361ba942e186b3993 md5: cb60ae9cf02b9fcb8004dec4089e5691 @@ -5975,18 +5147,6 @@ packages: purls: [] size: 165589 timestamp: 1753889311940 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - sha256: 32af5d32e3193b7c0ea02c33cc8753bfc0965d07e1aa58418a851d0bb94a7792 - md5: 934afb77580165027b869d4104ee002f - depends: - - importlib-metadata >=4.4 - - python >=3.10 - - python - license: BSD-3-Clause - purls: - - pkg:pypi/markdown?source=hash-mapping - size: 85401 - timestamp: 1762856570927 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 md5: c14389156310b8ed3520d84f854be1ee @@ -6085,110 +5245,6 @@ packages: - pkg:pypi/menuinst?source=hash-mapping size: 174013 timestamp: 1761300214367 -- conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - sha256: e5b555fd638334a253d83df14e3c913ef8ce10100090e17fd6fb8e752d36f95d - md5: d9a8fc1f01deae61735c88ec242e855c - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mergedeep?source=hash-mapping - size: 11676 - timestamp: 1734157119152 -- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda - sha256: 902d2e251f9a7ffa7d86a3e62be5b2395e28614bd4dbe5f50acf921fd64a8c35 - md5: 14661160be39d78f2b210f2cc2766059 - depends: - - click >=7.0 - - colorama >=0.4 - - ghp-import >=1.0 - - importlib-metadata >=4.4 - - jinja2 >=2.11.1 - - markdown >=3.3.6 - - markupsafe >=2.0.1 - - mergedeep >=1.3.4 - - mkdocs-get-deps >=0.2.0 - - packaging >=20.5 - - pathspec >=0.11.1 - - python >=3.9 - - pyyaml >=5.1 - - pyyaml-env-tag >=0.1 - - watchdog >=2.0 - constrains: - - babel >=2.9.0 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/mkdocs?source=hash-mapping - size: 3524754 - timestamp: 1734344673481 -- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - sha256: e0b501b96f7e393757fb2a61d042015966f6c5e9ac825925e43f9a6eafa907b6 - md5: 84382acddb26c27c70f2de8d4c830830 - depends: - - importlib-metadata >=4.3 - - mergedeep >=1.3.4 - - platformdirs >=2.2.0 - - python >=3.9 - - pyyaml >=5.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mkdocs-get-deps?source=hash-mapping - size: 14757 - timestamp: 1734353035244 -- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.7.0-pyhcf101f3_0.conda - sha256: c14cfff88be4ea779071f1ddb9c1944fa7d2a2c7f9ea09b8e0b9f5b84a70e6c1 - md5: 0ee60d02b6ffe184d355e1318d7e9207 - depends: - - python >=3.10 - - jinja2 >=3.0,<4.dev0 - - markdown >=3.2,<4.dev0 - - mkdocs >=1.6,<2.dev0 - - mkdocs-material-extensions >=1.3,<2.dev0 - - pygments >=2.16,<3.dev0 - - pymdown-extensions >=10.2,<11.dev0 - - babel >=2.10,<3.dev0 - - colorama >=0.4,<1.dev0 - - paginate >=0.5,<1.dev0 - - backrefs >=5.7.post1,<6.dev0 - - requests >=2.26,<3.dev0 - - python - license: MIT - purls: - - pkg:pypi/mkdocs-material?source=hash-mapping - size: 4793171 - timestamp: 1762865411798 -- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda - sha256: f62955d40926770ab65cc54f7db5fde6c073a3ba36a0787a7a5767017da50aa3 - md5: de8af4000a4872e16fb784c649679c8e - depends: - - python >=3.9 - constrains: - - mkdocs-material >=5.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mkdocs-material-extensions?source=hash-mapping - size: 16122 - timestamp: 1734641109286 -- pypi: https://files.pythonhosted.org/packages/1a/4b/6fd6dd632019b7f522f1b1f794ab6115cd79890330986614be56fd18f0eb/mkdocs_mermaid2_plugin-1.2.3-py3-none-any.whl - name: mkdocs-mermaid2-plugin - version: 1.2.3 - sha256: 33f60c582be623ed53829a96e19284fc7f1b74a1dbae78d4d2e47fe00c3e190d - requires_dist: - - beautifulsoup4>=4.6.3 - - jsbeautifier - - mkdocs>=1.0.4 - - pymdown-extensions>=8.0 - - requests - - setuptools>=18.5 - - mkdocs-macros-test ; extra == 'test' - - mkdocs-material ; extra == 'test' - - packaging ; extra == 'test' - - requests-html ; extra == 'test' - requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda sha256: 3c432e77720726c6bd83e9ee37ac8d0e3dd7c4cf9b4c5805e1d384025f9e9ab6 md5: c83ec81713512467dfe1b496a8292544 @@ -6470,17 +5526,6 @@ packages: - pkg:pypi/packaging?source=hash-mapping size: 62477 timestamp: 1745345660407 -- conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda - sha256: f6fef1b43b0d3d92476e1870c08d7b9c229aebab9a0556b073a5e1641cf453bd - md5: c3f35453097faf911fd3f6023fc2ab24 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/paginate?source=hash-mapping - size: 18865 - timestamp: 1734618649164 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py313h08cd8bf_1.conda sha256: c4ce5f75d175cb264dc98af6db14378222b63955c63bf1b5e30e042e81624fae md5: 9e87d4bda0c2711161d765332fa38781 @@ -7214,19 +6259,6 @@ packages: - pkg:pypi/pygments?source=hash-mapping size: 889287 timestamp: 1750615908735 -- conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda - sha256: 8f575f123694e5acd2829440da55828f2cea60b0af5d8fa5406d83251ba80f61 - md5: 26e013bc453e643991cfa9b76911fb79 - depends: - - markdown >=3.6 - - python >=3.9 - - pyyaml - license: MIT - license_family: MIT - purls: - - pkg:pypi/pymdown-extensions?source=hash-mapping - size: 170121 - timestamp: 1753743741894 - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda sha256: 6814b61b94e95ffc45ec539a6424d8447895fef75b0fec7e1be31f5beee883fb md5: 6c8979be6d7a17692793114fa26916e8 @@ -7428,17 +6460,16 @@ packages: purls: [] size: 7002 timestamp: 1752805902938 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 - md5: bc8e3267d44011051f2eb14d22fb0960 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.2-pyhcf101f3_0.conda + sha256: 5020863d629f584b5c057333a67a7aed43e3ed013ba15dd70f353501ccb5aff6 + md5: 03cb60f505ad3ada0a95277af5faeb1a depends: - - python >=3.9 + - python >=3.10 + - python license: MIT license_family: MIT - purls: - - pkg:pypi/pytz?source=hash-mapping - size: 189015 - timestamp: 1742920947249 + size: 201747 + timestamp: 1777892201250 - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py313h40c08fc_1.conda sha256: 87eaeb79b5961e0f216aa840bc35d5f0b9b123acffaecc4fda4de48891901f20 md5: 1ce4f826332dca56c76a5b0cc89fb19e @@ -7503,18 +6534,6 @@ packages: - pkg:pypi/pyyaml?source=compressed-mapping size: 182043 timestamp: 1758892011955 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - sha256: 69ab63bd45587406ae911811fc4d4c1bf972d643fa57a009de7c01ac978c4edd - md5: e8e53c4150a1bba3b160eacf9d53a51b - depends: - - python >=3.9 - - pyyaml - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml-env-tag?source=hash-mapping - size: 11137 - timestamp: 1747237061448 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda noarch: python sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 @@ -7695,17 +6714,6 @@ packages: - pkg:pypi/requests?source=hash-mapping size: 59263 timestamp: 1755614348400 -- conda: https://conda.anaconda.org/conda-forge/noarch/reretry-0.11.8-pyhd8ed1ab_1.conda - sha256: f010d25e0ab452c0339a42807c84316bf30c5b8602b9d74d566abf1956d23269 - md5: b965b0dfdb3c89966a6a25060f73aa67 - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/reretry?source=hash-mapping - size: 12563 - timestamp: 1735477549872 - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.28.0-py313h843e2db_1.conda sha256: d0bcf40c20b4c4921b0c244b2ae1a9188f511cdeff5974602900257d7aa2ee0c md5: b4e5c52948b191bfb04da5788217afdb @@ -8043,30 +7051,28 @@ packages: - pkg:pypi/snakemake-interface-scheduler-plugins?source=hash-mapping size: 16446 timestamp: 1760984180933 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.2.3-pyhd4c3c12_0.conda - sha256: 50f8a95c5686f36c7d0dfed75390486262e90fc9ed61ead1cd7370e4b2d9e2df - md5: 0de5b58d7772fb879c4117fb37121e0b +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-storage-plugins-4.4.1-pyh84498cf_0.conda + sha256: 695a2c5c2bc417df0e440943f7637953f9e8c6e887c59432947d7e14ae1ffdac + md5: 8e6d2ea30aec2f8eabd03cac524f1f33 depends: + - humanfriendly >=10.0,<11 - python >=3.11.0,<4.0.0 - - reretry >=0.11.8,<0.12.0 - snakemake-interface-common >=1.12.0,<2.0.0 + - tenacity >=9.1.4,<10.0 - throttler >=1.2.2,<2.0.0 - wrapt >=1.15.0,<2.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/snakemake-interface-storage-plugins?source=hash-mapping - size: 21160 - timestamp: 1757532381070 -- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.13.7-pyhdfd78af_0.conda - sha256: 5dc6bd1af61df9feafd465dbec137c01662b97eaab869f935a874b4ab419c982 - md5: 73ec528671afc935af025f5e2489deae + size: 22783 + timestamp: 1773699846635 +- conda: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.22.0-pyhdfd78af_0.conda + sha256: cd80ed5caf6405af8b55788057862e386dc3b1e49ac483dc151639d03e7dfde1 + md5: 11ba597632bcb10e10350e55e930627b depends: - - appdirs - conda-inject >=1.3.1,<2.0 - configargparse - connection_pool >=0.0.3 - - docutils + - docutils >=0.20,<0.23 - dpath >=2.1.6,<3.0.0 - gitpython - humanfriendly @@ -8075,34 +7081,85 @@ packages: - jsonschema - nbformat - packaging >=24.0 + - platformdirs - psutil - pulp >=2.3.1,<3.4 - python >=3.11,<3.14 - pyyaml + - referencing - requests >=2.8.1,<3.0 - - reretry - smart_open >=4.0,<8.0 - snakemake-interface-common >=1.20.1,<2.0 - snakemake-interface-executor-plugins >=9.3.2,<10.0 - snakemake-interface-logger-plugins >=1.1.0,<3.0.0 - snakemake-interface-report-plugins >=1.2.0,<2.0.0 - snakemake-interface-scheduler-plugins >=2.0.0,<3.0.0 - - snakemake-interface-storage-plugins >=4.1.0,<5.0 + - snakemake-interface-storage-plugins >=4.3.2,<5.0 + - sqlmodel >=0.0.37,<0.0.38 - tabulate + - tenacity >=9.1.4,<10.0 - throttler - wrapt - yte >=1.5.5,<2.0 license: MIT license_family: MIT - purls: - - pkg:pypi/snakemake?source=hash-mapping - size: 866236 - timestamp: 1762533314130 -- pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - name: soupsieve - version: '2.8' - sha256: 0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c - requires_python: '>=3.9' + size: 888285 + timestamp: 1780342021389 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.50-py313h54dd161_0.conda + sha256: c7c588e0eca51e2d3580ca1cfc120ccd5f32a8037fa520bfdcc3cdee76256c8a + md5: fb6c372546799fe16e73c25eac303807 + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + size: 3850199 + timestamp: 1779661488554 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.50-py313h6688731_0.conda + sha256: 968482e8b9dfe55b0409c644d77b33e368d518ace5ddd9422c5af8378f490612 + md5: 268daeb1883194f500fe0f535a3d865d + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - __osx >=11.0 + - python 3.13.* *_cp313 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + size: 3845259 + timestamp: 1779661555780 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.50-py313h5fd188c_0.conda + sha256: 2622c3b122f23254f78489bdf84b0a05776355b5445322ccebbdc74e4e461a46 + md5: 60541f9820decf6d566992f020599c76 + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + size: 3813570 + timestamp: 1779661518203 +- conda: https://conda.anaconda.org/conda-forge/noarch/sqlmodel-0.0.37-pyhcf101f3_0.conda + sha256: 9cbf4805021fd817fde2654ccc1a1bd0352647614819a28381e81098efe4da20 + md5: 00e6147bef9a85139099c9861c3b976b + depends: + - python >=3.10 + - sqlalchemy >=2.0.14,<2.1.0 + - pydantic >=2.11.0 + - python + license: MIT + license_family: MIT + size: 30854 + timestamp: 1771872849343 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 md5: b1b505328da7a6b246787df4b5a49fbc @@ -8140,6 +7197,16 @@ packages: purls: [] size: 155714 timestamp: 1762510341121 +- conda: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda + sha256: 32e75900d6a094ffe4290a8c9f1fa15744d9da8ff617aba4acaa0f057a065c34 + md5: 043f0599dc8aa023369deacdb5ac24eb + depends: + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + size: 31404 + timestamp: 1770510172846 - conda: https://conda.anaconda.org/conda-forge/noarch/throttler-1.2.2-pyhd8ed1ab_0.conda sha256: cdd2067b03db7ed7a958de74edc1a4f8c4ae6d0aa1a61b5b70b89de5013f0f78 md5: 6fc48bef3b400c82abaee323a9d4e290 @@ -8418,47 +7485,6 @@ packages: purls: [] size: 114846 timestamp: 1760418593847 -- conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py313h78bf25f_1.conda - sha256: 73225611a442fdebc9d333951037a428f6e9b8449d4194030457c026970a3283 - md5: d643d87d7df61d3d47db87bdd4571ec6 - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - pyyaml >=3.10 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/watchdog?source=hash-mapping - size: 144014 - timestamp: 1756135338277 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py313hcdf3177_1.conda - sha256: ba78762d8b75bc1278861c81860685a82bf5f5b2c6cf1aadfbb9e08d7904161e - md5: 1aeffac355c1e143fb0564e9f756be16 - depends: - - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - pyyaml >=3.10 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/watchdog?source=hash-mapping - size: 152813 - timestamp: 1756135648190 -- conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py313hfa70ccb_1.conda - sha256: 06263427dcd0100706d26c0461f2ff8356f23f4b2ee047f67d0cd7f073e2c842 - md5: ff8bfc0c2479faccdfa9ec9859ed663b - depends: - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - pyyaml >=3.10 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/watchdog?source=hash-mapping - size: 168440 - timestamp: 1756135584322 - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 md5: 035da2e4f5770f036ff704fa17aace24 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..8f2eb4f --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,28 @@ +"""Shared test fixtures.""" + +import shutil +import zipfile +from pathlib import Path +from urllib.request import urlretrieve + +import pytest + +TEST_FILES = ( + "https://surfdrive.surf.nl/public.php/dav/files/sWnJHFJYHNtYss3/?accept=zip" +) + + +@pytest.fixture(scope="session") +def user_path() -> Path: + """Download and unzip test files.""" + user_dir = Path("resources/user/") + # If test suite has been downloaded, assume everything is OK. + # Otherwise, cleanup and re-download. + if not Path(user_dir / "module_pv_wind_files.zip").exists(): + shutil.rmtree(user_dir, ignore_errors=True) + Path(user_dir).mkdir(parents=True, exist_ok=True) + test_zip = Path(user_dir / "module_pv_wind_files.zip") + urlretrieve(TEST_FILES, test_zip) + with zipfile.ZipFile(test_zip, "r") as zfile: + zfile.extractall(user_dir) + return user_dir diff --git a/tests/integration/Snakefile b/tests/integration/Snakefile index d110c9e..cd93a9a 100644 --- a/tests/integration/Snakefile +++ b/tests/integration/Snakefile @@ -2,77 +2,19 @@ configfile: workflow.source_path("./test_config.yaml") -# Emulate how another workflow might create inputs for this module. -rule copy_user_resources: - message: - "Copy user resources used in the tests to module." - input: - layout_points="../files/layout_points_NLD.csv", - layout_raster="../files/layout_raster_europe.tif", - shapes_nld="../files/NLD_NUTS2_onshore.parquet", - shapes_europe="../files/Europe_NUTS2_onshore.parquet", - cutout="../files/era5.nc", - tech_specs="../files/wind_onshore_3MW.yaml", - output: - layout_points="results/module_pv_wind/resources/user/layout/wind_onshore_point.csv", - layout_raster="results/module_pv_wind/resources/user/layout/wind_onshore_raster.tif", - shapes_nld="results/module_pv_wind/resources/user/shapes/NLD_NUTS2_onshore.parquet", - shapes_europe="results/module_pv_wind/resources/user/shapes/Europe_NUTS2_onshore.parquet", - cutout="results/module_pv_wind/resources/user/cutout_era5.nc", - tech_specs="results/module_pv_wind/resources/user/tech_specs/wind_onshore_3MW.yaml", - shell: - """ - cp {input.layout_points} {output.layout_points} - cp {input.layout_raster} {output.layout_raster} - cp {input.shapes_nld} {output.shapes_nld} - cp {input.shapes_europe} {output.shapes_europe} - cp {input.cutout} {output.cutout} - cp {input.tech_specs} {output.tech_specs} - """ - - -# Import the module and configure it to use a raster layout. -# `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers -# `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. -module module_pv_wind_raster: - snakefile: - "../../workflow/Snakefile" - config: - config["module_pv_wind_raster"] - prefix: - "results/module_pv_wind/" - - -# rename all module rules with a prefix, to avoid naming conflicts. -use rule * from module_pv_wind_raster as module_pv_wind_raster_* - - -# Request something from the module -rule nld_raster: - message: - "Create capacity factors for onshore wind based on a raster layout." - default_target: True - input: - "results/module_pv_wind/results/era5/NLD_NUTS2_onshore/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", - - -rule europe_raster: - message: - "Create capacity factors for onshore wind based on a raster layout." - input: - "results/module_pv_wind/results/era5/Europe_NUTS2_onshore/wind_onshore_raster/capacityfactors_wind_onshore_3MW.nc", - - # Import the module and configure it to use a point layout. # `snakefile:` specifies the module. It can use file paths and special github(...) / gitlab(...) markers # `prefix:` re-routes all input/output paths of the module, helping to avoid file conflicts. module module_pv_wind_point: + pathvars: + cutout="resources/user/cutout_era5.nc", + shapes="resources/user/shapes_{shape}.parquet", + layout_point="resources/user/layout_{layout}.csv", + tech_specs="resources/user/tech_specs_{tech}.yaml", snakefile: "../../workflow/Snakefile" config: config["module_pv_wind_point"] - prefix: - "results/module_pv_wind/" # rename all module rules with a prefix, to avoid naming conflicts. @@ -85,4 +27,4 @@ rule nld_point: "Create capacity factors for onshore wind based on a point layout." default_target: True input: - "results/module_pv_wind/results/era5/NLD_NUTS2_onshore/wind_onshore_point/capacityfactors_wind_onshore_3MW.nc", + "results/module_pv_wind/results/era5/NLD_NUTS2_onshore/points_NLD/capacityfactors_wind_onshore_3MW.nc", diff --git a/tests/integration/test_config.yaml b/tests/integration/test_config.yaml index 14abe47..61b0588 100644 --- a/tests/integration/test_config.yaml +++ b/tests/integration/test_config.yaml @@ -7,7 +7,7 @@ module_pv_wind_raster: module: era5 x: [3.4, 7.2] y: [50.7, 53.5] - time: ["2017-01", "2017-02"] + time: ["2017-01-01", "2017-01-03"] features: ['height', 'wind', 'influx', 'temperature'] module_pv_wind_point: @@ -19,5 +19,5 @@ module_pv_wind_point: module: era5 x: [3.4, 7.2] y: [50.7, 53.5] - time: ["2017-01", "2017-02"] + time: ["2017-01-01", "2017-01-03"] features: ['height', 'wind', 'influx', 'temperature'] diff --git a/tests/integration_test.py b/tests/integration_test.py index 009e87f..e189f4a 100644 --- a/tests/integration_test.py +++ b/tests/integration_test.py @@ -4,6 +4,7 @@ Contents may be updated in future template updates. """ +import shutil import subprocess from pathlib import Path @@ -17,6 +18,30 @@ def module_path(): return Path(__file__).parent.parent +@pytest.fixture(scope="module") +def integration_path(user_path: Path, module_path: Path): + """Ensures the minimal integration test is ready.""" + integration_dir = Path(module_path / "tests/integration") + if integration_dir.exists(): + # clean everything + shutil.rmtree(integration_dir / "resources", ignore_errors=True) + shutil.rmtree(integration_dir / "results/", ignore_errors=True) + user_integ_dir = integration_dir / "resources/user/" + files_to_copy = [ + "cutout_era5.nc", + "shapes_Europe_NUTS2_onshore.parquet", + "shapes_NLD_NUTS2_onshore.parquet", + "layout_raster_europe.tif", + "layout_points_NLD.csv", + "tech_specs_wind_onshore_3MW.yaml", + ] + for file in files_to_copy: + destination_file = Path(user_integ_dir / file) + destination_file.parent.mkdir(parents=True, exist_ok=True) + shutil.copy(user_path / file, destination_file) + return integration_dir + + def test_interface_file(module_path): """The interfacing file should be correct.""" assert ModuleInterface.from_yaml(module_path / "INTERFACE.yaml") @@ -48,11 +73,8 @@ def test_snakemake_all_failure(module_path): assert "INVALID (missing locally)" in str(process.stderr) -def test_snakemake_integration_testing(module_path): +def test_snakemake_integration_testing(integration_path): """Run a light-weight test simulating someone using this module.""" assert subprocess.run( - "snakemake --use-conda --cores 1", - shell=True, - check=True, - cwd=module_path / "tests/integration", + "snakemake --use-conda --cores 1", shell=True, check=True, cwd=integration_path ) diff --git a/workflow/Snakefile b/workflow/Snakefile index 0c6ff18..ce5f1a7 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -2,7 +2,22 @@ import yaml from snakemake.utils import min_version, validate -min_version("8.10") +min_version("9.19") + + +# !!!!! IMPORTANT !!!!! +# Define pathvars for all user resource files and result files +# This allows users to re-wire how the module is used in their workflow with ease. +pathvars: + # User resources + cutout="/user/cutout_{cutout}.nc", + tech_specs="/user/tech_specs_{tech}.yaml", + layout_raster="/user/layout_{layout}.tif", + layout_point="/user/layout_{layout}.csv", + shapes="/user/shapes_{shape}.parquet", + # Module results + capacity_factors="/{cutout}/{shape}/{layout}/capacityfactors_{tech}.nc", + plot_map="/{cutout}/{shape}/{layout}/capacityfactors_map_{tech}.png", # Load the example configuration. This will be overridden by users. diff --git a/workflow/rules/automatic.smk b/workflow/rules/automatic.smk index 3a048e8..73fa641 100644 --- a/workflow/rules/automatic.smk +++ b/workflow/rules/automatic.smk @@ -2,15 +2,15 @@ if config["download_cutout"]: - path_cutout = ancient("resources/automatic/cutout_era5.nc") + path_cutout = ancient("") rule download_cutout: output: - "resources/automatic/cutout_era5.nc", + path_cutout, conda: "../envs/atlite.yaml" script: "../scripts/download_cutout.py" else: - path_cutout = ancient("resources/user/cutout_{name_cutout}.nc") + path_cutout = ancient("") diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 00dd60f..3d81b48 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -3,12 +3,12 @@ if config["layout"] == "raster": rule prepare_capacityfactors_raster_layout: input: cutout=path_cutout, - tech_specs="resources/user/tech_specs/{name_tech}.yaml", - layout="resources/user/layout/{name_layout}.tif", - shapes="resources/user/shapes/{shape}.parquet", + tech_specs="", + layout="", + shapes="", output: - data="results/{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc", - plot_map="results/{name_cutout}/{shape}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", + data="", + plot_map="", conda: "../envs/atlite.yaml" script: @@ -19,12 +19,12 @@ elif config["layout"] == "point": rule prepare_capacityfactors_point_layout: input: cutout=path_cutout, - tech_specs="resources/user/tech_specs/{name_tech}.yaml", - layout="resources/user/layout/{name_layout}.csv", - shapes="resources/user/shapes/{shape}.parquet", + tech_specs="", + layout="", + shapes="", output: - data="results/{name_cutout}/{shape}/{name_layout}/capacityfactors_{name_tech}.nc", - plot_map="results/{name_cutout}/{shape}/{name_layout}/annual_capacity_factors_{name_tech}_map.png", + data="", + plot_map="", conda: "../envs/atlite.yaml" script: From 2e2d502bfc85e6945e7ffbd877bd9563bc8a4451 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Tue, 9 Jun 2026 13:11:18 +0200 Subject: [PATCH 57/59] Bump pandera to handle errors during validation --- workflow/envs/atlite.yaml | 2 +- workflow/scripts/_schemas.py | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/workflow/envs/atlite.yaml b/workflow/envs/atlite.yaml index 3de0cf1..8b8e278 100644 --- a/workflow/envs/atlite.yaml +++ b/workflow/envs/atlite.yaml @@ -9,4 +9,4 @@ dependencies: - rioxarray - rasterio - geopandas - - pandera-geopandas=0.24.0 + - pandera-geopandas=0.31.1 diff --git a/workflow/scripts/_schemas.py b/workflow/scripts/_schemas.py index c055f0e..68b295a 100644 --- a/workflow/scripts/_schemas.py +++ b/workflow/scripts/_schemas.py @@ -1,6 +1,7 @@ """Schemas for tabular data used in the workflow.""" -from pandera.pandas import DataFrameModel, Field, check +from pandera import Field, check +from pandera.pandas import DataFrameModel from pandera.typing.geopandas import GeoSeries from pandera.typing.pandas import Index, Series from shapely.geometry import Point @@ -13,13 +14,13 @@ class Config: id: Index[int] = Field(unique=True) "Unique ID for this layout point." - techs: Series[str] + techs: Series[str] = Field() "Technology type" - lat: Series[float] + lat: Series[float] = Field() "Latitude" - lon: Series[float] + lon: Series[float] = Field() "Longitude" - capacity: Series[float] + capacity: Series[float] = Field() "Installed capacity" @@ -30,13 +31,13 @@ class Config: shape_id: Series[str] = Field(unique=True) "Unique ID for this shape." - country_id: Series[str] + country_id: Series[str] = Field() "ISO alpha-3 code." shape_class: Series[str] = Field(isin=["land", "maritime"]) "Shape classifier" geometry: GeoSeries[Point] = Field() "Shape polygon." - @check("geometry", element_wise=True) + @check("geometry") def geom_not_empty(cls, geom): - return (geom is not None) and (not geom.is_empty) and geom.is_valid + return geom.notna().all() & (~geom.is_empty).all() & geom.is_valid.all() From 0a6bae89fe73ab7710ff2bb23a585a0ae1d5fd85 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 10 Jun 2026 14:47:35 +0200 Subject: [PATCH 58/59] Avoid using ancient on output --- workflow/rules/automatic.smk | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/workflow/rules/automatic.smk b/workflow/rules/automatic.smk index 73fa641..496c5e1 100644 --- a/workflow/rules/automatic.smk +++ b/workflow/rules/automatic.smk @@ -2,15 +2,13 @@ if config["download_cutout"]: - path_cutout = ancient("") - rule download_cutout: output: - path_cutout, + "", conda: "../envs/atlite.yaml" script: "../scripts/download_cutout.py" -else: - path_cutout = ancient("") + +path_cutout = ancient("") From b8c9dc2c19394bd5a2cc8f778296493769683949 Mon Sep 17 00:00:00 2001 From: Jann Launer <32454596+jnnr@users.noreply.github.com> Date: Wed, 10 Jun 2026 15:02:16 +0200 Subject: [PATCH 59/59] Refine plots --- workflow/Snakefile | 1 + workflow/rules/capacity_factors.smk | 2 + workflow/scripts/_plots.py | 98 ++++++++++++++++--- .../prepare_capacityfactors_point_layout.py | 28 ++---- .../prepare_capacityfactors_raster_layout.py | 29 ++---- 5 files changed, 104 insertions(+), 54 deletions(-) diff --git a/workflow/Snakefile b/workflow/Snakefile index ce5f1a7..7e82440 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -18,6 +18,7 @@ pathvars: # Module results capacity_factors="/{cutout}/{shape}/{layout}/capacityfactors_{tech}.nc", plot_map="/{cutout}/{shape}/{layout}/capacityfactors_map_{tech}.png", + plot_overview="/{cutout}/{shape}/{layout}/capacityfactors_overview_{tech}.png", # Load the example configuration. This will be overridden by users. diff --git a/workflow/rules/capacity_factors.smk b/workflow/rules/capacity_factors.smk index 3d81b48..846206e 100644 --- a/workflow/rules/capacity_factors.smk +++ b/workflow/rules/capacity_factors.smk @@ -9,6 +9,7 @@ if config["layout"] == "raster": output: data="", plot_map="", + plot_overview="", conda: "../envs/atlite.yaml" script: @@ -25,6 +26,7 @@ elif config["layout"] == "point": output: data="", plot_map="", + plot_overview="", conda: "../envs/atlite.yaml" script: diff --git a/workflow/scripts/_plots.py b/workflow/scripts/_plots.py index ce3bd0a..5597a4a 100644 --- a/workflow/scripts/_plots.py +++ b/workflow/scripts/_plots.py @@ -1,26 +1,102 @@ import geopandas as gpd import matplotlib.pyplot as plt +import pandas as pd import xarray as xr +from _schemas import Shapes from matplotlib.colors import LinearSegmentedColormap cmap_wind = LinearSegmentedColormap.from_list("cmap_wind", ["white", "blue"]) cmap_pv = LinearSegmentedColormap.from_list("cmap_pv", ["white", "orange"]) -def average_capacity_factors( - cf: xr.DataArray, shapes: gpd.GeoDataFrame -) -> gpd.GeoDataFrame: - """Calculate average capacity factors per shape.""" - df_mean_cf = cf.mean(dim="time").to_dataframe(name="average_cf").reset_index() - df_mean_cf.index.name = "id" +def create_plot_map(path_capacityfactors, path_shapes, path_map): + """Plot a map of the mean capacityfactors.""" + cf = xr.open_dataarray(path_capacityfactors) + shapes = gpd.read_parquet(path_shapes) + shapes = Shapes.validate(shapes) + shapes = shapes.set_index("shape_id") - gdf_mean_cf = gpd.GeoDataFrame( - df_mean_cf.join(shapes[["shape_id", "geometry"]]), - geometry="geometry", - crs=shapes.crs, + gdf_mean_cf = shapes.join( + cf.mean(dim="time").to_dataframe(name="mean_capacityfactor") ) - return gdf_mean_cf + map_capacity_factor(gdf_mean_cf=gdf_mean_cf, column="mean_capacityfactor") + plt.savefig(path_map) + + +def create_plot_overview(path_capacityfactors, path_shapes, path_plot): + """Plot an overview of the mean capacityfactors.""" + cf = xr.open_dataarray(path_capacityfactors) + shapes = gpd.read_parquet(path_shapes) + shapes = Shapes.validate(shapes) + + cf_mean = cf.mean(dim="time").to_dataframe(name="mean_capacityfactor").reset_index() + + gdf_mean_cf = pd.merge(shapes[["shape_id", "country_id"]], cf_mean, on="shape_id") + + plot_overview(cf=gdf_mean_cf, column="mean_capacityfactor") + plt.savefig(path_plot) + + +def plot_overview(cf, column, ax=None, color="k"): + """Plots the summary statistics of the capacity factors.""" + COLS = ["shape_id", "country_id", column] + + missing_cols = [col for col in COLS if col not in cf.columns] + if missing_cols: + raise ValueError(f"Missing columns in cf: {missing_cols}") + + if ax is None: + fig, ax = plt.subplots() + + _cf = cf.sort_values(["country_id", column], ascending=[True, False]).reset_index( + drop=True + ) + _cf.index.name = "index" + + ax.scatter( + x=_cf.index, + y=_cf[column], + marker=".", + linestyle="", + linewidth=1, + color=color, + alpha=0.7, + label="Mean CF", + ) + ax.grid(which="both", axis="y", linestyle="--", alpha=0.5) + + # set a major xtick where a new country starts, and label it with the country code + major = _cf.reset_index().groupby("country_id", as_index=False).first() + ax.set_xticks(major["index"]) + + # set minor xticks and labels at the midpoinst between the major ticks + ticks = ax.get_xticks() + midpoints = (ticks[:-1] + ticks[1:]) / 2 + midpoints = midpoints.tolist() + [ticks[-1]] # add a final midpoint + + ax.set_xticks(midpoints, minor=True) + ax.set_xticklabels(major["country_id"], rotation=90, fontsize=8, minor=True) + + ax.tick_params(axis="x", which="minor", length=0) # hide minor tick marks + ax.tick_params(axis="x", which="major", labelbottom=False) # hide major tick labels + plt.xticks(fontsize=8) + + # draw vertical lines for wind and pv at the major xticks + ax.vlines( + major["index"], + ymin=0, + ymax=major[column], + color=color, + linestyle="-", + alpha=0.5, + ) + + ax.set_title("Capacity Factors") + ax.set_ylabel("Mean CF") + ax.set_xlabel("Shapes") + + return fig, ax def map_capacity_factor(gdf_mean_cf, column, figsize=(4, 4)): diff --git a/workflow/scripts/prepare_capacityfactors_point_layout.py b/workflow/scripts/prepare_capacityfactors_point_layout.py index 7771e0d..bc9b4f6 100644 --- a/workflow/scripts/prepare_capacityfactors_point_layout.py +++ b/workflow/scripts/prepare_capacityfactors_point_layout.py @@ -1,11 +1,10 @@ """Prepare PV capacityfactors, given a cutout, a layout, shapes to aggregate to and technology specifications.""" import _backend_atlite as _backend_atlite -import _plots import geopandas as gpd import pandas as pd -import xarray as xr import yaml +from _plots import create_plot_map, create_plot_overview from _schemas import PointLayout, Shapes @@ -38,24 +37,6 @@ def prepare_capacityfactors_point_layout( capacityfactors.to_netcdf(path_output) -def plot(path_capacityfactors, path_shapes, path_map): - """Plot capacityfactors.""" - # load inputs - cf = xr.open_dataarray(path_capacityfactors) - shapes = gpd.read_parquet(path_shapes) - shapes = Shapes.validate(shapes) - shapes = shapes.set_index("shape_id") - gdf_mean_cf = shapes.join( - cf.mean(dim="time").to_dataframe(name="mean_capacityfactor") - ) - - # plot a map of annual capacityfactors - fig, ax = _plots.map_capacity_factor( - gdf_mean_cf=gdf_mean_cf, column="mean_capacityfactor" - ) - fig.savefig(path_map) - - if __name__ == "__main__": prepare_capacityfactors_point_layout( path_cutout=snakemake.input.cutout, @@ -64,8 +45,13 @@ def plot(path_capacityfactors, path_shapes, path_map): path_layout=snakemake.input.layout, path_output=snakemake.output.data, ) - plot( + create_plot_map( path_capacityfactors=snakemake.output.data, path_shapes=snakemake.input.shapes, path_map=snakemake.output.plot_map, ) + create_plot_overview( + path_capacityfactors=snakemake.output.data, + path_shapes=snakemake.input.shapes, + path_plot=snakemake.output.plot_overview, + ) diff --git a/workflow/scripts/prepare_capacityfactors_raster_layout.py b/workflow/scripts/prepare_capacityfactors_raster_layout.py index 556f3be..3b699f1 100644 --- a/workflow/scripts/prepare_capacityfactors_raster_layout.py +++ b/workflow/scripts/prepare_capacityfactors_raster_layout.py @@ -1,11 +1,10 @@ """Prepare PV capacityfactors, given a cutout, a layout, shapes to aggregate to and technology specifications.""" import _backend_atlite as _backend_atlite -import _plots import geopandas as gpd import rioxarray as rxr -import xarray as xr import yaml +from _plots import create_plot_map, create_plot_overview from _schemas import Shapes @@ -38,25 +37,6 @@ def prepare_capacityfactors_raster_layout( capacityfactors.to_netcdf(path_output) -def plot(path_capacityfactors, path_shapes, path_map): - """Plot capacityfactors.""" - # load inputs - cf = xr.open_dataarray(path_capacityfactors) - shapes = gpd.read_parquet(path_shapes) - shapes = Shapes.validate(shapes) - shapes = shapes.set_index("shape_id") - - gdf_mean_cf = shapes.join( - cf.mean(dim="time").to_dataframe(name="mean_capacityfactor") - ) - - # plot a map of annual capacityfactors - fig, ax = _plots.map_capacity_factor( - gdf_mean_cf=gdf_mean_cf, column="mean_capacityfactor" - ) - fig.savefig(path_map) - - if __name__ == "__main__": prepare_capacityfactors_raster_layout( path_cutout=snakemake.input.cutout, @@ -65,8 +45,13 @@ def plot(path_capacityfactors, path_shapes, path_map): path_layout=snakemake.input.layout, path_output=snakemake.output.data, ) - plot( + create_plot_map( path_capacityfactors=snakemake.output.data, path_shapes=snakemake.input.shapes, path_map=snakemake.output.plot_map, ) + create_plot_overview( + path_capacityfactors=snakemake.output.data, + path_shapes=snakemake.input.shapes, + path_plot=snakemake.output.plot_overview, + )