This is an automated email from the ASF dual-hosted git repository.
voidmatcha pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push:
new 33f1fff8ae [ZEPPELIN-6717] Install locked Python dependencies in Linux
CI
33f1fff8ae is described below
commit 33f1fff8aeff3926af30a0d8faa834e833dd9e32
Author: Minho Jang <[email protected]>
AuthorDate: Sat Sep 26 00:50:30 2026 +0900
[ZEPPELIN-6717] Install locked Python dependencies in Linux CI
### What is this PR for?
Linux CI jobs repeatedly resolve the same Python 3.9 Conda dependencies
during environment setup. This PR makes those jobs install from explicit Linux
x86-64 Conda specifications instead, and pins the PyFlink packages installed
with pip.
It also separates Maven, npm, Conda, and pip package caches by dependency
type. The Livy job now caches the Spark distribution at the path used by its
download script. Lock update and validation instructions are documented in
`testing/locks/README.md`.
This targets dependency setup time.
### What type of PR is it?
Improvement
### What is the Jira issue?
* https://issues.apache.org/jira/browse/ZEPPELIN-6717
### How should this be tested?
- Run the affected Linux CI jobs and confirm they install from the
committed Conda specifications without dependency resolution.
- Confirm both PyFlink jobs install their pinned requirements and pass.
- Run CI again to check package-cache reuse and the Livy Spark distribution
cache hit.
- Compare environment-setup durations separately from test durations.
### Questions
- License files: No.
- Breaking changes for older versions: No product-runtime change. The
explicit Conda specifications are Linux x86-64-specific.
- Documentation: Lock maintenance instructions are included.
Closes #5492 from miinhho/ci/dependency-resolve.
Signed-off-by: YONGJAE LEE <[email protected]>
---
.github/workflows/core.yml | 233 +++++++++++------
.github/workflows/frontend.yml | 32 ++-
testing/env_python_3.9.yml | 2 +-
testing/env_python_3.yml | 2 +-
testing/env_python_3_with_flink_119.yml | 2 +-
testing/env_python_3_with_flink_120.yml | 2 +-
testing/env_python_3_with_tensorflow.yml | 2 +-
testing/locks/README.md | 50 ++++
.../pyflink-1.19-python-3.9.requirements.lock | 38 +++
.../pyflink-1.20-python-3.9.requirements.lock | 38 +++
testing/locks/python-3.9-linux-64.conda.lock | 244 ++++++++++++++++++
.../python-3.9-tensorflow-linux-64.conda.lock | 287 +++++++++++++++++++++
12 files changed, 834 insertions(+), 98 deletions(-)
diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml
index efeb04ce1e..c032dfb418 100644
--- a/.github/workflows/core.yml
+++ b/.github/workflows/core.yml
@@ -51,18 +51,30 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- ~/conda_pkgs_dir
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache npm packages
+ uses: actions/cache@v5
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-${{ runner.arch }}-npm-v1-${{
hashFiles('zeppelin-web/package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-npm-v1-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: install application with some interpreter
run: ./mvnw install -Pbuild-distr -DskipTests -pl
zeppelin-server,zeppelin-web,spark-submit,spark/scala-2.12,spark/scala-2.13,markdown,angular,shell
-am -Pweb-classic -Phelium-dev -Pexamples ${MAVEN_ARGS}
- name: install and test plugins
@@ -71,12 +83,11 @@ jobs:
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_3.9.yml
- python-version: 3.9
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: Show conda environment
run: |
conda list
@@ -103,29 +114,35 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache locked TensorFlow Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch
}}-conda-python-3.9-tensorflow-v1-${{
hashFiles('testing/locks/python-3.9-tensorflow-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-tensorflow-v1-
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: install environment
run: ./mvnw install -DskipTests -am -pl ${INTERPRETERS} ${MAVEN_ARGS}
- name: Setup conda environment with python 3.9
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3_with_tensorflow
- environment-file: testing/env_python_3_with_tensorflow.yml
- python-version: 3.9
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file:
testing/locks/python-3.9-tensorflow-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: verify interpreter
run: ./mvnw verify -am -pl ${INTERPRETERS} ${MAVEN_ARGS}
@@ -147,27 +164,32 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: Setup conda environment with python ${{ matrix.python }}
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_${{ matrix.python }}.yml
- python-version: ${{ matrix.python }}
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: install environment
run: |
./mvnw install -DskipTests -pl python,zeppelin-jupyter-interpreter
-am ${MAVEN_ARGS}
@@ -195,17 +217,23 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: install environment
run: |
./mvnw install -DskipTests -Pintegration -pl
zeppelin-interpreter-integration,zeppelin-web,spark-submit,spark/scala-2.12,spark/scala-2.13,markdown,flink-cmd,flink/flink-scala-2.12,jdbc,shell
-am -Pweb-classic -Pflink-1.20 ${MAVEN_ARGS}
@@ -214,12 +242,11 @@ jobs:
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_3.yml
- python-version: 3.9
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: run tests
run: ./mvnw test -pl zeppelin-interpreter-integration -Pintegration
-DfailIfNoTests=false
-Dtest=ZeppelinClientIntegrationTest,ZeppelinClientWithAuthIntegrationTest,ZSessionIntegrationTest,ShellIntegrationTest,JdbcIntegrationTest
- name: Print zeppelin logs
@@ -250,17 +277,30 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
+ - name: Cache locked PyFlink packages
+ uses: actions/cache@v5
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-${{ runner.arch }}-pip-pyflink-${{
matrix.flink-profile }}-v1-${{
hashFiles(format('testing/locks/pyflink-{0}-python-3.9.requirements.lock',
matrix.flink-profile)) }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-pip-pyflink-${{
matrix.flink-profile }}-v1-
- name: install environment for flink
run: |
./mvnw install -DskipTests -am -pl
flink/flink-scala-2.12,flink-cmd,zeppelin-interpreter-integration -Pflink-${{
matrix.flink-profile }} -Pintegration ${MAVEN_ARGS}
@@ -269,12 +309,13 @@ jobs:
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3_with_flink
- environment-file: testing/env_python_3_with_flink_${{ matrix.flink
}}.yml
- python-version: ${{ matrix.python }}
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
+ - name: Install locked PyFlink ${{ matrix.flink-profile }} packages
+ run: python -m pip install --no-deps -r testing/locks/pyflink-${{
matrix.flink-profile }}-python-3.9.requirements.lock
- name: run tests for flink
run: ./mvnw verify -pl
flink/flink-scala-2.12,flink-cmd,zeppelin-interpreter-integration -Pflink-${{
matrix.flink-profile }} -am -Pintegration -DfailIfNoTests=false
-Dtest=org.apache.zeppelin.flink.*Test,FlinkIntegrationTest${{ matrix.flink }}
${MAVEN_ARGS}
- name: Print zeppelin logs
@@ -298,17 +339,23 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: install environment
run: |
./mvnw install -DskipTests -pl
zeppelin-interpreter-integration,zeppelin-web,spark-submit,spark/scala-2.12,spark/scala-2.13,markdown
-am -Pweb-classic -Pintegration ${MAVEN_ARGS}
@@ -317,12 +364,11 @@ jobs:
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_3.yml
- python-version: 3.9
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: run tests
run: ./mvnw test -pl zeppelin-interpreter-integration -Pintegration
-Dtest=SparkSubmitIntegrationTest,ZeppelinSparkClusterTest32,SparkIntegrationTest32,ZeppelinSparkClusterTest33,SparkIntegrationTest33
-DfailIfNoTests=false ${MAVEN_ARGS}
@@ -344,29 +390,34 @@ jobs:
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: install environment
run: ./mvnw install -DskipTests -pl
spark-submit,spark/scala-2.12,spark/scala-2.13 -am ${MAVEN_ARGS}
- name: Setup conda environment with python ${{ matrix.python }}
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_${{ matrix.python }}.yml
- python-version: ${{ matrix.python }}
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: run spark-3.3 tests with scala-2.12 and python-${{ matrix.python
}}
run: |
rm -rf spark/interpreter/metastore_db
@@ -393,6 +444,9 @@ jobs:
#
https://github.com/apache/incubator-livy/blob/v0.8.0-incubating/dev/docker/livy-dev-spark/Dockerfile#L20
livy-0-8-with-spark-3-2-under-python39:
runs-on: ubuntu-24.04
+ env:
+ SPARK_VERSION: '3.2.4'
+ HADOOP_VERSION: '3.2'
steps:
- name: Checkout
uses: actions/checkout@v5
@@ -403,35 +457,48 @@ jobs:
with:
distribution: 'temurin'
java-version: 11
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ # Only this job downloads a standalone Spark archive; spark-test uses
Maven artifacts.
+ - name: Cache Spark distributions
+ uses: actions/cache@v5
+ with:
+ path: .spark-dist
+ key: ${{ runner.os }}-${{ runner.arch }}-spark-dist-v1-${{
env.SPARK_VERSION }}-hadoop${{ env.HADOOP_VERSION }}-${{
hashFiles('testing/downloadSpark.sh', 'pom.xml', 'spark/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-spark-dist-v1-${{
env.SPARK_VERSION }}-hadoop${{ env.HADOOP_VERSION }}-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: install environment
run: |
./mvnw install -DskipTests -pl livy -am ${MAVEN_ARGS}
- ./testing/downloadSpark.sh "3.2.4" "3.2"
+ ./testing/downloadSpark.sh "${SPARK_VERSION}" "${HADOOP_VERSION}"
./testing/downloadLivy.sh "0.8.0-incubating" "2.12"
- name: Setup conda environment with python 3.9
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_3.9.yml
- python-version: 3.9
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: run tests
run: |
- export SPARK_HOME=$PWD/spark-3.2.4-bin-hadoop3.2
+ export
SPARK_HOME=$PWD/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}
export LIVY_HOME=$PWD/apache-livy-0.8.0-incubating_2.12-bin
./mvnw verify -pl livy ${MAVEN_ARGS}
diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml
index 08af6bf699..e7da04d72d 100644
--- a/.github/workflows/frontend.yml
+++ b/.github/workflows/frontend.yml
@@ -180,27 +180,39 @@ jobs:
with:
distribution: 'temurin'
java-version: 11
- - name: Cache local Maven repository
+ - name: Cache Maven dependencies
uses: actions/cache@v5
with:
path: |
~/.m2/repository
!~/.m2/repository/org/apache/zeppelin/
- ~/.spark-dist
- ~/.cache
- key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }}
+ ~/.m2/wrapper
+ key: ${{ runner.os }}-${{ runner.arch }}-maven-v2-${{
hashFiles('**/pom.xml', '.mvn/**') }}
restore-keys: |
- ${{ runner.os }}-zeppelin-
+ ${{ runner.os }}-${{ runner.arch }}-maven-v2-
+ - name: Cache npm packages
+ uses: actions/cache@v5
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-${{ runner.arch }}-npm-v1-${{
hashFiles('zeppelin-web/package-lock.json',
'zeppelin-web-angular/package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-npm-v1-
+ - name: Cache locked Conda packages
+ uses: actions/cache@v5
+ with:
+ path: ~/conda_pkgs_dir
+ key: ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-${{
hashFiles('testing/locks/python-3.9-linux-64.conda.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ runner.arch }}-conda-python-3.9-v1-
- name: Setup conda environment with python 3.9
uses: conda-incubator/setup-miniconda@v4
with:
activate-environment: python_3
- environment-file: testing/env_python_3.yml
- python-version: 3.9
- channels: conda-forge,defaults
- channel-priority: strict
+ environment-file: testing/locks/python-3.9-linux-64.conda.lock
+ channels: conda-forge
+ conda-remove-defaults: true
+ auto-update-conda: false
auto-activate: false
- use-mamba: true
- name: Install Environment
run: |
./mvnw clean install -DskipTests -am -pl zeppelin-integration
-Pweb-classic -Pintegration -Pspark-scala-2.12 -Pspark-3.5 -Pweb-dist
${MAVEN_ARGS}
diff --git a/testing/env_python_3.9.yml b/testing/env_python_3.9.yml
index d125b9ce70..9ef1e66e3f 100644
--- a/testing/env_python_3.9.yml
+++ b/testing/env_python_3.9.yml
@@ -1,8 +1,8 @@
name: python_3
channels:
- conda-forge
- - defaults
dependencies:
+ - python=3.9
- pycodestyle
- scipy
- numpy=1.19.5
diff --git a/testing/env_python_3.yml b/testing/env_python_3.yml
index b4f280eb52..ea00005c8a 100644
--- a/testing/env_python_3.yml
+++ b/testing/env_python_3.yml
@@ -1,8 +1,8 @@
name: python_3
channels:
- conda-forge
- - defaults
dependencies:
+ - python=3.9
- pycodestyle
- scipy
- numpy=1.19.5
diff --git a/testing/env_python_3_with_flink_119.yml
b/testing/env_python_3_with_flink_119.yml
index 235010b137..e0c441215c 100644
--- a/testing/env_python_3_with_flink_119.yml
+++ b/testing/env_python_3_with_flink_119.yml
@@ -1,8 +1,8 @@
name: python_3_with_flink
channels:
- conda-forge
- - defaults
dependencies:
+ - python=3.9
- pycodestyle
- scipy
- numpy=1.19.5
diff --git a/testing/env_python_3_with_flink_120.yml
b/testing/env_python_3_with_flink_120.yml
index 05066fc6c1..460e43db8e 100644
--- a/testing/env_python_3_with_flink_120.yml
+++ b/testing/env_python_3_with_flink_120.yml
@@ -1,8 +1,8 @@
name: python_3_with_flink
channels:
- conda-forge
- - defaults
dependencies:
+ - python=3.9
- pycodestyle
- scipy
- numpy=1.19.5
diff --git a/testing/env_python_3_with_tensorflow.yml
b/testing/env_python_3_with_tensorflow.yml
index bf94d8c66b..af138b872a 100644
--- a/testing/env_python_3_with_tensorflow.yml
+++ b/testing/env_python_3_with_tensorflow.yml
@@ -1,8 +1,8 @@
name: python_3_with_tensorflow
channels:
- conda-forge
- - defaults
dependencies:
+ - python=3.9
- pycodestyle
- scipy
- numpy=1.19.5
diff --git a/testing/locks/README.md b/testing/locks/README.md
new file mode 100644
index 0000000000..8c8de7ce71
--- /dev/null
+++ b/testing/locks/README.md
@@ -0,0 +1,50 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+
+# Python dependencies in Linux CI
+
+For the Linux CI environments listed below, the YAML files in `testing/`
describe the dependencies we want, while CI installs the resolved Python 3.9
packages from the files here. Changing one of those YAML files alone will not
change its CI environment; update the corresponding lock as well.
+
+| Lock file | Environment it supplies |
+|---|---|
+| `python-3.9-linux-64.conda.lock` | Shared Conda environment for core,
Python/Jupyter, integration, Spark, Livy, Flink, and frontend integration jobs.
It covers `env_python_3.9.yml`, `env_python_3.yml`, and the Conda dependencies
in both `env_python_3_with_flink_*.yml` files. |
+| `python-3.9-tensorflow-linux-64.conda.lock` | Conda environment for non-core
interpreter jobs, described by `env_python_3_with_tensorflow.yml`. |
+| `pyflink-1.19-python-3.9.requirements.lock` | PyPI packages for the Flink
1.19 job, starting from the pip requirement in
`env_python_3_with_flink_119.yml`. |
+| `pyflink-1.20-python-3.9.requirements.lock` | PyPI packages for the Flink
1.20 job, starting from the pip requirement in
`env_python_3_with_flink_120.yml`. |
+
+## Changing dependencies
+
+1. Edit the relevant YAML file in `testing/`. If a shared Conda dependency
changes, check that the other environments using the shared lock still have the
packages they need.
+2. On Ubuntu 24.04 x86-64, resolve the changed Conda environment using
conda-forge and export it with `conda list --explicit --md5`. For example, to
update the shared lock:
+
+ ```bash
+ conda env create -n zeppelin-lock-source -f testing/env_python_3.9.yml
+ conda list -n zeppelin-lock-source --explicit --md5
+ ```
+
+ Put the exported explicit specification in the corresponding `.conda.lock`
file, retaining its ASF license header. Use `env_python_3_with_tensorflow.yml`
instead when updating the TensorFlow lock.
+3. For a PyFlink change, start with a fresh environment installed from the
shared Conda lock. Install the `apache-flink` version specified in the matching
Flink YAML file with pip, then record every PyPI package and version it
installs in the matching `.requirements.lock` file. CI uses `pip install
--no-deps`, so the file must include transitive PyPI dependencies, not just
`apache-flink`.
+4. Validate the lock in a new environment, not just the environment used to
generate it. For the shared lock and Flink 1.19, for example:
+
+ ```bash
+ conda create -n zeppelin-lock-check --file
testing/locks/python-3.9-linux-64.conda.lock
+ conda run -n zeppelin-lock-check python -m pip install --no-deps -r
testing/locks/pyflink-1.19-python-3.9.requirements.lock
+ ```
+
+ Use the TensorFlow lock or Flink 1.20 requirements as appropriate, then run
the affected imports and CI tests.
+
+The `.conda.lock` files contain exact Linux x86-64 package URLs and MD5
hashes; they are not portable to other platforms. The PyFlink files pin package
versions but do not pin wheel hashes. A cache miss may still download packages,
but installation from the Conda locks does not run the dependency solver.
diff --git a/testing/locks/pyflink-1.19-python-3.9.requirements.lock
b/testing/locks/pyflink-1.19-python-3.9.requirements.lock
new file mode 100644
index 0000000000..8d2679be91
--- /dev/null
+++ b/testing/locks/pyflink-1.19-python-3.9.requirements.lock
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+apache-beam==2.48.0
+apache-flink==1.19.3
+apache-flink-libraries==1.19.3
+avro-python3==1.10.2
+cloudpickle==2.2.1
+crcmod==1.7
+dill==0.3.1.1
+dnspython==2.7.0
+docopt==0.6.2
+fastavro==1.12.2
+find-libpython==0.5.1
+hdfs==2.7.3
+httplib2==0.22.0
+numpy==1.24.4
+objsize==0.6.1
+orjson==3.11.5
+pemja==0.4.1
+proto-plus==1.27.1
+py4j==0.10.9.7
+pydot==1.4.2
+pymongo==4.18.1
+regex==2026.1.15
+ruamel.yaml==0.19.1
diff --git a/testing/locks/pyflink-1.20-python-3.9.requirements.lock
b/testing/locks/pyflink-1.20-python-3.9.requirements.lock
new file mode 100644
index 0000000000..359a9892b1
--- /dev/null
+++ b/testing/locks/pyflink-1.20-python-3.9.requirements.lock
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+apache-beam==2.48.0
+apache-flink==1.20.4
+apache-flink-libraries==1.20.4
+avro-python3==1.10.2
+cloudpickle==2.2.1
+crcmod==1.7
+dill==0.3.1.1
+dnspython==2.7.0
+docopt==0.6.2
+fastavro==1.12.2
+find-libpython==0.5.1
+hdfs==2.7.3
+httplib2==0.22.0
+numpy==1.24.4
+objsize==0.6.1
+orjson==3.11.5
+pemja==0.5.6
+proto-plus==1.27.1
+py4j==0.10.9.7
+pydot==1.4.2
+pymongo==4.18.1
+regex==2026.1.15
+ruamel.yaml==0.19.1
diff --git a/testing/locks/python-3.9-linux-64.conda.lock
b/testing/locks/python-3.9-linux-64.conda.lock
new file mode 100644
index 0000000000..f8ae8a15b8
--- /dev/null
+++ b/testing/locks/python-3.9-linux-64.conda.lock
@@ -0,0 +1,244 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+# This file may be used to create an environment using:
+# $ conda create --name <env> --file <this file>
+# platform: linux-64
+# created-by: conda 26.7.1
+@EXPLICIT
+https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda#0f51e2391ade309db462a55611263e9c
+https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-bootstrap_ha15bf96_2.conda#2c238120d4d57c422d6671036eae76a8
+https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_5.conda#af44890f8a2beefd3a83805a59a65014
+https://conda.anaconda.org/conda-forge/noarch/python_abi-3.9-9_cp39.conda#9615f53c60b6d766f740be806484bad7
+https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda#fcb489df604d100968b737f2cb6076c6
+https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de
+https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_5.conda#3b62b92f0f082b67c59618ebf07617a7
+https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda#e675fabcf81499adc7edf58124fb1e01
+https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda#3ad2b403be8fc5612b9159e2ce621f69
+https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda#ba55d1b89fd7775e67de8291029b4059
+https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda#40f9b31aa9cf007789867df0decd0492
+https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda#7bc31538d6e3fb349e897353969237ec
+https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda#6525a0b06aa4fd390795f0740636a9dd
+https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_5.conda#e7c34906139296448e3554fafa3dbec2
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_5.conda#a7eb3f9540094247ec8a2fa800cf9bbf
+https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda#f92233bf33e24a25668bb2119e2c51f9
+https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda#1390b7c5ac0b1d8e447bc5efa6d3c8c2
+https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4
+https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_5.conda#75b43a2912a0354204696708e4f34b8d
+https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-hf23e847_1.conda#b1aa0faa95017bca11369bd080487ec4
+https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda#74a0a409d9f4561265d36b789d3f398a
+https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda#9332b53d0ea93c5d39e33be03a0c611a
+https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda#ee6c0cd80a60961a1f48aa3e0b91f986
+https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda#bb66b610707b811e3c65181a6431e7a8
+https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-h7cc23a3_2.conda#da33efee1a93603d92e06d4a2b68def6
+https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-h7cc23a3_2.conda#eabfc45786244de252090cf8d55128a8
+https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda#e741576fb8f89821ac7c1c537322a33d
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.6.2-h7f98852_0.tar.bz2#ce69a062b3080485b760378841240634
+https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881
+https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407
+https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda#fb9d356b1a57d6d54768be7ebd5fce09
+https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c
+https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda#50708d3b951d0f8e2d7f2df5b5edc040
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_5.conda#34ddf93e56ee44924ce76a614e5fb379
+https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_1.conda#6d83d6a332c19424e9e66b69b180ec11
+https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d
+https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_5.conda#c37fb00cb15b16cf1601914d68a509ea
+https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904
+https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125
+https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1w-hd590300_0.conda#301e70057a3bd399640bb16bbdf87995
+https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda#69c01c781e7c8190bbdaf79e3848c5ca
+https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.3-ha02ee65_1.conda#137db930adb0b3c5407485e0e1a50cfa
+https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.3-hb03c661_1.conda#10d693a2db6e8339e4eebcb3a3dae88d
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.5.11-h95a6274_0.tar.bz2#d4e7b241fb22dd3d7be1171f813d5da3
+https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.11-ha31a3da_7.tar.bz2#2fdb96aaab883abc0766ff76c0a34483
+https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2
+https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff
+https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-hf9c8cef_0.conda#5f7e9efd540d7ac4b485660231ba6150
+https://conda.anaconda.org/conda-forge/linux-64/libabseil-20220623.0-cxx17_h05df665_6.conda#39f6394ae835f0b16f01cbbd3bb1e8e2
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd
+https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400
+https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.10-h9b69904_4.tar.bz2#390026683aef81db27ff1b8570ca1336
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-16.2.0-h69a702a_5.conda#3b3b5b0f484a99d3ed9c9e563ea90d34
+https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.51.0-hdcd2b5c_0.conda#c42b460bae0365fb9777b1ff9d09a554
+https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae
+https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-3.20.3-h3eb15da_0.conda#af581c55e6ff3a93af3ae710e091a80d
+https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8
+https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd
+https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc869a4a_1.tar.bz2#7a268cf1386d271e576e35ae82149ef2
+https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0
+https://conda.anaconda.org/conda-forge/linux-64/re2-2022.06.01-h27087fc_1.conda#68070cd09c67755f37e0db13f00a008b
+https://conda.anaconda.org/conda-forge/linux-64/s2n-1.0.10-h9b69904_0.tar.bz2#9708c3ac26c20b4c4549cbe8fef937eb
+https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1
+https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc
+https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.3-ha02ee65_1.conda#36a079606b3aaf9d726211825f182452
+https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda#7fc9d3288d2420bb3637647621018000
+https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67
+https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.10.5-hfb6a706_0.tar.bz2#47d6b88b0c42a8c9877f3993b49f052d
+https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b
+https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb
+https://conda.anaconda.org/conda-forge/linux-64/grpc-cpp-1.47.1-hbad87ad_6.tar.bz2#6d0f1ddd701aebf007274ee5ea9a3018
+https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336
+https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.87.0-h6312ad2_0.conda#ad07f06bd133e76e12165bc3ec2c8646
+https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17
+https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.16.0-h491838f_2.tar.bz2#9134d477d02ad9264c6ee359fa36702c
+https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c
+https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6
+https://conda.anaconda.org/conda-forge/linux-64/orc-1.7.6-h6c59b99_0.tar.bz2#7978db6ca7b2932ccf9d3c36093f8281
+https://conda.anaconda.org/conda-forge/linux-64/python-3.9.15-h47a2c10_0_cpython.conda#4c15ad54369ad2fa36a0d56c6675e241
+https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816
+https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b
+https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.2.7-h3541f99_13.tar.bz2#39768ba0fe69c241d54703a7f5e3119f
+https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06
+https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b
+https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102
+https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284
+https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3
+https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92
+https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7
+https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_1.conda#91d7152c744dc0f18ef8beb3cbc9980a
+https://conda.anaconda.org/conda-forge/linux-64/cramjam-2.11.0-py39h881adfc_0.conda#3c7c06b2ad5abbf3fae386352544da72
+https://conda.anaconda.org/conda-forge/linux-64/curl-7.87.0-h6312ad2_0.conda#e6ca70adeae12dce14cbf412b58ace64
+https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833
+https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py39haef64b4_0.conda#ad12118b06c2596073c843e6d47978c2
+https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32
+https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14
+https://conda.anaconda.org/conda-forge/noarch/fasteners-0.20-pyhd8ed1ab_0.conda#11445cf1b9a9114b82a7dc9f0cd036ec
+https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019
+https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py39h818bca1_0.conda#38d510d03b8fc261a73366f10f649188
+https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h2386368_101.conda#bd61fa767de9880c9c9c8873dc2581e8
+https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e
+https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac
+https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhf9edf01_1.conda#ed83a53046788a688a38b76e436f5aac
+https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda#2f0ba4bc12af346bc6c99bdc377e8944
+https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py39h74842e3_0.conda#1bf77976372ff6de02af7b75cf034ce5
+https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b
+https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.1.0-h9ebe8e8_2.tar.bz2#e8ae8bddbc20f598706dc3ae15dbf95e
+https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4
+https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py39hd7df8f7_1.conda#5eac52bcb350198b53c6b1efb384b563
+https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py39h9399b63_1.conda#7821f0938aa629b9f17efd98c300a487
+https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.1-py39h74842e3_0.conda#fce378a7c73ea47b7e79ef27a8c798a2
+https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609
+https://conda.anaconda.org/conda-forge/noarch/narwhals-2.1.2-pyhe01879c_0.conda#90d3b6c75c144e8c461b846410d7c0bf
+https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97
+https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7
+https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea
+https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda#936687ed80f295a1f5dbcf8bd34c252c
+https://conda.anaconda.org/conda-forge/noarch/param-1.13.0-pyh1a96a4e_0.conda#158eda83fd21a14b8c483c0d1d102397
+https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9
+https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943
+https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7
+https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py39h8cd3c5a_0.conda#851ab4da2babaf8d6968a64dd348ca88
+https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54
+https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04
+https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda#85815c6a22905c080111ec8d56741454
+https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef
+https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066
+https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d
+https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac
+https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960
+https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py39h9399b63_2.conda#13fd88296a9f19f5e3ac0c69d4b64cc6
+https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py39h4e4fb57_1.conda#4f303fde372f5ed6a85e3cd895bda96d
+https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py39h17f49b6_0.conda#de935a1880d17308167b723231e87f9d
+https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e
+https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3
+https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda#0401a17ae845fa72c7210e206ec5647d
+https://conda.anaconda.org/conda-forge/noarch/tblib-3.1.0-pyhd8ed1ab_0.conda#a15c62b8a306b8978f094f76da2f903f
+https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d
+https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py39hd399759_0.conda#9546db52eccafee2fa2675653fec04f9
+https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed
+https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f
+https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py39h8cd3c5a_0.conda#2011fcaddafa077f4f0313361f4c2731
+https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6
+https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d
+https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986
+https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda#e52c2ef711ccf31bb7f70ca87d144b9e
+https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f
+https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.8.186-hecaee15_4.tar.bz2#e29dc8e8611b70cdfcc3139dba6e9001
+https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3
+https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44
+https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py39h8cd3c5a_0.conda#6a86bebd04e7ecd773208e774aa3a58d
+https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a
+https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py39heb7d2ae_0.conda#93d184020f519fe0d32715cb14b8ff50
+https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.47.1-py39h43a650c_6.tar.bz2#2d75b0f641ba3e9994810c85b6b189a2
+https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6
+https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8
+https://conda.anaconda.org/conda-forge/noarch/intake-2.0.8-pyhd8ed1ab_0.conda#bcd8513a2f3b9b8d83fc7f04302cf800
+https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9
+https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.3-pyhd8ed1ab_0.tar.bz2#036d872c653780cb26e797e2e2f61b4c
+https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab
+https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3
+https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0
+https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf
+https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b
+https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163
+https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea
+https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py39h2320bf1_1.conda#d2f79132b9c8e416058a4cd84ef27b3d
+https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5
+https://conda.anaconda.org/conda-forge/noarch/plotly-6.3.0-pyhd8ed1ab_0.conda#5366b5b366cd3a2efa7e638792972ea1
+https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551
+https://conda.anaconda.org/conda-forge/linux-64/protobuf-3.20.3-py39h227be39_1.conda#addd0b5e0730a3e3d157b7e6e4cd9ed2
+https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8
+https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda#e0f2c3ecb4dc40d031bbe88869a2a7a1
+https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7
+https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.46-py39h72bdee0_0.conda#8e7f9dca9ff278a640f0b63ae0c9633d
+https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc
+https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda#9efbfdc37242619130ea42b1cc4ed861
+https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635
+https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.2.0-pyhd8ed1ab_0.conda#156fb994a4e07091c4fad2c148589eb2
+https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda#15c6f45a45f7ac27f6d60b0b084f6761
+https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e
+https://conda.anaconda.org/conda-forge/noarch/jupyter_client-5.3.3-py_0.tar.bz2#4cf7d68dbb2e7e2ddde4f962e25f2c22
+https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda#b0404922d0459f188768d1e613ed8a87
+https://conda.anaconda.org/conda-forge/linux-64/numpy-1.19.5-py39hd249d9e_3.tar.bz2#0cf333996ebdeeba8d1c8c1c0ee9eff9
+https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39hd399759_3.conda#2f6845f6cdf545845a60c4dcbd017c78
+https://conda.anaconda.org/conda-forge/linux-64/arrow-cpp-9.0.0-py39hd3ccb9b_2_cpu.tar.bz2#f2e4efbf51eea1bffc1f6dc0898e6d29
+https://conda.anaconda.org/conda-forge/noarch/bokeh-2.4.3-pyhd8ed1ab_3.tar.bz2#e4c6e6d99add99cede5328d811cacb21
+https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py39hf3d9206_1.conda#9e20a6226b704b4df686d475dd9b80a5
+https://conda.anaconda.org/conda-forge/linux-64/ipykernel-6.11.0-py39hef51801_0.tar.bz2#e4627b821239e3e6b8e010efc3492b5a
+https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f
+https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.3-py39h19d6b11_2.tar.bz2#dc400bb297d8425b8b05367a21854b0b
+https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py39h84cc369_1.conda#bd4f7363195b9c54fb7298e261dd90e6
+https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.4-py39h1832856_0.tar.bz2#6ef85649798519bd47dfc24e399b8dcd
+https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d
+https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.1-py39h8ba3f38_0.tar.bz2#beed054d4979cd70690aea2b257a6d55
+https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a
+https://conda.anaconda.org/conda-forge/noarch/altair-5.5.0-pyhd8ed1ab_1.conda#e54e67e5aea7288ba110cf685252f599
+https://conda.anaconda.org/conda-forge/noarch/distributed-2023.2.0-pyhd8ed1ab_0.conda#908e176bdb542b900f1c044bac70683b
+https://conda.anaconda.org/conda-forge/linux-64/fastparquet-0.8.3-py39hd257fcd_0.tar.bz2#ba11baff2bbb77a870146831c4402696
+https://conda.anaconda.org/conda-forge/noarch/mizani-0.10.0-pyhd8ed1ab_0.conda#727e2c2020a82718d71b644229776657
+https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py39h6ced12a_102.tar.bz2#b92600d0fef7f12f426935d87d6413e6
+https://conda.anaconda.org/conda-forge/noarch/pandasql-0.7.3-pyhd8ed1ab_0.tar.bz2#7c72bbfc754396ade8e88759cbe0ac4a
+https://conda.anaconda.org/conda-forge/noarch/parquet-cpp-1.5.1-2.tar.bz2#79a5f78c42817594ae016a7896521a97
+https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4
+https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.12.2-pyhd8ed1ab_0.conda#cf88f3a1c11536bc3c10c14ad00ccc42
+https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py39hd92a3bb_0.conda#2f6c03d60e71f13d92d511b06193f007
+https://conda.anaconda.org/conda-forge/noarch/vega_datasets-0.9.0-pyhd8ed1ab_1.conda#a2208a412fdfefbd36e9c740da9a3f3b
+https://conda.anaconda.org/conda-forge/noarch/xarray-2022.9.0-pyhd8ed1ab_0.tar.bz2#e841ab2f40fb319e6740130227904cbf
+https://conda.anaconda.org/conda-forge/noarch/zarr-2.15.0-pyhd8ed1ab_0.conda#2e6414d548b4433d564fed1177d30281
+https://conda.anaconda.org/conda-forge/noarch/dask-2023.2.0-pyhd8ed1ab_0.conda#c64c58bf99a686d8bdff8f9c4d33d615
+https://conda.anaconda.org/conda-forge/noarch/plotnine-0.10.1-pyhd8ed1ab_2.conda#39441c3cec7f25dae4b9d83be71df2b8
+https://conda.anaconda.org/conda-forge/linux-64/pyarrow-9.0.0-py39hc0775d8_2_cpu.tar.bz2#7ce89474ea7932b29491ade87bfba19a
+https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda#9d19c7ea78d067fbbaa2317a85f844e7
+https://conda.anaconda.org/conda-forge/noarch/seaborn-0.12.2-hd8ed1ab_0.conda#50847a47c07812f88581081c620f5160
+https://conda.anaconda.org/conda-forge/noarch/intake-parquet-0.3.0-pyhd8ed1ab_1.conda#ceff21f71e8d5f8fee73bb7219693373
+https://conda.anaconda.org/conda-forge/noarch/intake-xarray-2.0.0-pyhd8ed1ab_1.conda#9ff534be39502e636cb4d25dc6696c66
+https://conda.anaconda.org/conda-forge/noarch/panel-0.14.4-pyhd8ed1ab_0.conda#1342769f399e43f0906af79e5221a0ad
+https://conda.anaconda.org/conda-forge/noarch/holoviews-1.16.2-pyhd8ed1ab_0.conda#cd0595cf5f97d5ef8843ac806c72ed47
+https://conda.anaconda.org/conda-forge/noarch/hvplot-0.10.0-pyhd8ed1ab_0.conda#62e8362edc9bb3380e63186d4ad3e735
diff --git a/testing/locks/python-3.9-tensorflow-linux-64.conda.lock
b/testing/locks/python-3.9-tensorflow-linux-64.conda.lock
new file mode 100644
index 0000000000..94af898b6e
--- /dev/null
+++ b/testing/locks/python-3.9-tensorflow-linux-64.conda.lock
@@ -0,0 +1,287 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+# This file may be used to create an environment using:
+# $ conda create --name <env> --file <this file>
+# platform: linux-64
+# created-by: conda 26.7.1
+@EXPLICIT
+https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda#0f51e2391ade309db462a55611263e9c
+https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-bootstrap_ha15bf96_2.conda#2c238120d4d57c422d6671036eae76a8
+https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_5.conda#af44890f8a2beefd3a83805a59a65014
+https://conda.anaconda.org/conda-forge/noarch/python_abi-3.9-9_cp39.conda#9615f53c60b6d766f740be806484bad7
+https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda#fcb489df604d100968b737f2cb6076c6
+https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de
+https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_5.conda#3b62b92f0f082b67c59618ebf07617a7
+https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda#e675fabcf81499adc7edf58124fb1e01
+https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda#3ad2b403be8fc5612b9159e2ce621f69
+https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-ha257d8a_1.conda#bd7c3a8586ed0101f094962100d30a63
+https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda#ba55d1b89fd7775e67de8291029b4059
+https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda#40f9b31aa9cf007789867df0decd0492
+https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda#7bc31538d6e3fb349e897353969237ec
+https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda#6525a0b06aa4fd390795f0740636a9dd
+https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_5.conda#e7c34906139296448e3554fafa3dbec2
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_5.conda#a7eb3f9540094247ec8a2fa800cf9bbf
+https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda#f92233bf33e24a25668bb2119e2c51f9
+https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda#1390b7c5ac0b1d8e447bc5efa6d3c8c2
+https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4
+https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_5.conda#75b43a2912a0354204696708e4f34b8d
+https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-hf23e847_1.conda#b1aa0faa95017bca11369bd080487ec4
+https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda#74a0a409d9f4561265d36b789d3f398a
+https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda#9332b53d0ea93c5d39e33be03a0c611a
+https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda#ee6c0cd80a60961a1f48aa3e0b91f986
+https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda#bb66b610707b811e3c65181a6431e7a8
+https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-h7cc23a3_2.conda#da33efee1a93603d92e06d4a2b68def6
+https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-h7cc23a3_2.conda#eabfc45786244de252090cf8d55128a8
+https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda#e741576fb8f89821ac7c1c537322a33d
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.6.2-h7f98852_0.tar.bz2#ce69a062b3080485b760378841240634
+https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881
+https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407
+https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda#fb9d356b1a57d6d54768be7ebd5fce09
+https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c
+https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda#50708d3b951d0f8e2d7f2df5b5edc040
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_5.conda#34ddf93e56ee44924ce76a614e5fb379
+https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_1.conda#6d83d6a332c19424e9e66b69b180ec11
+https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d
+https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_5.conda#c37fb00cb15b16cf1601914d68a509ea
+https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904
+https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125
+https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1w-hd590300_0.conda#301e70057a3bd399640bb16bbdf87995
+https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda#69c01c781e7c8190bbdaf79e3848c5ca
+https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.3-ha02ee65_1.conda#137db930adb0b3c5407485e0e1a50cfa
+https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.3-hb03c661_1.conda#10d693a2db6e8339e4eebcb3a3dae88d
+https://conda.anaconda.org/conda-forge/linux-64/abseil-cpp-20210324.2-h9c3ff4c_0.tar.bz2#baa652d7d0da41d757a31d00b4ae2c38
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.5.11-h95a6274_0.tar.bz2#d4e7b241fb22dd3d7be1171f813d5da3
+https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.11-ha31a3da_7.tar.bz2#2fdb96aaab883abc0766ff76c0a34483
+https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2
+https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed
+https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-hf9c8cef_0.conda#5f7e9efd540d7ac4b485660231ba6150
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd
+https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400
+https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.10-h9b69904_4.tar.bz2#390026683aef81db27ff1b8570ca1336
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-16.2.0-h69a702a_5.conda#3b3b5b0f484a99d3ed9c9e563ea90d34
+https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.51.0-hdcd2b5c_0.conda#c42b460bae0365fb9777b1ff9d09a554
+https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae
+https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8
+https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd
+https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc869a4a_1.tar.bz2#7a268cf1386d271e576e35ae82149ef2
+https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_1.tar.bz2#fbe97e8fa6f275d7c76a09e795adc3e6
+https://conda.anaconda.org/conda-forge/linux-64/re2-2022.02.01-h9c3ff4c_0.tar.bz2#faed0a1cb9c95ed71cb15b9de1bf3afa
+https://conda.anaconda.org/conda-forge/linux-64/s2n-1.0.10-h9b69904_0.tar.bz2#9708c3ac26c20b4c4549cbe8fef937eb
+https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1
+https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc
+https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.3-ha02ee65_1.conda#36a079606b3aaf9d726211825f182452
+https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda#7fc9d3288d2420bb3637647621018000
+https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67
+https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.10.5-hfb6a706_0.tar.bz2#47d6b88b0c42a8c9877f3993b49f052d
+https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b
+https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb
+https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336
+https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.87.0-h6312ad2_0.conda#ad07f06bd133e76e12165bc3ec2c8646
+https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17
+https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-3.19.6-h3eb15da_0.conda#3c8e39f2703847e737a6e88b78a237af
+https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.16.0-h491838f_2.tar.bz2#9134d477d02ad9264c6ee359fa36702c
+https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c
+https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503
+https://conda.anaconda.org/conda-forge/linux-64/python-3.9.15-h47a2c10_0_cpython.conda#4c15ad54369ad2fa36a0d56c6675e241
+https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323
+https://conda.anaconda.org/conda-forge/noarch/absl-py-2.3.1-pyhd8ed1ab_0.conda#7d4f1ddc43d323c916b2c744835eb093
+https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda#18fd895e0e775622906cdabfc3cf0fb4
+https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816
+https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda#8f587de4bcf981e26228f268df374a9b
+https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhd8ed1ab_1.conda#5d842988b11a8c3ab57fb70840c83d24
+https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.2.7-h3541f99_13.tar.bz2#39768ba0fe69c241d54703a7f5e3119f
+https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda#42834439227a4551b939beeeb8a4b085
+https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06
+https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b
+https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda#f71e6840332854fd2eac6c3229768a9c
+https://conda.anaconda.org/conda-forge/noarch/cachetools-4.2.4-pyhd8ed1ab_0.tar.bz2#059a8732c1d81ffc93997cb8a236331f
+https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102
+https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284
+https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3
+https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92
+https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7
+https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_1.conda#91d7152c744dc0f18ef8beb3cbc9980a
+https://conda.anaconda.org/conda-forge/linux-64/cramjam-2.11.0-py39h881adfc_0.conda#3c7c06b2ad5abbf3fae386352544da72
+https://conda.anaconda.org/conda-forge/linux-64/curl-7.87.0-h6312ad2_0.conda#e6ca70adeae12dce14cbf412b58ace64
+https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833
+https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.16-py39haef64b4_0.conda#ad12118b06c2596073c843e6d47978c2
+https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda#9ce473d1d1be1cc3810856a48b3fab32
+https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda#81d30c08f9a3e556e8ca9e124b044d14
+https://conda.anaconda.org/conda-forge/noarch/fasteners-0.20-pyhd8ed1ab_0.conda#11445cf1b9a9114b82a7dc9f0cd036ec
+https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py39h53edacf_0.conda#c60d1141e060c5a25d30a379773b9fce
+https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019
+https://conda.anaconda.org/conda-forge/noarch/gast-0.4.0-pyh9f0ad1d_0.tar.bz2#42323c77b73462199fca93bc8ac9279d
+https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.4-py39h818bca1_0.conda#38d510d03b8fc261a73366f10f649188
+https://conda.anaconda.org/conda-forge/linux-64/grpc-cpp-1.43.2-h9e046d8_3.tar.bz2#207c94a7e383dd7bc30ef90433ef5d0b
+https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h2386368_101.conda#bd61fa767de9880c9c9c8873dc2581e8
+https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e
+https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac
+https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhf9edf01_1.conda#ed83a53046788a688a38b76e436f5aac
+https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda#2f0ba4bc12af346bc6c99bdc377e8944
+https://conda.anaconda.org/conda-forge/noarch/keras-2.7.0-pyhd8ed1ab_0.tar.bz2#394fc4295ee04f601e9f73503dbb935a
+https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py39h74842e3_0.conda#1bf77976372ff6de02af7b75cf034ce5
+https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b
+https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc
+https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4
+https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py39hd7df8f7_1.conda#5eac52bcb350198b53c6b1efb384b563
+https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py39h9399b63_1.conda#7821f0938aa629b9f17efd98c300a487
+https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.1-py39h74842e3_0.conda#fce378a7c73ea47b7e79ef27a8c798a2
+https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609
+https://conda.anaconda.org/conda-forge/noarch/narwhals-2.1.2-pyhe01879c_0.conda#90d3b6c75c144e8c461b846410d7c0bf
+https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda#598fd7d4d0de2455fb74f56063969a97
+https://conda.anaconda.org/conda-forge/noarch/networkx-3.2-pyhd8ed1ab_0.conda#cec8cc498664cc00a070676aa89e69a7
+https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea
+https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda#52919815cd35c4e1a0298af658ccda04
+https://conda.anaconda.org/conda-forge/linux-64/orc-1.7.3-h1be678f_0.tar.bz2#390f40a6ceaa94b3b221599456168856
+https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda#936687ed80f295a1f5dbcf8bd34c252c
+https://conda.anaconda.org/conda-forge/noarch/param-1.13.0-pyh1a96a4e_0.conda#158eda83fd21a14b8c483c0d1d102397
+https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda#5c092057b6badd30f75b06244ecd01c9
+https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda#11a9d1d09a3615fc07c3faf79bc0b943
+https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7
+https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py39h9399b63_0.conda#984e7a95bc7e9045ffc22d5d34e99da1
+https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py39h8cd3c5a_0.conda#851ab4da2babaf8d6968a64dd348ca88
+https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda#7d9daffbb8d8e0af0f769dbbcd173a54
+https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda#3bfdfb8dbcdc4af1ae3f9a8eb3948f04
+https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.1-pyhd8ed1ab_2.conda#09bb17ed307ad6ab2fd78d32372fdd4e
+https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda#85815c6a22905c080111ec8d56741454
+https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef
+https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066
+https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda#84c5c40ea7c5bbc6243556e5daed20e7
+https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d
+https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac
+https://conda.anaconda.org/conda-forge/noarch/python-flatbuffers-2.0-pyhd8ed1ab_0.tar.bz2#4df5b030a147e0e86cba6a08b4e3a89a
+https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960
+https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py39h9399b63_2.conda#13fd88296a9f19f5e3ac0c69d4b64cc6
+https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py39h4e4fb57_1.conda#4f303fde372f5ed6a85e3cd895bda96d
+https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.27.0-py39h17f49b6_0.conda#de935a1880d17308167b723231e87f9d
+https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e
+https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3
+https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda#0401a17ae845fa72c7210e206ec5647d
+https://conda.anaconda.org/conda-forge/noarch/tblib-3.1.0-pyhd8ed1ab_0.conda#a15c62b8a306b8978f094f76da2f903f
+https://conda.anaconda.org/conda-forge/linux-64/tensorboard-data-server-0.6.1-py39hd97740a_4.conda#5cc232b2368bf5058ef84b0bdfa4c7c3
+https://conda.anaconda.org/conda-forge/noarch/tensorboard-plugin-wit-1.8.1-pyhd8ed1ab_0.tar.bz2#0adae6ededf20046d74a3f9343269efd
+https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda#951a99e94afe3d38bfdbd04902fe33b7
+https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d
+https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py39hd399759_0.conda#9546db52eccafee2fa2675653fec04f9
+https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed
+https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f
+https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py39h8cd3c5a_0.conda#2011fcaddafa077f4f0313361f4c2731
+https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda#b68980f2495d096e71c7fd9d7ccf63e6
+https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d
+https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986
+https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py39hd399759_0.conda#4b8960ce9fbfaaea83b98e1deb4a9480
+https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda#e52c2ef711ccf31bb7f70ca87d144b9e
+https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f
+https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda#421a865222cd0c9d83ff08bc78bf3a61
+https://conda.anaconda.org/conda-forge/noarch/astunparse-1.6.3-pyhd8ed1ab_3.conda#d3f195dfdbbf736e4ec178bbec2a975c
+https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.8.186-hecaee15_4.tar.bz2#e29dc8e8611b70cdfcc3139dba6e9001
+https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3
+https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda#1990eb3f49022846fbc7fc9624a0ee43
+https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py39h15c3d72_0.conda#7e61b8777f42e00b08ff059f9e8ebc44
+https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py39h8cd3c5a_0.conda#6a86bebd04e7ecd773208e774aa3a58d
+https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a
+https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py39heb7d2ae_0.conda#93d184020f519fe0d32715cb14b8ff50
+https://conda.anaconda.org/conda-forge/noarch/google-pasta-0.2.0-pyhd8ed1ab_2.conda#005b9749218cb8c9e94ac2a77ca3c8c0
+https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.43.0-py39hff7568b_0.tar.bz2#416068d29d2c422ec6ab2c6f02e5e57e
+https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6
+https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8
+https://conda.anaconda.org/conda-forge/noarch/intake-2.0.8-pyhd8ed1ab_0.conda#bcd8513a2f3b9b8d83fc7f04302cf800
+https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda#a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9
+https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.3-pyhd8ed1ab_0.tar.bz2#036d872c653780cb26e797e2e2f61b4c
+https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda#b7d89d860ebcda28a5303526cdee68ab
+https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-1.36.0-h6945097_0.tar.bz2#2c59ab40c22f2fc0d0eaaea6161537c5
+https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0
+https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf
+https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda#af6ab708897df59bd6e7283ceab1b56b
+https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163
+https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda#d0d408b1f18883a944376da5cf8101ea
+https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py39h2320bf1_1.conda#d2f79132b9c8e416058a4cd84ef27b3d
+https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5
+https://conda.anaconda.org/conda-forge/noarch/plotly-6.3.0-pyhd8ed1ab_0.conda#5366b5b366cd3a2efa7e638792972ea1
+https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda#d17ae9db4dc594267181bd199bf9a551
+https://conda.anaconda.org/conda-forge/linux-64/protobuf-3.19.6-py39h227be39_0.conda#63a5053248a46ffce7a7fbcfd9cc92fe
+https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda#c689b62552f6b63f32f3322e463f3805
+https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8
+https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda#644bd4ca9f68ef536b902685d773d697
+https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda#e0f2c3ecb4dc40d031bbe88869a2a7a1
+https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda#9140f1c09dd5489549c6a33931b943c7
+https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda#58958bb50f986ac0c46f73b6e290d5fe
+https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-1.4.46-py39h72bdee0_0.conda#8e7f9dca9ff278a640f0b63ae0c9633d
+https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda#b1b505328da7a6b246787df4b5a49fbc
+https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda#9efbfdc37242619130ea42b1cc4ed861
+https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635
+https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhd8ed1ab_1.conda#0a9b57c159d56b508613cc39022c1b9e
+https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.0-py39hd598818_0.conda#8b8923de82864744f8150b6307f4039a
+https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.2.0-pyhd8ed1ab_0.conda#156fb994a4e07091c4fad2c148589eb2
+https://conda.anaconda.org/conda-forge/noarch/ipython-8.18.1-pyh707e725_3.conda#15c6f45a45f7ac27f6d60b0b084f6761
+https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda#41ff526b1083fde51fbdc93f29282e0e
+https://conda.anaconda.org/conda-forge/noarch/jupyter_client-5.3.3-py_0.tar.bz2#4cf7d68dbb2e7e2ddde4f962e25f2c22
+https://conda.anaconda.org/conda-forge/noarch/markdown-3.8.2-pyhd8ed1ab_0.conda#b0404922d0459f188768d1e613ed8a87
+https://conda.anaconda.org/conda-forge/linux-64/multidict-6.6.3-py39h9399b63_0.conda#f873dacbe5d1ce4e93c111792707a443
+https://conda.anaconda.org/conda-forge/linux-64/numpy-1.19.5-py39hd249d9e_3.tar.bz2#0cf333996ebdeeba8d1c8c1c0ee9eff9
+https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py39hd399759_3.conda#2f6845f6cdf545845a60c4dcbd017c78
+https://conda.anaconda.org/conda-forge/linux-64/arrow-cpp-8.0.0-py39heccc63a_1_cpu.tar.bz2#300ebd380aae1fe0bbf04ff1424b042e
+https://conda.anaconda.org/conda-forge/noarch/bokeh-2.4.3-pyhd8ed1ab_3.tar.bz2#e4c6e6d99add99cede5328d811cacb21
+https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py39hf3d9206_1.conda#9e20a6226b704b4df686d475dd9b80a5
+https://conda.anaconda.org/conda-forge/linux-64/h5py-3.7.0-nompi_py39hd51670d_101.tar.bz2#c4e1a9c86b5a7dddd4252f40815fbe3d
+https://conda.anaconda.org/conda-forge/linux-64/ipykernel-6.11.0-py39hef51801_0.tar.bz2#e4627b821239e3e6b8e010efc3492b5a
+https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.25.1-pyhe01879c_0.conda#341fd940c242cf33e832c0402face56f
+https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.3-py39h19d6b11_2.tar.bz2#dc400bb297d8425b8b05367a21854b0b
+https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py39h84cc369_1.conda#bd4f7363195b9c54fb7298e261dd90e6
+https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda#d4f3f31ee39db3efecb96c0728d4bdbf
+https://conda.anaconda.org/conda-forge/linux-64/pandas-1.4.4-py39h1832856_0.tar.bz2#6ef85649798519bd47dfc24e399b8dcd
+https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d
+https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21
+https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.1-py39h8ba3f38_0.tar.bz2#beed054d4979cd70690aea2b257a6d55
+https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a
+https://conda.anaconda.org/conda-forge/linux-64/yarl-1.20.1-py39h9399b63_0.conda#641f607c532c50edff65b3d3e477698c
+https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.12.15-py39heb7d2ae_0.conda#9eb5917269a01bc0181b55219e949f5b
+https://conda.anaconda.org/conda-forge/noarch/altair-5.5.0-pyhd8ed1ab_1.conda#e54e67e5aea7288ba110cf685252f599
+https://conda.anaconda.org/conda-forge/noarch/distributed-2023.2.0-pyhd8ed1ab_0.conda#908e176bdb542b900f1c044bac70683b
+https://conda.anaconda.org/conda-forge/linux-64/fastparquet-0.8.3-py39hd257fcd_0.tar.bz2#ba11baff2bbb77a870146831c4402696
+https://conda.anaconda.org/conda-forge/noarch/keras-preprocessing-1.1.2-pyhd8ed1ab_1.conda#3fa7d98a26c219c07453ffe5cf203fd1
+https://conda.anaconda.org/conda-forge/noarch/mizani-0.10.0-pyhd8ed1ab_0.conda#727e2c2020a82718d71b644229776657
+https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py39h6ced12a_102.tar.bz2#b92600d0fef7f12f426935d87d6413e6
+https://conda.anaconda.org/conda-forge/noarch/pandasql-0.7.3-pyhd8ed1ab_0.tar.bz2#7c72bbfc754396ade8e88759cbe0ac4a
+https://conda.anaconda.org/conda-forge/noarch/parquet-cpp-1.5.1-2.tar.bz2#79a5f78c42817594ae016a7896521a97
+https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4
+https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.12.2-pyhd8ed1ab_0.conda#cf88f3a1c11536bc3c10c14ad00ccc42
+https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py39hd92a3bb_0.conda#2f6c03d60e71f13d92d511b06193f007
+https://conda.anaconda.org/conda-forge/noarch/vega_datasets-0.9.0-pyhd8ed1ab_1.conda#a2208a412fdfefbd36e9c740da9a3f3b
+https://conda.anaconda.org/conda-forge/noarch/xarray-2022.9.0-pyhd8ed1ab_0.tar.bz2#e841ab2f40fb319e6740130227904cbf
+https://conda.anaconda.org/conda-forge/noarch/zarr-2.15.0-pyhd8ed1ab_0.conda#2e6414d548b4433d564fed1177d30281
+https://conda.anaconda.org/conda-forge/noarch/dask-2023.2.0-pyhd8ed1ab_0.conda#c64c58bf99a686d8bdff8f9c4d33d615
+https://conda.anaconda.org/conda-forge/noarch/google-auth-1.35.0-pyh6c4a22f_0.tar.bz2#e9e51ec25b36547a4192a1953df66a8c
+https://conda.anaconda.org/conda-forge/noarch/plotnine-0.10.1-pyhd8ed1ab_2.conda#39441c3cec7f25dae4b9d83be71df2b8
+https://conda.anaconda.org/conda-forge/linux-64/pyarrow-8.0.0-py39h42d110c_1_cpu.tar.bz2#9a6fd682c08e88c5b0e18ba84916b2b8
+https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda#9d19c7ea78d067fbbaa2317a85f844e7
+https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_1.conda#a283b764d8b155f81e904675ef5e1f4b
+https://conda.anaconda.org/conda-forge/noarch/seaborn-0.12.2-hd8ed1ab_0.conda#50847a47c07812f88581081c620f5160
+https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-0.4.6-pyhd8ed1ab_0.tar.bz2#430db61bdfa0b37903ef73d84bcea2c9
+https://conda.anaconda.org/conda-forge/noarch/intake-parquet-0.3.0-pyhd8ed1ab_1.conda#ceff21f71e8d5f8fee73bb7219693373
+https://conda.anaconda.org/conda-forge/noarch/intake-xarray-2.0.0-pyhd8ed1ab_1.conda#9ff534be39502e636cb4d25dc6696c66
+https://conda.anaconda.org/conda-forge/noarch/panel-0.14.4-pyhd8ed1ab_0.conda#1342769f399e43f0906af79e5221a0ad
+https://conda.anaconda.org/conda-forge/noarch/holoviews-1.16.2-pyhd8ed1ab_0.conda#cd0595cf5f97d5ef8843ac806c72ed47
+https://conda.anaconda.org/conda-forge/noarch/tensorboard-2.6.0-pyhd8ed1ab_1.tar.bz2#5ea59c2bbd714e8930c23b50857ef864
+https://conda.anaconda.org/conda-forge/noarch/hvplot-0.10.0-pyhd8ed1ab_0.conda#62e8362edc9bb3380e63186d4ad3e735
+https://conda.anaconda.org/conda-forge/linux-64/tensorflow-base-2.7.1-cpu_py39hfb6d7af_0.tar.bz2#68f766617e92581df9f6a826dc1b0a01
+https://conda.anaconda.org/conda-forge/linux-64/tensorflow-estimator-2.7.1-cpu_py39heaff504_0.tar.bz2#245469d1ef9d87b18719adc582d0cdc9
+https://conda.anaconda.org/conda-forge/linux-64/tensorflow-2.7.1-cpu_py39h4655687_0.tar.bz2#9c5b1aaf9a06247dc4a8fcfd30571975