From f6d10f02e2d677fec9b454c67fdc37743e45b304 Mon Sep 17 00:00:00 2001 From: Eugenio La Cava Date: Fri, 30 Jan 2026 11:07:42 +0100 Subject: [PATCH] [AI-Assisted] Fix runtime errors and add comprehensive documentation This commit contains changes made with AI assistance (Claude Opus 4.5). ## Bug Fixes ### Column Transformation Guards - Added conditional checks for already-transformed columns throughout script.py - Fixed KeyError for 'Packet Type' (already transformed to 'Packet Type Control') - Added guards for: Protocol, Traffic Type, Attack Signature, Action Taken, Network Segment, Log Source, Device Information, Alert Trigger, Malware Indicators, Firewall Logs, IDS/IPS Alerts, Geo-location Data ### Function Call Fixes - Fixed Device_type() function call at line ~510 (removed erroneous parentheses) - Changed from `df[col_name].apply(Device_type())` to `df[col_name].apply(Device_type)` ### Statistical Analysis Fixes - Fixed chi2_contingency error by creating proper contingency table with encoded values - Fixed MCA ValueError by adding +1 to one_hot encoded data for positive values - Removed invalid 'mode' parameter from px.line() call ### Dependency Fix - Added statsmodels to pixi.toml pypi-dependencies to fix ModuleNotFoundError ## Documentation Improvements ### Code Documentation - Added comprehensive docstrings to all functions - Added inline comments explaining data transformations - Added section headers with markdown formatting - Added explanatory comments for complex operations ### Visualization Improvements - Added descriptive titles to all charts - Added axis labels (xaxis_title, yaxis_title) to all plots - Added hover templates with meaningful labels - Added legend titles and context - Improved color schemes and formatting Co-Authored-By: Claude Opus 4.5 --- pixi.lock | 4772 ++++++++++++++++++++++++++++++++++++----------------- pixi.toml | 16 +- script.py | 2849 +++++++++++++++++++++----------- 3 files changed, 5187 insertions(+), 2450 deletions(-) diff --git a/pixi.lock b/pixi.lock index f0601b2..b418bda 100644 --- a/pixi.lock +++ b/pixi.lock @@ -10,11 +10,18 @@ environments: packages: osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.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/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.13.2-py312h352d07c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.13.3-py312h80cd6c1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.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/asgiref-3.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-25.1.0-py312h80b0991_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asgiref-3.11.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda @@ -27,14 +34,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.2-h7484968_6.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-hffd60a0_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.2.0-py312hcb931b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-ha4e89a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h2a5eb39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-h7f37a48_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.3.0-py312h6917036_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-h5f6438b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.6-hd145fbb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.2.0-hf139dec_1.conda @@ -42,83 +52,108 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.2.0-py312h4b46afd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/catalogue-2.0.10-py312hb401068_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py312he90777b_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.1-pyh8f84b5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpathlib-0.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cmudict-1.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cmudict-1.1.3-pyhcf101f3_0.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/noarch/confection-0.1.5-pyhecae5ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py312hd099df3_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py312hb0c38da_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.3-py312heb31a8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.17.0-h7dd4100_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.18.0-h9348e2b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cykhash-2.0.1-py312h69bf00f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cymem-2.0.13-py312h69bf00f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.2.2-py312h33b39b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cymem-2.0.13-py312h11f4fa3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.2.4-py312h84c01df_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-blis-1.3.3-py312hfed6dc8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.19-py312h6c02384_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/django-6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/django-6.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-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/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.61.0-py312hacf3034_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.61.1-py312hacf3034_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.7.0-py312h18bfd43_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.12.0-py312h06e505a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.12.1-py312h1870424_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geocoder-1.38.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geoip2-4.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.1-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/glog-0.7.1-h2790a97_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.43.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-translate-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.47.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-translate-3.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.72.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-grpc-1.72.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.73.1-py312h53eab48_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.73.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_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/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.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/importlib-resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.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.9.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/isoduration-20.11.0-pyhd8ed1ab_1.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-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_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/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py312h90e26e8_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.2-gpl_h889603c_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-hd1700fa_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-4_he492b99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-23.0.0-h8071b21_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-23.0.0-h9737151_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-23.0.0-hc26cc94_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-23.0.0-h9737151_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-23.0.0-h7f2e36e_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-4_h9b27e0a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda @@ -128,7 +163,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.1-h6912278_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_15.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.0-hfd904f9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda @@ -137,79 +172,102 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjxl-0.11.1-h4ee1b5b_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjxl-0.11.1-hde0fb83_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libkml-1.3.0-h450b6c2_1022.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-4_h859234e_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-5_h859234e_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-h03562ea_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-23.0.0-ha0d2768_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.54-h07817ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-h16cd5d8_20.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.22.0-h687e942_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h7b7ecba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lingua-language-detector-1.3.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.7-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-h4132b18_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py312hacf3034_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.8-py312h7894933_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/noarch/maxminddb-2.6.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/minizip-4.0.10-hfb7a1ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/msgspec-0.20.0-py312h1a1c95f_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.7.0-py312h2352a57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/muparser-2.3.5-hb996559_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/murmurhash-1.0.15-py312hbfd3414_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/murmurhash-1.0.15-py312h29de90a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_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.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h06076ce_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nltk-3.9.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py312ha3982b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.1-py312hb34da66_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.2-h3073fbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py312h86abcb1_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-2.3.3.251201-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-2.3.3.260113-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.0.0-py312hea0c9db_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/preshed-3.0.12-py312h69bf00f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/proj-9.7.0-h3124640_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-64/pillow-12.1.0-py312h4985050_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pixi-kernel-0.7.1-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/preshed-3.0.12-py312h11f4fa3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/proj-9.7.1-h4aacef1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prometheus-cpp-1.3.0-h7802330_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-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-64/propcache-0.3.1-py312h3520af0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-6.31.1-py312h457ac99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.2.1-py312hf7082af_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-22.0.0-py312hb401068_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py312hefc66a4_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-23.0.0-py312hb401068_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-23.0.0-py312ha422e09_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.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.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py312h8a6388b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-12.1-py312h4a480f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-12.1-py312h1993040_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py312h17ccd7d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-25.3.0-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/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyphen-0.17.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyproj-3.7.2-py312hfea2d77_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyrobuf-0.9.3-py312h462f358_8.conda @@ -217,249 +275,340 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.12-h74c2667_1_cpython.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.12.12-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-rapidjson-1.23-py312h69bf00f_0.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-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py312hacf3034_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-27.1.0-py312hb7d603e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ratelim-0.1.6-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/regex-2023.12.25-py312h41838bb_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/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/returns-0.26.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.30.0-py312h8a6388b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-py312hfee4f84_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.3-py312he2acf2f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py312h47bbdc5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.0-py312ha20b133_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.1.2-py312hd8edc82_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sklearn-compat-0.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sklearn-pandas-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smart-open-7.5.0-h0f9f196_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.2-h01f5ddf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/spacy-3.8.11-py312h46c259a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/spacy-legacy-3.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/spacy-loggers-1.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h9e4bfbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.4-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.2-h5af3ad2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlite-fts4-1.0.3-pyhaa4b35c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlite-utils-3.39-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/srsly-2.5.2-py312h69bf00f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/textstat-0.7.11-pyhd8ed1ab_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-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textstat-0.7.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/thinc-8.3.10-py312h46c259a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py312h404bc50_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_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/typer-0.21.1-pyhf8876ea_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2025.2.0.20251108-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_1.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/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ujson-5.11.0-py312h2ac44ba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-17.0.0-py312h80b0991_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wasabi-1.1.3-pyhd8ed1ab_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/weasel-0.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-2.0.1-py312h80b0991_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-hd0321b6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.22.0-py312hacf3034_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h6c33b1e_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h53ec75d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/33/ef2f2409450ef6daa61459d5de5c08128e7d3edb773fefd0a324d1310238/altair-6.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3f/61a8ef73236dbea83a1a063a8af2f8e1e41a0df64f122233938391d0f175/deep_translator-1.11.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/cd/eadada1cdcf7d7b9b5053e583239e59b9e05902a2983032d790fbfc7bad7/ioc_fanger-4.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/68/9c8bfd59d4fafebf20ffa1e9ee3b0492a1f7d7816de0757c4367a4fecab3/ioc_finder-5.0.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/07/8f02b5c352e5deaf1461ededd4cb844e96da96f0158fccfa397e85f4a8d0/prince-0.16.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/1c/20bb3d7b2bad56d881e3704131ddedbb16eb787101306887dff349064662/user_agents-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/38/347d1fcde4edabd338d5872ca5759ccfb95ff1cf5207dafded981fd08c4f/yara_python-4.5.4.tar.gz 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/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.13.2-pyh4ca1811_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.13.3-py312h6b91d65_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.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/asgiref-3.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-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/aws-c-auth-0.9.1-h06c2b12_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.10-ha82e055_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.5-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-h83e01e5_8.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.6-h3116ff1_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-h52d8906_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h6f46d10_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-h9821516_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.10.1-he380ad5_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-h83e01e5_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-h83e01e5_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.2-h1a9a3a2_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-h6446450_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asgiref-3.11.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.3.0-py312h06d0912_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-h5f6438b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.5-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/catalogue-2.0.10-py312h2e8e312_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_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.1-pyha7b4d00_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpathlib-0.23.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cmudict-1.1.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cmudict-1.1.3-pyhcf101f3_0.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/noarch/confection-0.1.5-pyhecae5ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312hf90b1b7_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312h78d62e6_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-46.0.3-py312h232196e_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/curl-8.17.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/curl-8.18.0-h43ecb02_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cykhash-2.0.1-py312hbb81ca0_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cymem-2.0.13-py312hbb81ca0_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.2-py312hd245ac3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cymem-2.0.13-py312hbb81ca0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py312hd245ac3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cython-blis-1.3.3-py312h196c9fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.19-py312ha1a9051_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/django-6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/django-6.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-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/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.0-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.61.1-py312h05f76fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_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/freexl-2.0.0-hf297d47_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.7.0-pyhf298e5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.7.0-py312hfdf67e6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gdal-3.12.0-py312h07de9ea_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gdal-3.12.1-py312h07de9ea_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geocoder-1.38.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geoip2-4.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.1-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.43.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-translate-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.47.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-translate-3.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.72.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-grpc-1.72.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.73.1-py312h9256aa6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.73.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_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/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.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/importlib-resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.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.9.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/isoduration-20.11.0-pyhd8ed1ab_1.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-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_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/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py312h78d62e6_2.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/lcms2-2.17-hbcf6048_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_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/libabseil-20250512.1-cxx17_habfad5f_0.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/libarrow-22.0.0-h117da51_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-3_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-23.0.0-hcf7e2ff_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-23.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-23.0.0-h2db994a_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-23.0.0-h7d8d6a5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-23.0.0-hf865cc0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-3_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - 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/libcurl-8.18.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/libevent-2.1.12-h3671451_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-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-h8ee18e1_15.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.0-hd4e8292_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.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/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.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/libjpeg-turbo-3.1.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.1-hac9b6f3_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.1-hf3f85d1_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1022.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-3_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/libparquet-22.0.0-h7051d1f_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.51-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-23.0.0-h7051d1f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.54-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.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/libspatialite-5.1.0-gpl_h0cd62ae_119.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-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/libthrift-0.22.0-h23985f6_1.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/libutf8proc-2.11.2-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.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-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lingua-language-detector-1.3.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.7-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_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/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py312h05f76fc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py312h0ebf65c_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/noarch/maxminddb-2.6.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.0.10-h9fa1bad_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/noarch/multidict-6.6.3-pyh62beb40_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msgspec-0.20.0-py312he06e257_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.7.0-py312h05f76fc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/murmurhash-1.0.15-py312ha1a9051_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.13.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/murmurhash-1.0.15-py312ha1a9051_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.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.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nltk-3.9.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py312ha72d056_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py312ha72d056_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h24db6dd_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/win-64/orc-2.2.1-h7414dfc_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/orc-2.2.2-hbd3206f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-2.3.3.251201-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-2.3.3.260113-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.0.0-py312h31f0997_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/preshed-3.0.12-py312hbb81ca0_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.3.1-pyhe1237c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py312h31f0997_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pixi-kernel-0.7.1-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/preshed-3.0.12-py312hbb81ca0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-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/propcache-0.3.1-py312h31fea79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.31.1-py312hcb3287e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.1-py312he5662c2_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/pyarrow-22.0.0-py312h2e8e312_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py312h85419b5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-23.0.0-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-23.0.0-py312h85419b5_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.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.5-pyhcf101f3_1.conda @@ -467,7 +616,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py312h3f2e00f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-25.3.0-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/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyphen-0.17.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py312habbd053_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyrobuf-0.9.3-py312hbb81ca0_8.conda @@ -475,79 +624,118 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.12-h0159041_1_cpython.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/win-64/python-rapidjson-1.22-py312hbb81ca0_0.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-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.12-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-rapidjson-1.23-py312hbb81ca0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py312h275cf98_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_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/win-64/qhull-2020.2-hc790b64_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ratelim-0.1.6-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_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/regex-2023.12.25-py312he70551f_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/rich-14.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/returns-0.26.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py312hdabe01f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.2-py312h91ac024_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.3-py312hd0164fe_1.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/scikit-learn-1.8.0-np2py312hea30aaf_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py312h9b3c559_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py312h37f46ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sklearn-compat-0.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sklearn-pandas-2.2.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smart-open-7.5.0-h0f9f196_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.5.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/spacy-3.8.11-py312he3e9d37_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/spacy-legacy-3.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/spacy-loggers-1.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.4-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.2-hdb435a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlite-fts4-1.0.3-pyhaa4b35c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlite-utils-3.39-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.5-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/srsly-2.5.2-py312hbb81ca0_0.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/textstat-0.7.11-pyhd8ed1ab_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-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textstat-0.7.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/thinc-8.3.10-py312h9b46583_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py312he06e257_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_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/typer-0.21.1-pyhf8876ea_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2025.2.0.20251108-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_1.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/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.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/win-64/ujson-5.11.0-py312ha1a9051_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.0-py312he06e257_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_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/vs2015_runtime-14.44.35208-h38c0c73_32.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wasabi-1.1.3-pyhd8ed1ab_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/weasel-0.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-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/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-2.0.1-py312he06e257_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.22.0-pyh7db6752_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/yarl-1.22.0-py312h05f76fc_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-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h5112557_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py312he5662c2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/33/ef2f2409450ef6daa61459d5de5c08128e7d3edb773fefd0a324d1310238/altair-6.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/3f/61a8ef73236dbea83a1a063a8af2f8e1e41a0df64f122233938391d0f175/deep_translator-1.11.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/29/cd/eadada1cdcf7d7b9b5053e583239e59b9e05902a2983032d790fbfc7bad7/ioc_fanger-4.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/68/9c8bfd59d4fafebf20ffa1e9ee3b0492a1f7d7816de0757c4367a4fecab3/ioc_finder-5.0.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/07/8f02b5c352e5deaf1461ededd4cb844e96da96f0158fccfa397e85f4a8d0/prince-0.16.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/1c/20bb3d7b2bad56d881e3704131ddedbb16eb787101306887dff349064662/user_agents-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ad/e1/f6a72c155f3241360da890c218911d09bf63329eca9cfa1af64b1498339b/yara_python-4.5.4-cp312-cp312-win_amd64.whl packages: - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda @@ -576,6 +764,17 @@ packages: 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/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda sha256: 7842ddc678e77868ba7b92a726b437575b23aaec293bca0d40826f1026d90e27 md5: 18fd895e0e775622906cdabfc3cf0fb4 @@ -587,32 +786,30 @@ packages: - pkg:pypi/aiohappyeyeballs?source=hash-mapping size: 19750 timestamp: 1741775303303 -- conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.13.2-pyh4ca1811_0.conda - sha256: 8af88a6daa5e30f347da7faee1ee17d920a1090c0e921431bf43adff02429b50 - md5: 9b7efc1b9351892fc1b0af3fb7e44280 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.13.3-py312h80cd6c1_0.conda + sha256: 7703f430156a933756c57afab320aaa8d30639e8f9f899628a3eb5fbfa9b685b + md5: 1d67d1baba2a1917f1cd6519029a3fbf depends: + - __osx >=10.13 - aiohappyeyeballs >=2.5.0 - aiosignal >=1.4.0 - - async-timeout >=4.0,<6.0 - attrs >=17.3.0 - frozenlist >=1.1.1 - multidict >=4.5,<7.0 - propcache >=0.2.0 - - python >=3.10 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 - yarl >=1.17.0,<2.0 - track_features: - - aiohttp_no_compile license: MIT AND Apache-2.0 license_family: Apache purls: - pkg:pypi/aiohttp?source=hash-mapping - size: 474272 - timestamp: 1761726660058 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aiohttp-3.13.2-py312h352d07c_0.conda - sha256: 9a88e9eba482a489ff2ff58e243d0e4ce1ecb371790523541d85f9c6fc7cdef4 - md5: f2ab5e6e6ffde3580460181bf094749b + size: 993471 + timestamp: 1767525057464 +- conda: https://conda.anaconda.org/conda-forge/win-64/aiohttp-3.13.3-py312h6b91d65_0.conda + sha256: ef7eb9709f46d1d1138c9d667a72a9b2c1907a83daa54e63e6d7b7fb7043f331 + md5: 65ebd46fdc1e28a6b035935246bd6531 depends: - - __osx >=10.13 - aiohappyeyeballs >=2.5.0 - aiosignal >=1.4.0 - attrs >=17.3.0 @@ -621,13 +818,16 @@ packages: - propcache >=0.2.0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 - yarl >=1.17.0,<2.0 license: MIT AND Apache-2.0 license_family: Apache purls: - pkg:pypi/aiohttp?source=hash-mapping - size: 983635 - timestamp: 1761726866534 + size: 964547 + timestamp: 1767524981872 - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda sha256: 8dc149a6828d19bf104ea96382a9d04dae185d4a03cc6beb1bc7b84c428e3ca2 md5: 421a865222cd0c9d83ff08bc78bf3a61 @@ -641,6 +841,56 @@ packages: - pkg:pypi/aiosignal?source=hash-mapping size: 13688 timestamp: 1751626573984 +- pypi: https://files.pythonhosted.org/packages/db/33/ef2f2409450ef6daa61459d5de5c08128e7d3edb773fefd0a324d1310238/altair-6.0.0-py3-none-any.whl + name: altair + version: 6.0.0 + sha256: 09ae95b53d5fe5b16987dccc785a7af8588f2dca50de1e7a156efa8a461515f8 + requires_dist: + - jinja2 + - jsonschema>=3.0 + - narwhals>=1.27.1 + - packaging + - typing-extensions>=4.12.0 ; python_full_version < '3.15' + - altair-tiles>=0.3.0 ; extra == 'all' + - anywidget>=0.9.0 ; extra == 'all' + - numpy ; extra == 'all' + - pandas>=1.1.3 ; extra == 'all' + - pyarrow>=11 ; extra == 'all' + - vegafusion>=2.0.3 ; extra == 'all' + - vl-convert-python>=1.8.0 ; extra == 'all' + - duckdb>=1.0 ; python_full_version < '3.14' and extra == 'dev' + - geopandas>=0.14.3 ; python_full_version < '3.14' and extra == 'dev' + - hatch>=1.13.0 ; extra == 'dev' + - ipykernel ; extra == 'dev' + - ipython ; extra == 'dev' + - mistune ; extra == 'dev' + - mypy ; extra == 'dev' + - pandas-stubs ; extra == 'dev' + - pandas>=1.1.3 ; extra == 'dev' + - polars>=0.20.3 ; extra == 'dev' + - pyarrow-stubs ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-xdist[psutil]~=3.5 ; extra == 'dev' + - ruff>=0.9.5 ; extra == 'dev' + - taskipy>=1.14.1 ; extra == 'dev' + - tomli>=2.2.1 ; extra == 'dev' + - types-jsonschema ; extra == 'dev' + - types-setuptools ; extra == 'dev' + - docutils ; extra == 'doc' + - jinja2 ; extra == 'doc' + - myst-parser ; extra == 'doc' + - numpydoc ; extra == 'doc' + - pillow ; extra == 'doc' + - pydata-sphinx-theme>=0.14.1 ; extra == 'doc' + - scipy ; extra == 'doc' + - scipy-stubs ; python_full_version >= '3.10' and extra == 'doc' + - sphinx ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinxext-altair ; extra == 'doc' + - vl-convert-python>=1.8.0 ; extra == 'save' + requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 md5: 2934f256a8acfe48f6ebb4fce6cde29c @@ -653,40 +903,120 @@ packages: - pkg:pypi/annotated-types?source=hash-mapping size: 18074 timestamp: 1733247158254 -- conda: https://conda.anaconda.org/conda-forge/noarch/asgiref-3.11.0-pyhd8ed1ab_0.conda - sha256: 4c64237bf5ef6e16ef0c6ad31145dd5aed9f986c1a1becbe5abd17d9b4556ea2 - md5: 9fbe495cd313f37898d8eea42329faba +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + sha256: eb0c4e2b24f1fbefaf96ce6c992c6bd64340bc3c06add4d7415ab69222b201da + md5: 11a2b8c732d215d977998ccd69a9d5e8 depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 - python >=3.10 - - typing_extensions >=4 - license: BSD-3-Clause + - typing_extensions >=4.5 + - python + constrains: + - trio >=0.32.0 + - uvloop >=0.21 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio?source=compressed-mapping + size: 145175 + timestamp: 1767719033569 +- 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/asgiref?source=hash-mapping - size: 27187 - timestamp: 1763585269736 -- conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhd8ed1ab_1.conda - sha256: 33d12250c870e06c9a313c6663cfbf1c50380b73dfbbb6006688c3134b29b45a - md5: 5d842988b11a8c3ab57fb70840c83d24 + - pkg:pypi/appnope?source=hash-mapping + size: 10076 + timestamp: 1733332433806 +- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad + md5: 8ac12aff0860280ee0cff7fa2cf63f3b depends: + - argon2-cffi-bindings - python >=3.9 - license: Apache-2.0 - license_family: Apache + - typing-extensions + constrains: + - argon2_cffi ==999 + license: MIT + license_family: MIT purls: - - pkg:pypi/async-timeout?source=hash-mapping - size: 11763 - timestamp: 1733235428203 -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda - sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 - md5: c7944d55af26b6d2d7629e27e9a972c1 + - pkg:pypi/argon2-cffi?source=hash-mapping + size: 18715 + timestamp: 1749017288144 +- conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-25.1.0-py312h80b0991_2.conda + sha256: b18ea88c1a3e8c9d6a05f1aa71928856cfdcb5fd4ad0353638f4bac3f0b9b9a2 + md5: 66f6b81d4bf42e3da028763e9d873bff depends: - - python >=3.10 + - __osx >=10.13 + - cffi >=1.0.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 33431 + timestamp: 1762509769660 +- conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py312he06e257_2.conda + sha256: 38c5e43d991b0c43713fa2ceba3063afa4ccad2dd4c8eb720143de54d461a338 + md5: 5dc3781bbc4ddce0bf250a04c1a192c2 + depends: + - cffi >=1.0.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: - - pkg:pypi/attrs?source=hash-mapping - size: 60101 - timestamp: 1759762331492 + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 38535 + timestamp: 1762509763237 +- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141 + md5: 85c4f19f377424eafc4ed7911b291642 + depends: + - python >=3.10 + - python-dateutil >=2.7.0 + - python-tzdata + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/arrow?source=hash-mapping + size: 113854 + timestamp: 1760831179410 +- conda: https://conda.anaconda.org/conda-forge/noarch/asgiref-3.11.0-pyhcf101f3_1.conda + sha256: a831ae19fbf7d0d019066a726185844480c29010cac42c3a494305b34490d38b + md5: d18baa0a8838efe07cc8cd1d3019a084 + depends: + - python >=3.10 + - typing_extensions >=4 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/asgiref?source=hash-mapping + size: 28059 + timestamp: 1767729187904 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010 + md5: 9673a61a297b00016442e022d689faa6 + depends: + - python >=3.10 + constrains: + - astroid >=2,<5 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + size: 28797 + timestamp: 1763410017955 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f md5: 537296d57ea995666c68c821b00e360b @@ -714,26 +1044,23 @@ packages: purls: [] size: 119662 timestamp: 1764765258455 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.1-h06c2b12_7.conda - sha256: 5cb6fc96c300c1bc1668adb59ca1017212c4998ab27b6eaf2fd9ffa58a222005 - md5: 800fe3ae781677fc4b5225f51129e00e +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + sha256: 1ca3be8873335aff46da2d613c0e9e0c27b9878e402548e3cf31cd378a2f9342 + md5: 6f42aac88a3b880dd3a4e0fe61f418bc 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 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 - - aws-c-cal >=0.9.10,<0.9.11.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 - aws-c-io >=0.23.3,<0.23.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 116063 - timestamp: 1763068418806 + size: 125616 + timestamp: 1764765271198 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda sha256: c085b749572ca7c137dfbf8a2a4fd505657f8f7f8a7b374d5f41bf4eb2dd9214 md5: cbf7be9e03e8b5e38ec60b6dbdf3a649 @@ -745,19 +1072,19 @@ packages: purls: [] size: 45262 timestamp: 1764593359925 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.10-ha82e055_1.conda - sha256: 61033a59fd56992a4e479e87c816e3ab68574cb84b545839edfd9fa700978285 - md5: 11394bff1f454f58ee000350ff3c23a6 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda + sha256: 5f61082caea9fbdd6ba02702935e9dea9997459a7e6c06fd47f21b81aac882fb + md5: 7cc4953d504d4e8f3d6f4facb8549465 depends: - - aws-c-common >=0.12.5,<0.12.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] - size: 53009 - timestamp: 1762858739380 + size: 53613 + timestamp: 1764593604081 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.12.6-h8616949_0.conda sha256: 66fb2710898bb3e25cb4af52ee88a0559dcde5e56e6bd09b31b98a346a89b2e3 md5: c7f2d588a6d50d170b343f3ae0b72e62 @@ -768,9 +1095,9 @@ packages: purls: [] size: 230785 timestamp: 1763585852531 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.5-hfd05255_1.conda - sha256: 87beb42fc12e7f0324d8abd5dd6892f84f82007be09818cad64010df75442e0c - md5: 47ade93c2f58573ad29519ab7be05321 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda + sha256: 0627691c34eb3d9fcd18c71346d9f16f83e8e58f9983e792138a2cccf387d18a + md5: b1465f33b05b9af02ad0887c01837831 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -778,8 +1105,8 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 236775 - timestamp: 1762858573513 + size: 236441 + timestamp: 1763586152571 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda sha256: b99ddb6654ca12b9f530ca4cbe4d2063335d4ac43f9d97092c4076ccaf9b89e7 md5: abb79371a321d47da8f7ddca128533de @@ -791,22 +1118,19 @@ packages: purls: [] size: 21423 timestamp: 1764593738902 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-h83e01e5_8.conda - sha256: ef7265145a1afe41bf4676f08634e76918afb6fad3bc934bdec02f90d1908eba - md5: c531103556862e44ba19003638b72fb0 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda + sha256: ff1046d67709960859adfa5793391a2d233bb432ec7429069fcfab5b643827df + md5: 0888dbe9e883582d138ec6221f5482d6 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 - - aws-c-common >=0.12.5,<0.12.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 23132 - timestamp: 1762957485681 + size: 23136 + timestamp: 1764593733263 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda sha256: 56f7aebd59d5527830ef7cf6e91f63ee4c5cf510af56529276affe8e2dc9eb24 md5: e0d71662f35b21fb993484238b4861d9 @@ -821,24 +1145,21 @@ packages: purls: [] size: 52911 timestamp: 1764675471218 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.6-h3116ff1_6.conda - sha256: 5e543fb10106067c383eb5525eb162df3f15fbdcd22b1728cf97f66e3fff4c0b - md5: 3e3384e8f33ac0e7d22942d74c566c3e +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda + sha256: 5fbbfd835831dace087064d08c38eb279b7db3231fbd0db32fad86fe9273c10c + md5: 34e3b065b76c8a144c92e224cc3f5672 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 - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 57033 - timestamp: 1762957450748 + size: 57054 + timestamp: 1764675494741 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda sha256: 53ee041db79f6cbff62179b2f693e50e484d163b9a843a3dbbb80dbc36220c7e md5: acff093ebb711857fb78fae3b656631c @@ -853,25 +1174,22 @@ packages: purls: [] size: 192149 timestamp: 1764675489248 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-h52d8906_4.conda - sha256: 609ba9e55b22f083168f56990baf28be6a921d00c6629ce3fa19c0ac2e6ee931 - md5: 0a8e38b5b7ef67f38d0159dc2578fcac +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda + sha256: 4f41b922ce01c983f98898208d49af5f3d6b0d8f3e8dcb44bd13d8183287b19a + md5: 3427460b0654d317e72a0ba959bb3a23 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 - - aws-c-cal >=0.9.10,<0.9.11.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-compression >=0.3.1,<0.3.2.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 206678 - timestamp: 1763054496834 + size: 206709 + timestamp: 1764675527860 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda sha256: 734496fb5a33a4d13ff0a27c5bc4a0f4e7fe9ed15ec099722d5be82b456b9502 md5: d9cc056da3a1ee0a2da750d10a5496f3 @@ -884,23 +1202,20 @@ packages: purls: [] size: 182572 timestamp: 1765168277462 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h6f46d10_3.conda - sha256: f416a4eeee057943203324ffbbbb1c0438d797dce66674215542de27d518d751 - md5: dd719de51293043208c5b5da2db2e803 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda + sha256: 2d726ffd67fb387dbebf63c9b9965b476b9d670f683e71c3dca1feb6365ddc7c + md5: 400792109e426730ac9047fd6c9537ef 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 - - aws-c-common >=0.12.5,<0.12.6.0a0 - - aws-c-cal >=0.9.10,<0.9.11.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 182047 - timestamp: 1763043613192 + size: 182053 + timestamp: 1765168273517 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda sha256: c05215c85f90a0caba1202f4c852d6e3a2ad93b4a25f286435a8e855db4237ae md5: 96f22c912f1cf3493d9113b9fd04c912 @@ -914,24 +1229,21 @@ packages: purls: [] size: 188230 timestamp: 1764681760102 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-h9821516_10.conda - sha256: c0d00f4c13ecc105b1c48bb0ada092d1cc6cb178a22a089c35c326bcdb83154f - md5: c074aef20987db9d2968a5e1242b2515 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda + sha256: 9b241397ef436dcf67e8e6cde15ff9c0d03ea942ad11e27c77caecce0d51b5be + md5: 6c043365f1d3f89c0b68238c6f5b8cce 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 - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-http >=0.10.7,<0.10.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 206308 - timestamp: 1762957392292 + size: 206357 + timestamp: 1764681793150 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda sha256: 9c989a5f0b35ff5cee91b74bcba0d540ce5684450dc072ba0bb5299783cdf9cd md5: 33c653401dc7b016b0011cb4d16de458 @@ -948,27 +1260,24 @@ packages: purls: [] size: 133827 timestamp: 1765174162875 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.10.1-he380ad5_2.conda - sha256: 6749b421fc240e8108304d288d4560c82a4791acd61db9e005303e2068ed5c6d - md5: f50a31a10ee0c342ed17750a208285d8 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + sha256: cda138c03683e85f29eafc680b043a40f304ac8759138dc141a42878eb17a90f + md5: dcfc08ccd8e332411c454e38110ea915 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 - - aws-c-cal >=0.9.10,<0.9.11.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-auth >=0.9.1,<0.9.2.0a0 + - aws-c-auth >=0.9.3,<0.9.4.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-checksums >=0.2.7,<0.2.8.0a0 - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 140705 - timestamp: 1763077789447 + size: 141805 + timestamp: 1765174184168 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda sha256: 468629dbf52fee6dcabda1fcb0c0f2f29941b9001dcc75a57ebfbe38d0bde713 md5: b384fb05730f549a55cdb13c484861eb @@ -980,22 +1289,19 @@ packages: purls: [] size: 55664 timestamp: 1764610141049 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-h83e01e5_3.conda - sha256: 098b17697f392ed3253754f4a5c776b422a89489834bfc7b8593ac46294820e4 - md5: 1860dd0926b5eb0fcb19b581b908975b +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda + sha256: c86c30edba7457e04d905c959328142603b62d7d1888aed893b2e21cca9c302c + md5: 3c97faee5be6fd0069410cf2bca71c85 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 - - aws-c-common >=0.12.5,<0.12.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 56482 - timestamp: 1762957352222 + size: 56509 + timestamp: 1764610148907 - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda sha256: 0f67c453829592277f90d520f7855e260cf0565a3dc59fe90c55293996b7fbe9 md5: cccf553ce36da9ae739206b69c1a4d28 @@ -1007,101 +1313,92 @@ packages: purls: [] size: 75646 timestamp: 1764593751665 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-h83e01e5_4.conda - sha256: 5112b8809adc01dbd77910514a0bcda87dd7fb74519e9d85beb07d32111706de - md5: 789551227529bc1c3ef3cbd1a2a1f5e4 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda + sha256: ca5e0719b7ca257462a4aa7d3b99fde756afaf579ee1472cac91c04c7bf3a725 + md5: 38f1501fc55f833a4567c83581a2d2ed 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 - - aws-c-common >=0.12.5,<0.12.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 93120 - timestamp: 1762957265474 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.2-h7484968_6.conda - sha256: 199db73ed3d3c7503b4cdfaef2e18bd7b2e67c2464d64c37f250833897a65d84 - md5: 1c3916576404e725bb46c8393e90dab5 + size: 93142 + timestamp: 1764593765744 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda + sha256: d3ab94c9245f667c78940d6838529401795ce0df02ad561d190c38819a312cd9 + md5: 31db311b3005b16ff340796e424a6b3c depends: - libcxx >=19 - __osx >=10.13 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-mqtt >=0.13.3,<0.13.4.0a0 + - aws-c-s3 >=0.11.3,<0.11.4.0a0 - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-io >=0.23.3,<0.23.4.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-s3 >=0.11.3,<0.11.4.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-http >=0.10.7,<0.10.8.0a0 + - aws-c-event-stream >=0.5.7,<0.5.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 344127 - timestamp: 1765193382465 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.2-h1a9a3a2_4.conda - sha256: ef2efec9f253c8ec7df0dc659af319c7ef230412599c234db4078e7732c947f9 - md5: 832762e4fef8d8719b502a11e7cbb3d8 + size: 343812 + timestamp: 1765200322696 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda + sha256: 7b4aef9e1823207a5f91e8b5b95853bdfafcfea306cd62b99fd53c38aa5c3da0 + md5: ce1a20b5c406727e32222ac91e5848c4 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 - - aws-c-cal >=0.9.10,<0.9.11.0a0 - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 - - aws-c-auth >=0.9.1,<0.9.2.0a0 - - aws-c-event-stream >=0.5.6,<0.5.7.0a0 - - aws-c-s3 >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-event-stream >=0.5.7,<0.5.8.0a0 - aws-c-http >=0.10.7,<0.10.8.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-auth >=0.9.3,<0.9.4.0a0 + - aws-c-s3 >=0.11.3,<0.11.4.0a0 + - aws-c-io >=0.23.3,<0.23.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 300822 - timestamp: 1763082711936 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-hffd60a0_9.conda - sha256: a58e471c09ffc63bafa4a2833a1d8f175693852763d840c446092898fa635b31 - md5: a76d9ef0a4417a6f418207b62ca3c796 + size: 302247 + timestamp: 1765200336894 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda + sha256: 3b7ee2bc2bbd41e1fca87b1c1896b2186644f20912bf89756fd39020f8461e13 + md5: 768c6b78e331a2938af208e062fd6702 depends: - libcxx >=19 - __osx >=10.13 - libcurl >=8.17.0,<9.0a0 - - aws-crt-cpp >=0.35.2,<0.35.3.0a0 + - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - libzlib >=1.3.1,<2.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-event-stream >=0.5.7,<0.5.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3313038 - timestamp: 1765199752667 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-h6446450_7.conda - sha256: 6f99e6bf3687cf53cb258e4a57878dbe008eb9e97447ece3a22aeab163f974cb - md5: d86a310ea5d7f2f6030bd7e15527b670 + size: 3313002 + timestamp: 1765257111791 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + sha256: 8a12c4f6774ecb3641048b74133ff5e6c2b560469fe5ac1d7515631b84e63059 + md5: d9b942bede589d0ad1e8e360e970efd0 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 + - aws-crt-cpp >=0.35.4,<0.35.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - libzlib >=1.3.1,<2.0a0 - - aws-crt-cpp >=0.35.2,<0.35.3.0a0 - - aws-c-common >=0.12.5,<0.12.6.0a0 - - aws-c-event-stream >=0.5.6,<0.5.7.0a0 + - aws-c-event-stream >=0.5.7,<0.5.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3438269 - timestamp: 1763211032811 + size: 3438133 + timestamp: 1765257127502 - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda sha256: 923a0f9fab0c922e17f8bb27c8210d8978111390ff4e0cf6c1adff3c1a4d13bc md5: 9f39c22aad61e76bfb73bb7d4114efac @@ -1128,22 +1425,22 @@ packages: purls: [] size: 174582 timestamp: 1761067038720 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - sha256: 0a736f04c9778b87884422ebb6b549495430652204d964ff161efb719362baee - md5: 6b5f36e610295f4f859dd9cf680bbf7d +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-ha4e89a6_0.conda + sha256: 446abd2fad0aa6b74207733534efc5e3ac4624bee981f40495cd4b8ae02d65ed + md5: 5f76a3745c0eb7021845161c9a1bfee3 depends: - __osx >=10.13 - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 432811 - timestamp: 1761080273088 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - sha256: 322919e9842ddf5c9d0286667420a76774e1e42ae0520445d65726f8a2565823 - md5: 278ccb9a3616d4342731130287c3ba79 + size: 434189 + timestamp: 1768483686754 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h2a5eb39_0.conda + sha256: b0ca0c4896fcc94ed1756a41c38fac2a95d28748ca89a90f99f6ceb8b4db0c26 + md5: 53d1b2dc90315c3b8e4ecc86966ab7bd depends: - __osx >=10.13 - azure-core-cpp >=1.16.1,<1.16.2.0a0 @@ -1154,25 +1451,25 @@ packages: license: MIT license_family: MIT purls: [] - size: 126230 - timestamp: 1761066840950 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda - sha256: 268175ab07f1917eff35e4c38a17a2b71c5f9b86e38e5c0b313da477600a82df - md5: ef5701f2da108d432e7872d58e8ac64e + size: 126024 + timestamp: 1768407197686 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-h7f37a48_0.conda + sha256: f3aabb7c5023828aba930b82046b81b87a794b0c5c8a1db82043e88b3f5ca136 + md5: 30ca75c03ba3166f44852b33f07f077c depends: - __osx >=10.13 - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 203298 - timestamp: 1761095036240 -- conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.2.0-py312hcb931b7_0.conda - sha256: 5fe811e1c582febda13afab3cf06badda62157bd851cdb6f67201da827fdbdde - md5: 5b8b4a50dae13f2d8412388ae7fa996b + size: 204696 + timestamp: 1768502627687 +- conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.3.0-py312h6917036_0.conda + sha256: 96eefe04e072e8c31fcac7d5e89c9d4a558d2565eef629cfc691a755b2fa6e59 + md5: c8b7d0fb5ff6087760dde8f5f388b135 depends: - python - __osx >=10.13 @@ -1181,21 +1478,60 @@ packages: license: BSD-3-Clause AND MIT AND EPL-2.0 purls: - pkg:pypi/backports-zstd?source=hash-mapping - size: 238407 - timestamp: 1765057706612 -- pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - name: beautifulsoup4 - version: 4.14.3 - sha256: 0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb - requires_dist: - - soupsieve>=1.6.1 - - 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' + size: 238093 + timestamp: 1767044989890 +- conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.3.0-py312h06d0912_0.conda + sha256: c9c97cd644faa6c4fb38017c5ecfd082f56a3126af5925d246364fa4a22b2a74 + md5: 2db2b356f08f19ce4309a79a9ee6b9d8 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: + - pkg:pypi/backports-zstd?source=hash-mapping + size: 236635 + timestamp: 1767045021157 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + sha256: bf1e71c3c0a5b024e44ff928225a0874fc3c3356ec1a0b6fe719108e6d1288f6 + md5: 5267bef8efea4127aacd1f4e1f149b6e + depends: + - python >=3.10 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/beautifulsoup4?source=hash-mapping + size: 90399 + timestamp: 1764520638652 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_0.conda + sha256: e03ba1a2b93fe0383c57920a9dc6b4e0c2c7972a3f214d531ed3c21dc8f8c717 + md5: b1a27250d70881943cca0dd6b4ba0956 + depends: + - python >=3.10 + - webencodings + - python + constrains: + - tinycss >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/bleach?source=hash-mapping + size: 141952 + timestamp: 1763589981635 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-h5f6438b_0.conda + sha256: f85f6b2c7938d8c20c80ce5b7e6349fafbb49294641b5648273c5f892b150768 + md5: 08a03378bc5293c6f97637323802f480 + depends: + - bleach ==6.3.0 pyhcf101f3_0 + - tinycss2 + license: Apache-2.0 AND MIT + purls: [] + size: 4386 + timestamp: 1763589981639 - conda: https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.6-hd145fbb_1.conda sha256: 876bdb1947644b4408f498ac91c61f1f4987d2c57eb47c0aba0d5ee822cd7da9 md5: 717852102c68a082992ce13a53403f9d @@ -1358,47 +1694,58 @@ packages: purls: [] size: 186122 timestamp: 1765215100384 -- conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.5-h2466b09_0.conda - sha256: b52214a0a5632a12587d8dac6323f715bcc890f884efba5a2ce01c48c64ec6dc - md5: b1f84168da1f0b76857df7e5817947a9 +- conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + sha256: 5e1e2e24ce279f77e421fcc0e5846c944a8a75f7cf6158427c7302b02984291a + md5: 7c6da34e5b6e60b414592c74582e28bf depends: - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 194147 - timestamp: 1744128507613 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - sha256: 686a13bd2d4024fc99a22c1e0e68a7356af3ed3304a8d3ff6bb56249ad4e82f0 - md5: f98fb7db808b94bc1ec5b0e62f9f1069 + size: 193550 + timestamp: 1765215100218 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda + sha256: 4ddcb01be03f85d3db9d881407fb13a673372f1b9fac9c836ea441893390e049 + md5: 84d389c9eee640dda3d26fc5335c67d8 depends: - __win license: ISC purls: [] - size: 152827 - timestamp: 1762967310929 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - sha256: b986ba796d42c9d3265602bc038f6f5264095702dd546c14bc684e60c385e773 - md5: f0991f0f84902f6b6009b4d2350a83aa + size: 147139 + timestamp: 1767500904211 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 depends: - __unix license: ISC purls: [] - size: 152432 - timestamp: 1762967197890 -- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda - sha256: 69e3870170ca767b2f82ca29854d252669dfc9aba873f7e9b629f642bad4342b - md5: 9c265afcec13eb6e844ae51b4a4b52ad + size: 146519 + timestamp: 1767500828366 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + noarch: python + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + md5: 9b347a7ec10940d3f7941ff6c460b551 depends: - - python >=3.10 - license: MIT - license_family: MIT + - cached_property >=1.5.2,<1.5.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4134 + timestamp: 1615209571450 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + md5: 576d629e47797577ab0f1b351297ef4a + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/cachetools?source=hash-mapping - size: 16751 - timestamp: 1763073377061 + - pkg:pypi/cached-property?source=hash-mapping + size: 11065 + timestamp: 1615209567874 - conda: https://conda.anaconda.org/conda-forge/osx-64/catalogue-2.0.10-py312hb401068_2.conda sha256: 48d93c68f5aeb9c2c5f1ba79dd0745d43d9833416289f6caaae5d12598534c0d md5: ecc0d5cbe8917f344cbd0888636d2def @@ -1423,16 +1770,16 @@ packages: - pkg:pypi/catalogue?source=hash-mapping size: 43293 timestamp: 1756302042645 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - sha256: 083a2bdad892ccf02b352ecab38ee86c3e610ba9a4b11b073ea769d55a115d32 - md5: 96a02a5c1a65470a7e4eedb644c872fd +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda + sha256: 110338066d194a715947808611b763857c15458f8b3b97197387356844af9450 + md5: eacc711330cd46939f66cd401ff9c44b depends: - python >=3.10 license: ISC purls: - pkg:pypi/certifi?source=compressed-mapping - size: 157131 - timestamp: 1762976260320 + size: 150969 + timestamp: 1767500900768 - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py312he90777b_1.conda sha256: e2888785e50ef99c63c29fb3cfbfb44cdd50b3bb7cd5f8225155e362c391936f md5: cf70c8244e7ceda7e00b1881ad7697a9 @@ -1507,6 +1854,18 @@ packages: - pkg:pypi/click?source=hash-mapping size: 96620 timestamp: 1764518654675 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_1.conda + sha256: cb7279eecddbd35ea78fd0e189a9a7db8b84c2c0e3b1271cf26251615f75dc4d + md5: 7cd83dd6831b61ad9624a694e4afd7dc + depends: + - click + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click-default-group?source=hash-mapping + size: 10124 + timestamp: 1734029586298 - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpathlib-0.23.0-pyhd8ed1ab_0.conda sha256: 2e188a1c4c89a2ebe7b81935bc7d34cd892c5d9f590ba3af3f20de812d7d97bd md5: fa372d1e52f3247f758cdbd517a4047d @@ -1531,9 +1890,9 @@ packages: - pkg:pypi/cloudpickle?source=compressed-mapping size: 27353 timestamp: 1765303462831 -- conda: https://conda.anaconda.org/conda-forge/noarch/cmudict-1.1.2-pyhcf101f3_0.conda - sha256: 0119659c60a9ac8271304b9f04b05d2c3988d8a506954648687879fc83bc44ad - md5: 968ae2cbe437c38fa8664584aff8556b +- conda: https://conda.anaconda.org/conda-forge/noarch/cmudict-1.1.3-pyhcf101f3_0.conda + sha256: f359feab1dd301d304aa49d800f38168b64eeb1f516292815066e8a09f5d5df7 + md5: 6c57df8cb6c64babd463b5b2e8779e06 depends: - python >=3.10,<4.0 - importlib-metadata >=5 @@ -1543,8 +1902,8 @@ packages: license_family: GPL purls: - pkg:pypi/cmudict?source=hash-mapping - size: 932117 - timestamp: 1762728563248 + size: 932021 + timestamp: 1767469484322 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -1556,6 +1915,18 @@ packages: - 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/noarch/confection-0.1.5-pyhecae5ae_0.conda sha256: caeecf2eeb268b64830156d2ab58eb6419514e1f1ab4250d6995a6eccdf8ec7c md5: cb7c903ea9e763e1e026d8633ae81964 @@ -1570,37 +1941,48 @@ packages: - pkg:pypi/confection?source=hash-mapping size: 37405 timestamp: 1740630763363 -- conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py312hd099df3_3.conda - sha256: a317f6d5c8d574656665907fa5bf9ca1017ef132a988c6d126f2121d7817e4ec - md5: 83036bb23aad87b7256d7ae13d1fdb89 +- conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.3-py312hb0c38da_4.conda + sha256: 6c03943009b07c6deb3a64afa094b6ca694062b58127a4da6f656a13d508c340 + md5: 625f08687ba33cc9e57865e7bf8e8123 depends: + - numpy >=1.25 + - python - __osx >=10.13 - libcxx >=19 - - numpy >=1.25 - - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/contourpy?source=hash-mapping - size: 269184 - timestamp: 1762525977233 -- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312hf90b1b7_3.conda - sha256: 735847f474ffbef028e2bac81c786f46b2498d422b834b799f50e30d95730b37 - md5: 9dabe26ca46b845b669408109975b922 + size: 298198 + timestamp: 1769156053873 +- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py312h78d62e6_4.conda + sha256: 5f0dd3a4243e8293acc40abf3b11bcb23401268a1ef2ed3bce4d5a060383c1da + md5: 475bd41a63e613f2f2a2764cd1cd3b25 depends: - numpy >=1.25 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 + - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/contourpy?source=hash-mapping - size: 224936 - timestamp: 1762525927186 + size: 244035 + timestamp: 1769155978578 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_1.conda + noarch: generic + sha256: b88c76a6d6b45378552ccfd9e88b2a073161fe83fd1294c8fa103ffd32f7934a + md5: 99d689ccc1a360639eec979fd7805be9 + depends: + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 45767 + timestamp: 1761175217281 - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-46.0.3-py312heb31a8c_1.conda sha256: 699ecf64e9063ede65956cf5c8138c8f34194b22f2417515f6cfe32d3f0e0a00 md5: 3d055072c43c46fbce57662072fe68ec @@ -1635,13 +2017,13 @@ packages: - pkg:pypi/cryptography?source=hash-mapping size: 1482597 timestamp: 1764805365967 -- conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.17.0-h7dd4100_1.conda - sha256: 2dae6ecc7095824880a62411e52d73830a3d3e02ecb0ad08f8901001daf26cf5 - md5: 00c9afdfe7efc4e91252d1e92a5561ef +- conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.18.0-h9348e2b_0.conda + sha256: 833492b998f441ea1e81cbba5e88a7a05f3c6881b03444dd527248b606278668 + md5: d4e526c62dedf231b5b9c7200bcf1ce6 depends: - __osx >=10.13 - krb5 >=1.21.3,<1.22.0a0 - - libcurl 8.17.0 h7dd4100_1 + - libcurl 8.18.0 h9348e2b_0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.4,<4.0a0 @@ -1649,14 +2031,14 @@ packages: license: curl license_family: MIT purls: [] - size: 177191 - timestamp: 1765379694502 -- conda: https://conda.anaconda.org/conda-forge/win-64/curl-8.17.0-h43ecb02_0.conda - sha256: 42fce6142fc47a3fa6498f9072f85619f3b94095ead18ac906ef2041bae359d0 - md5: c8ce2f4c98f961b65dfc92a217a67a7d + size: 179519 + timestamp: 1767822264822 +- conda: https://conda.anaconda.org/conda-forge/win-64/curl-8.18.0-h43ecb02_0.conda + sha256: 864b6de0a7e23abe273d1164a600486413b31502e99ae4fce77ea6c46832c3cd + md5: 2a26c0d3fcb56232c577c113bbc02ea9 depends: - krb5 >=1.21.3,<1.22.0a0 - - libcurl 8.17.0 h43ecb02_0 + - libcurl 8.18.0 h43ecb02_0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 @@ -1665,8 +2047,8 @@ packages: license: curl license_family: MIT purls: [] - size: 181488 - timestamp: 1762333990679 + size: 183318 + timestamp: 1767821999612 - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 md5: 4c2a8fef270f6c69591889b93f9f55c1 @@ -1676,7 +2058,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/cycler?source=compressed-mapping + - pkg:pypi/cycler?source=hash-mapping size: 14778 timestamp: 1764466758386 - conda: https://conda.anaconda.org/conda-forge/osx-64/cykhash-2.0.1-py312h69bf00f_3.conda @@ -1708,9 +2090,9 @@ packages: - pkg:pypi/cykhash?source=hash-mapping size: 356427 timestamp: 1762165985465 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cymem-2.0.13-py312h69bf00f_0.conda - sha256: 090468549eab67531a98749296018bab40f2f7a2eab1c14d4dd7511b85f63b5a - md5: 7af866e06db45b3a81a8730db773f9e4 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cymem-2.0.13-py312h11f4fa3_1.conda + sha256: 0e209ac09cf69e904526b694753403d23bb698202d79ed0095f64209b58d0561 + md5: f7e7bf596b7061bdedee6b8f5be7fc2e depends: - __osx >=10.13 - libcxx >=19 @@ -1720,11 +2102,11 @@ packages: license_family: MIT purls: - pkg:pypi/cymem?source=hash-mapping - size: 47502 - timestamp: 1763189195389 -- conda: https://conda.anaconda.org/conda-forge/win-64/cymem-2.0.13-py312hbb81ca0_0.conda - sha256: 82ff8606752c77b4ae58b4763699962e4959faa588567cf226f6c9cbd5c13189 - md5: b29407fcdb6e81d95bf828f6f99ceed5 + size: 47540 + timestamp: 1768534201070 +- conda: https://conda.anaconda.org/conda-forge/win-64/cymem-2.0.13-py312hbb81ca0_1.conda + sha256: 3bab0fc28e0c6522a30bb1758eed205f36bf1195d0cdf5137ca8382a0b402aee + md5: b05a1d334e3659761905fe14cedd16c3 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -1735,11 +2117,11 @@ packages: license_family: MIT purls: - pkg:pypi/cymem?source=hash-mapping - size: 44763 - timestamp: 1763189105007 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.2.2-py312h33b39b6_0.conda - sha256: 624086f2cbd741563c3e04c809c6d58b320d9044910dd7ef3d2d744401d5dce8 - md5: 4b7cacce78c222b352e722992c57ccdf + size: 44877 + timestamp: 1768533877406 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cython-3.2.4-py312h84c01df_0.conda + sha256: 5db7877826ffa0f83d5987382af2845a6e812df068efb3700c1b771e7484baef + md5: 7c5f0ac24777a4f593014808f409ea55 depends: - __osx >=10.13 - libcxx >=19 @@ -1749,11 +2131,11 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3490314 - timestamp: 1764543314826 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.2-py312hd245ac3_0.conda - sha256: fc1761dda16220e2c838f828670690c31836e5ec390df596febd8c79ebc40063 - md5: 3171fcbc77a315f3b4b56d63d7d543fa + size: 3485945 + timestamp: 1767577212487 +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py312hd245ac3_0.conda + sha256: 68e921fad16accb32e86c7c73abaea7d49c9346e078924d0a593f821672a5a0c + md5: 575ebca0d973015c21087b800bc48515 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -1764,8 +2146,8 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3275066 - timestamp: 1764543333310 + size: 3285032 + timestamp: 1767577225362 - conda: https://conda.anaconda.org/conda-forge/osx-64/cython-blis-1.3.3-py312hfed6dc8_0.conda sha256: eb0ca974f77ea4c88ffcf80dd7f61e05d758e4e31172f8c75726cfa8b27b385e md5: ce977db4f4c396dfc4389d2e8d1c79a4 @@ -1796,6 +2178,35 @@ packages: - pkg:pypi/blis?source=hash-mapping size: 3308236 timestamp: 1763428324689 +- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.19-py312h6c02384_0.conda + sha256: ce1ca3e92f5879a3644fa14f584f1ca826c464bdeae622a484776b0353affb14 + md5: d977af0b04dcbb6bf264a54a8c8bcea1 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2762312 + timestamp: 1765840820960 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.19-py312ha1a9051_0.conda + sha256: b885ff2eb9d7ac4d59620ae30f0fd721ca67dafe69f3301a3e14303b80e22350 + md5: 1f0c0be0cf4893e17e71a023865c7230 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 3995535 + timestamp: 1765840830814 - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 md5: 9ce473d1d1be1cc3810856a48b3fab32 @@ -1818,9 +2229,20 @@ packages: - pypdf>=3.3.0,<4.0.0 ; extra == 'pdf' - requests>=2.23.0,<3.0.0 requires_python: '>=3.7,<4.0' -- conda: https://conda.anaconda.org/conda-forge/noarch/django-6.0-pyhd8ed1ab_0.conda - sha256: 294cabe11055830f51d48210155dd1ed8ac8f93051642139d91c7109dd87d3eb - md5: 01c889edf46f3476203eb8faa4e55c22 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 + depends: + - python >=3.6 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/defusedxml?source=hash-mapping + size: 24062 + timestamp: 1615232388757 +- conda: https://conda.anaconda.org/conda-forge/noarch/django-6.0.1-pyhd8ed1ab_0.conda + sha256: 11444d914bf5ad10a27a436876b7807533a659b51c98fcd5969e946cde987c41 + md5: 571421da6611aa81c12629558bb85090 depends: - asgiref >=3.9.1 - python >=3.12 @@ -1829,8 +2251,30 @@ packages: license_family: BSD purls: - pkg:pypi/django?source=hash-mapping - size: 3853807 - timestamp: 1764783863413 + size: 3854180 + timestamp: 1767812906103 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab + depends: + - python >=3.10 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=compressed-mapping + size: 21333 + timestamp: 1763918099466 +- 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/noarch/folium-0.20.0-pyhd8ed1ab_0.conda sha256: 782fa186d7677fd3bc1ff7adb4cc3585f7d2c7177c30bcbce21f8c177135c520 md5: a6997a7dcd6673c0692c61dfeaea14ab @@ -1847,38 +2291,52 @@ packages: - pkg:pypi/folium?source=hash-mapping size: 82665 timestamp: 1750113928159 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.0-pyh7db6752_0.conda - sha256: dea661749b53d5ea7a28d3aa88bb2f60de884dd0ca27ba5e474246f5d4049c91 - md5: 2ae6c63938d6dd000e940673df75419c +- conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.61.1-py312hacf3034_0.conda + sha256: f01c62330a693e05b6938ffbf3b930197c4e9ba73659c36bb8ee74c799ec840d + md5: 277eb1146255b637cac845cc6bc8fb6b depends: + - __osx >=10.13 - brotli - munkres - - python >=3.10 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 - unicodedata2 >=15.1.0 - track_features: - - fonttools_no_compile license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping - size: 829871 - timestamp: 1764352874210 -- conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.61.0-py312hacf3034_0.conda - sha256: 4c51486b2bf0603ece1f5f4a75fcca52b57ff9cc17acce1d336d671c0302a672 - md5: c0ef09bd6313da425e3b7700ce9858bc + size: 2879894 + timestamp: 1765632981375 +- conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.61.1-py312h05f76fc_0.conda + sha256: 49df76416b253429ea7ff907e03215f2bb1450c03908b7e413a8bdd85154eded + md5: 449a1487319070f736382d2b53bb5aec depends: - - __osx >=10.13 - brotli - munkres - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 - unicodedata2 >=15.1.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping - size: 2879146 - timestamp: 1764353535292 + size: 2507764 + timestamp: 1765632999063 +- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 + md5: d3549fd50d450b6d9e7dddff25dd2110 + depends: + - cached-property >=1.3.0 + - python >=3.9,<4 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/fqdn?source=hash-mapping + size: 16705 + timestamp: 1733327494780 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda sha256: 9f8282510db291496e89618fc66a58a1124fe7a6276fbd57ed18c602ce2576e9 md5: ca641fdf8b7803f4b7212b6d66375930 @@ -1927,19 +2385,6 @@ packages: purls: [] size: 77528 timestamp: 1734015193826 -- conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.7.0-pyhf298e5d_0.conda - sha256: d065c6c76ba07c148b07102f89fd14e39e4f0b2c022ad671bbef8fda9431ba1b - md5: 3998c9592e3db2f6809e4585280415f4 - depends: - - python >=3.9 - track_features: - - frozenlist_no_compile - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/frozenlist?source=hash-mapping - size: 18952 - timestamp: 1752167260183 - conda: https://conda.anaconda.org/conda-forge/osx-64/frozenlist-1.7.0-py312h18bfd43_0.conda sha256: 33a8bc7384594da4ce9148a597215dc28517d11fa41e1fac14326abab1e55206 md5: d1e9b9b950051516742a6719489e98c6 @@ -1954,10 +2399,25 @@ packages: - pkg:pypi/frozenlist?source=hash-mapping size: 51802 timestamp: 1752167396364 -- pypi: https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl - name: ftfy - version: 6.3.1 - sha256: 7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083 +- conda: https://conda.anaconda.org/conda-forge/win-64/frozenlist-1.7.0-py312hfdf67e6_0.conda + sha256: 804ebdfe1c49a31e275c8aaced937f96b794ad5ff228685349a13d450753d253 + md5: 854caa541146c1c42d64c19fd63cbac9 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/frozenlist?source=hash-mapping + size: 49472 + timestamp: 1752167442686 +- pypi: https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl + name: ftfy + version: 6.3.1 + sha256: 7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083 requires_dist: - wcwidth requires_python: '>=3.9' @@ -1972,13 +2432,13 @@ packages: - pkg:pypi/future?source=hash-mapping size: 364561 timestamp: 1738926525117 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.12.0-py312h06e505a_2.conda - sha256: 5ce56b70d109450c071f0a143fde5fdacfede3f27d81205abdf9390a0b4dbe5c - md5: c4bf16bc699c42a5f5f6c1ff34b2c861 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.12.1-py312h1870424_0.conda + sha256: 70b455684c2e150352a7727b10cef3e7b08ff242d74794350ebe5d4b42529942 + md5: ea4fde227e680bca2da2829cf7be7190 depends: - __osx >=10.13 - libcxx >=19 - - libgdal-core 3.12.0.* + - libgdal-core 3.12.1.* - numpy >=1.23,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -1986,13 +2446,13 @@ packages: license_family: MIT purls: - pkg:pypi/gdal?source=hash-mapping - size: 1840046 - timestamp: 1764692243093 -- conda: https://conda.anaconda.org/conda-forge/win-64/gdal-3.12.0-py312h07de9ea_2.conda - sha256: 79ca735f14dcff846a7fcac96c07fc3900d158010020014781cd0c44eb28f67e - md5: 639bbbdcf7b2453be081ef2b93f5f586 + size: 1842273 + timestamp: 1766094029619 +- conda: https://conda.anaconda.org/conda-forge/win-64/gdal-3.12.1-py312h07de9ea_0.conda + sha256: 4cb42cf5ca0f118f8752e126a7c1d56cc4cc37a76bffd2316124be47421f2ed7 + md5: cc1d78a2bb4208842a7b8ab053db8d60 depends: - - libgdal-core 3.12.0.* + - libgdal-core 3.12.1.* - numpy >=1.23,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -2000,10 +2460,11 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: MIT + license_family: MIT purls: - pkg:pypi/gdal?source=hash-mapping - size: 1742467 - timestamp: 1764691223925 + size: 1748026 + timestamp: 1766096923975 - conda: https://conda.anaconda.org/conda-forge/noarch/geocoder-1.38.1-pyhd8ed1ab_2.conda sha256: 511a9b497e8223bd82f6d32dbe8ec927fd52ade733cb5dd7f3ff0da90a6f788f md5: 3917f836b57dae32f167ae2c4c63158a @@ -2034,12 +2495,12 @@ packages: - pkg:pypi/geoip2?source=hash-mapping size: 27835 timestamp: 1717516398787 -- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.1-pyhd8ed1ab_1.conda - sha256: aa378cf3a8c557f71e0390961e7ee2ea5b213b5ab87fee2d03016e265271604e - md5: 99baf7d3c98e77f22972757af7e774f8 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda + sha256: 7c3e5dc62c0b3d067a6f517ea9176e9d52682499d4afb78704354a60f37c5444 + md5: 3b9d40bef27d094e48bb1a821e86a252 depends: - folium - - geopandas-base 1.1.1 pyha770c72_1 + - geopandas-base 1.1.2 pyha770c72_0 - mapclassify >=2.5.0 - matplotlib-base - pyogrio >=0.7.2 @@ -2049,11 +2510,11 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 8381 - timestamp: 1759763365542 -- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.1-pyha770c72_1.conda - sha256: 383f9003eb65158ef767e23a748b7bf5c7d91859bbd126accacbb02a33154f61 - md5: 23e25e079cd0108ec9cbae779ef4b685 + size: 8454 + timestamp: 1766475276498 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + sha256: e907715daf3b312a12d124744abe9644540f104832055b58edcf0c19eb4c45c0 + md5: ca79e96c1fd39ab6d12c8f99968111b1 depends: - numpy >=1.24 - packaging @@ -2064,8 +2525,8 @@ packages: license_family: BSD purls: - pkg:pypi/geopandas?source=hash-mapping - size: 250856 - timestamp: 1759763364111 + size: 254151 + timestamp: 1766475275483 - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda sha256: 4d95fd55a9e649620b4e50ddafff064c4ec52d87e1ed64aa4cad13e643b32baf md5: d83030a79ce1276edc2332c1730efa17 @@ -2118,9 +2579,9 @@ packages: purls: [] size: 117017 timestamp: 1718284325443 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.28.1-pyhd8ed1ab_0.conda - sha256: 3dde5af0fdafae40315c278cd63ed531282f651868b1cb259d96234bc138dce0 - md5: 4f543962961d34db6b5c72ebe827caf7 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.29.0-pyhd8ed1ab_0.conda + sha256: 0f696294c9a117a16e344388347dd9dff644cd8ddb703002169d81f889c176df + md5: 7fd8158ff94ccf28a2ac1f534989d698 depends: - google-auth >=2.14.1,<3.0.0 - googleapis-common-protos >=1.56.2,<2.0.0 @@ -2132,74 +2593,76 @@ packages: license_family: APACHE purls: - pkg:pypi/google-api-core?source=hash-mapping - size: 98155 - timestamp: 1761990483177 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.28.1-pyhd8ed1ab_0.conda - sha256: ae2925cda30dc6400320b890f29dbbcbf8a69ad736dd5d6d833b65a72ec0466a - md5: a08eaed0b8ca28f4bff91930afec1002 + size: 98400 + timestamp: 1768122057220 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-grpc-2.29.0-pyhd8ed1ab_0.conda + sha256: d2216b7e2f0c8ad75dfcae96ac93623a51d8c7b5d3b7e8a7434eb5579a4d2f4e + md5: 5f65c34dc751a847a4872bf506346fa2 depends: - - google-api-core 2.28.1 pyhd8ed1ab_0 + - google-api-core 2.29.0 pyhd8ed1ab_0 - grpcio >=1.49.1,<2.0.0 - grpcio-status >=1.49.1,<2.0.0 - python >=3.10,<3.14 license: Apache-2.0 license_family: APACHE purls: [] - size: 7075 - timestamp: 1761990490688 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.43.0-pyhd8ed1ab_0.conda - sha256: 35fa2eec3fb90ee1c6c2989579f586b4243ff2a0a0dabaeae12fe7c142d44fe7 - md5: 5b33d9974cab063dcf39e8671ddee1c1 + size: 7236 + timestamp: 1768122069921 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.47.0-pyhcf101f3_0.conda + sha256: 04ebcd67144d9e554c32bf585b7a4bf70be41a30ba72b415132c3b203549c197 + md5: fa0d1dbb4ae73ca3636fe64ed0632a42 depends: - - aiohttp >=3.6.2,<4.0.0 - - cachetools >=2.0.0,<7.0 - - cryptography >=38.0.3 + - python >=3.10 - pyasn1-modules >=0.2.1 + - rsa >=3.1.4,<5 + - aiohttp >=3.6.2,<4.0.0 + - requests >=2.20.0,<3.0.0 - pyopenssl >=20.0.0 - - python >=3.10 + - cryptography >=38.0.3 - pyu2f >=0.1.5 - - requests >=2.20.0,<3.0.0 - - rsa >=3.1.4,<5 + - python license: Apache-2.0 - license_family: Apache + license_family: APACHE purls: - - pkg:pypi/google-auth?source=hash-mapping - size: 124222 - timestamp: 1762419588179 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhd8ed1ab_0.conda - sha256: a555b95ad2fed59a382da096bd23ece580ce240383f59917599f1c142acad8fc - md5: 862b63f7548be0c97e9c6f4f85959189 + - pkg:pypi/google-auth?source=compressed-mapping + size: 141076 + timestamp: 1767775649306 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.5.0-pyhcf101f3_1.conda + sha256: fcef1d51f6de304a23c19ea6b3114dcab9ce54482d9f506f9a3e0b48be514744 + md5: 48fcccc0b579087018df0afc332b8bd6 depends: + - python >=3.10,<3.14 - google-api-core >=1.31.6,<3.0.0,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0 - google-auth >=1.25.0,<3.0.0 - grpcio >=1.38.0,<2.0.0 - grpcio-status >=1.38.0,<2.0.0 - - python >=3.10,<3.14 + - python license: Apache-2.0 - license_family: Apache + license_family: APACHE purls: - pkg:pypi/google-cloud-core?source=hash-mapping - size: 28892 - timestamp: 1761989216405 -- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-translate-3.23.0-pyhd8ed1ab_0.conda - sha256: e82b639bae75e6b11c4ddd3701719f584139f4e176e9fe1e300aba75a51ed2a6 - md5: d110d4a975029db18b0a1077f586324d + size: 33593 + timestamp: 1768561863777 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-translate-3.24.0-pyhcf101f3_0.conda + sha256: b2a27e8c4b0cdd1e4c1d8ebab18c90bfe59f0ead8c475740eb0edd2980c932af + md5: 757896e23bfeb9f26e0f5ca29ae29185 depends: + - python >=3.10,<3.14 - google-api-core >=1.34.1,<3.0.0,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.* - google-api-core-grpc - google-auth >=2.14.1,<3.0.0,!=2.24.0,!=2.25.0 - google-cloud-core >=1.4.4,<3.0.0 - - grpc-google-iam-v1 >=0.14.0,<1.0.0 - grpcio >=1.33.2,<2.0.0 - proto-plus >=1.25.0,<2.0.0 - protobuf >=3.20.2,<7.0.0,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 - - python >=3.10,<3.14 + - grpc-google-iam-v1 >=0.14.0,<1.0.0 + - python license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/google-cloud-translate?source=hash-mapping - size: 86452 - timestamp: 1762522211754 + size: 97478 + timestamp: 1768729024015 - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.72.0-pyhd8ed1ab_0.conda sha256: c09ba4b360a0994430d2fe4a230aa6518cd3e6bfdc51a7af9d35d35a25908bb5 md5: 003094932fb90de018f77a273b8a509b @@ -2224,21 +2687,22 @@ packages: purls: [] size: 15254 timestamp: 1762522301108 -- conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.3-pyhd8ed1ab_0.conda - sha256: d87ec64567d0462f085ce70fdc093fda870f01b6b72e214dd12054dffda9c3c8 - md5: 5d88d3c05ee8b78f96c6f60687e1b5bb +- conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.3-pyhcf101f3_1.conda + sha256: 5649ec4fb9c0240806b4a080899ec5ce42b90692f01b111c88ac81a586773711 + md5: 2f307997162d8b75d4eb9d86c5c36fbe depends: + - python >=3.10 + - grpcio >=1.44.0,<2.0.0 - googleapis-common-protos >=1.56.0,<2.0.0 - googleapis-common-protos-grpc - - grpcio >=1.44.0,<2.0.0 - protobuf >=3.20.2,<7.0.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 - - python >=3.10 + - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/grpc-google-iam-v1?source=hash-mapping - size: 26850 - timestamp: 1760569033919 + - pkg:pypi/grpc-google-iam-v1?source=compressed-mapping + size: 31398 + timestamp: 1768564357665 - conda: https://conda.anaconda.org/conda-forge/osx-64/grpcio-1.73.1-py312h53eab48_1.conda sha256: a751ba0ed00f9306d852111e749ee23c7ae7309cc05716ad6f1bce2bf9db2912 md5: 94f0b7eefe8e878d70560f54a38b539c @@ -2297,7 +2761,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/h2?source=compressed-mapping + - pkg:pypi/h2?source=hash-mapping size: 95967 timestamp: 1756364871835 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -2322,16 +2786,28 @@ packages: - pkg:pypi/hyperframe?source=hash-mapping size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - sha256: 2e64307532f482a0929412976c8450c719d558ba20c0962832132fd0d07ba7a7 - md5: d68d48a3060eb5abdc1cdc8e2a3a5966 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda + sha256: f3066beae7fe3002f09c8a412cdf1819f49a2c9a485f720ec11664330cf9f1fe + md5: 30334add4de016489b731c6662511684 depends: - __osx >=10.13 license: MIT license_family: MIT purls: [] - size: 11761697 - timestamp: 1720853679409 + size: 12263724 + timestamp: 1767970604977 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda + sha256: 5a41fb28971342e293769fc968b3414253a2f8d9e30ed7c31517a15b4887246a + md5: 0ee3bb487600d5e71ab7d28951b2016a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 13222158 + timestamp: 1767970128854 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -2395,6 +2871,143 @@ packages: - pyparsing - ioc-fanger - click +- 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/ipython-9.9.0-pyh53cf698_0.conda + sha256: 4ff1733c59b72cf0c8ed9ddb6e948e99fc6b79b76989282c0c7a46aab56e6176 + md5: 8481978caa2f108e6ddbf8008a345546 + 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=compressed-mapping + size: 646242 + timestamp: 1767621166614 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyhe2676ad_0.conda + sha256: 1697fae5859f61938ab44af38126115ad18fc059462bb370c5f8740d7bc4a803 + md5: fe785355648dec69d2f06fa14c9e6e84 + 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=compressed-mapping + size: 645119 + timestamp: 1767621201570 +- 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/isoduration-20.11.0-pyhd8ed1ab_1.conda + sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed + md5: 0b0154421989637d424ccf0f104be51a + depends: + - arrow >=0.15.0 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/isoduration?source=hash-mapping + size: 19832 + timestamp: 1733493720346 +- 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-pyhcf101f3_1.conda sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b md5: 04558c96691bed63104678757beb4f8d @@ -2408,9 +3021,9 @@ packages: - pkg:pypi/jinja2?source=compressed-mapping size: 120685 timestamp: 1764517220861 -- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.2-pyhd8ed1ab_0.conda - sha256: 6fc414c5ae7289739c2ba75ff569b79f72e38991d61eb67426a8a4b92f90462c - md5: 4e717929cfa0d49cef92d911e31d0e90 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + sha256: 301539229d7be6420c084490b8145583291123f0ce6b92f56be5948a2c83a379 + md5: 615de2a4d97af50c350e5cf160149e77 depends: - python >=3.10 - setuptools @@ -2418,8 +3031,8 @@ packages: license_family: BSD purls: - pkg:pypi/joblib?source=hash-mapping - size: 224671 - timestamp: 1756321850584 + size: 226448 + timestamp: 1765794135253 - conda: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda sha256: b58f8002318d6b880a98e1b0aa943789b3b0f49334a3bdb9c19b463a0b799cad md5: 2c5a3c42de607dda0cfa0edd541fd279 @@ -2430,6 +3043,196 @@ packages: purls: [] size: 71514 timestamp: 1726487153769 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + sha256: 1a1328476d14dfa8b84dbacb7f7cd7051c175498406dc513ca6c679dc44f3981 + md5: cd2214824e36b0180141d422aba01938 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jsonpointer?source=hash-mapping + size: 13967 + timestamp: 1765026384757 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 + md5: ada41c863af263cc4c5fcbaff7c3e4dc + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.10 + - referencing >=0.28.4 + - rpds-py >=0.25.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema?source=compressed-mapping + size: 82356 + timestamp: 1767839954256 +- 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/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + sha256: 6886fc61e4e4edd38fd38729976b134e8bd2143f7fce56cc80d7ac7bac99bce1 + md5: 8368d58342d0825f0843dc6acdd0c483 + depends: + - jsonschema >=4.26.0,<4.26.1.0a0 + - fqdn + - idna + - isoduration + - jsonpointer >1.13 + - rfc3339-validator + - rfc3986-validator >0.1.0 + - rfc3987-syntax >=1.1.0 + - uri-template + - webcolors >=24.6.0 + license: MIT + license_family: MIT + purls: [] + size: 4740 + timestamp: 1767839954258 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + sha256: e402bd119720862a33229624ec23645916a7d47f30e1711a4af9e005162b84f3 + md5: 8a3d6d0523f66cf004e563a50d9392b3 + depends: + - jupyter_core >=5.1 + - python >=3.10 + - python-dateutil >=2.8.2 + - pyzmq >=25.0 + - tornado >=6.4.1 + - traitlets >=5.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=compressed-mapping + size: 112785 + timestamp: 1767954655912 +- 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/noarch/jupyter_events-0.12.0-pyh29332c3_0.conda + sha256: 37e6ac3ccf7afcc730c3b93cb91a13b9ae827fd306f35dd28f958a74a14878b5 + md5: f56000b36f09ab7533877e695e4e8cb0 + depends: + - jsonschema-with-format-nongpl >=4.18.0 + - packaging + - python >=3.9 + - python-json-logger >=2.0.4 + - pyyaml >=5.3 + - referencing + - rfc3339-validator + - rfc3986-validator >=0.1.1 + - traitlets >=5.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-events?source=hash-mapping + size: 23647 + timestamp: 1738765986736 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + sha256: 74c4e642be97c538dae1895f7052599dfd740d8bd251f727bce6453ce8d6cd9a + md5: d79a87dcfa726bcea8e61275feed6f83 + depends: + - anyio >=3.1.0 + - argon2-cffi >=21.1 + - jinja2 >=3.0.3 + - jupyter_client >=7.4.4 + - jupyter_core >=4.12,!=5.0.* + - jupyter_events >=0.11.0 + - jupyter_server_terminals >=0.4.4 + - nbconvert-core >=6.4.4 + - nbformat >=5.3.0 + - overrides >=5.0 + - packaging >=22.0 + - prometheus_client >=0.9 + - python >=3.10 + - pyzmq >=24 + - send2trash >=1.8.2 + - terminado >=0.8.3 + - tornado >=6.2.0 + - traitlets >=5.6.0 + - websocket-client >=1.7 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-server?source=hash-mapping + size: 347094 + timestamp: 1755870522134 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654 + md5: 7b8bace4943e0dc345fc45938826f2b8 + depends: + - python >=3.10 + - terminado >=0.8.3 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-server-terminals?source=compressed-mapping + size: 22052 + timestamp: 1768574057200 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 + constrains: + - jupyterlab >=4.0.8,<5.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-pygments?source=hash-mapping + size: 18711 + timestamp: 1733328194037 - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py312h90e26e8_2.conda sha256: 9e4e940969e6765bd2a13c76e131bcb02b8930a3c78adec0dbe83a8494b40a52 md5: b85c7204ae22668690eb1e95640202c4 @@ -2489,32 +3292,43 @@ packages: purls: [] size: 712034 timestamp: 1719463874284 -- conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda - sha256: bcb81543e49ff23e18dea79ef322ab44b8189fb11141b1af99d058503233a5fc - md5: bf210d0c63f2afb9e414a858b79f0eaa +- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699 + md5: 9b965c999135d43a3d0f7bd7d024e26a + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/lark?source=compressed-mapping + size: 94312 + timestamp: 1761596921009 +- conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda + sha256: 3ec16c491425999a8461e1b7c98558060a4645a20cf4c9ac966103c724008cc2 + md5: 753acc10c7277f953f168890e5397c80 depends: - __osx >=10.13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT purls: [] - size: 226001 - timestamp: 1739161050843 -- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda - sha256: 7712eab5f1a35ca3ea6db48ead49e0d6ac7f96f8560da8023e61b3dbe4f3b25d - md5: 3538827f77b82a837fa681a4579e37a1 + size: 226870 + timestamp: 1768184917403 +- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.18-hf2c6c5f_0.conda + sha256: 7eeb18c5c86db146b62da66d9e8b0e753a52987f9134a494309588bbeceddf28 + md5: b6c68d6b829b044cd17a41e0a8a23ca1 depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 510641 - timestamp: 1739161381270 + size: 522238 + timestamp: 1768184858107 - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda sha256: cc1f1d7c30aa29da4474ec84026ec1032a8df1d7ec93f4af3b98bb793d01184e md5: 21f765ced1a0ef4070df53cb425e1967 @@ -2567,9 +3381,9 @@ packages: purls: [] size: 1615210 timestamp: 1750194549591 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.2-gpl_h889603c_100.conda - sha256: b3ebced2a683cf4c4f1529676f60a80d6dcea11bc50cee137aadfe09a75f551a - md5: 7520a1a2a186da7ade597f8fdf72a168 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda + sha256: 635b37726c865439b93f7887994eedde33f00ad4b715e286ba3634e39fbca690 + md5: bfb9152520db0958801b3c87846c942b depends: - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 @@ -2585,11 +3399,11 @@ packages: license: BSD-2-Clause license_family: BSD purls: [] - size: 760450 - timestamp: 1760611183190 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.2-gpl_h26aea39_100.conda - sha256: 23b9bcba5e01fe756eb9aef875ba0237377401489b0238da871ba00ccaad6a95 - md5: ce09b133aaadd32f18a809260ac5c2c8 + size: 759895 + timestamp: 1767630938323 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda + sha256: f56df319078c67a46548c16f77cff0a4c60ab763fd98ffa64313a47a43c285e4 + md5: 8bb7102705dba973b3930c4b6094b257 depends: - bzip2 >=1.0.8,<2.0a0 - liblzma >=5.8.1,<6.0a0 @@ -2606,51 +3420,48 @@ packages: license: BSD-2-Clause license_family: BSD purls: [] - size: 1107182 - timestamp: 1760611163870 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-hd1700fa_4_cpu.conda - build_number: 4 - sha256: 82d764b803ed198123c77ec954770deec0e477e003d3d906eb8eda5260f88e24 - md5: 9c95de09ac58d37d8cfbaa54b7174ee5 + size: 1106553 + timestamp: 1767630802450 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-23.0.0-h8071b21_0_cpu.conda + sha256: c2515297e108a07154a718b4767b7f239b5e827c5afa503b47bdb49617e9226d + md5: 65956d60494884c45e3f0952de391e08 depends: - __osx >=11.0 - - aws-crt-cpp >=0.35.2,<0.35.3.0a0 + - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - azure-core-cpp >=1.16.1,<1.16.2.0a0 - azure-identity-cpp >=1.13.2,<1.13.3.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-files-datalake-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - - libcxx >=19 + - libcxx >=21 - libgoogle-cloud >=2.39.0,<2.40.0a0 - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.2.1,<2.2.2.0a0 + - orc >=2.2.2,<2.2.3.0a0 - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - apache-arrow-proc =*=cpu - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu - arrow-cpp <0.0a0 license: Apache-2.0 - license_family: APACHE purls: [] - size: 4266919 - timestamp: 1763229988804 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h117da51_4_cpu.conda - build_number: 4 - sha256: 85139df2ffdee12e5cd6b53da886ce6b3dca276935e8f5866d9806cce0d24363 - md5: f84b0ac3486f3949104ac3f343634877 + size: 4362941 + timestamp: 1769256370266 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-23.0.0-hcf7e2ff_0_cpu.conda + sha256: 60df1505c0e14fc1aa1832f57f6802854559f718531101dfb0835b45a6cd3cf2 + md5: b6f129fd980b012c234b455219f31a6d depends: - - aws-crt-cpp >=0.35.2,<0.35.3.0a0 + - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - bzip2 >=1.0.8,<2.0a0 - libabseil * cxx17* @@ -2658,204 +3469,188 @@ packages: - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl >=8.17.0,<9.0a0 + - libcurl >=8.18.0,<9.0a0 - libgoogle-cloud >=2.39.0,<2.40.0a0 - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.2.1,<2.2.2.0a0 + - orc >=2.2.2,<2.2.3.0a0 - snappy >=1.2.2,<1.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: - - apache-arrow-proc =*=cpu - - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + - apache-arrow-proc =*=cpu license: Apache-2.0 - license_family: APACHE purls: [] - size: 3994427 - timestamp: 1763230398189 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_4_cpu.conda - build_number: 4 - sha256: ebc47c938c7e3af8af35cb6ad92a2ff4fcaba3776bf3f0dc8690e3c168035b0b - md5: f9e754e716ed279c88f25d17fc6b5764 + size: 4149744 + timestamp: 1769259187888 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-23.0.0-h9737151_0_cpu.conda + sha256: 26e7b08c0e945a5a825b13069f4f3a8855ffc18d8f953a800bda6c9dcfdf11b8 + md5: dcaf0d16d780e9d89f9d9bfd6fc21241 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 hd1700fa_4_cpu - - libarrow-compute 22.0.0 h7751554_4_cpu - - libcxx >=19 + - libarrow 23.0.0 h8071b21_0_cpu + - libarrow-compute 23.0.0 hc26cc94_0_cpu + - libcxx >=21 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 license: Apache-2.0 - license_family: APACHE purls: [] - size: 551790 - timestamp: 1763230587607 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_4_cpu.conda - build_number: 4 - sha256: adbb4bbdbac732c8c5d5dd99b972c149fd4ee3b3dbcb4b70654b4fbd751e43bb - md5: c8ea0681d0dcf1e1a0722ea3c916bca1 + size: 562566 + timestamp: 1769256944293 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-23.0.0-h7d8d6a5_0_cpu.conda + sha256: fe073960e60389dff5649ad108dd9aa767cf2a9acd05cabd51b099867d394cea + md5: 540182c554868cef4ead05206147705b depends: - - libarrow 22.0.0 h117da51_4_cpu - - libarrow-compute 22.0.0 h2db994a_4_cpu + - libarrow 23.0.0 hcf7e2ff_0_cpu + - libarrow-compute 23.0.0 h2db994a_0_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE purls: [] - size: 445496 - timestamp: 1763230780711 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_4_cpu.conda - build_number: 4 - sha256: 0a27101d20f8e47dea60fb489d8904472e92da913660605d61f318352ac79163 - md5: 673d1c37cbbf9a99235337cbb6969dff + size: 464816 + timestamp: 1769259495722 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-23.0.0-hc26cc94_0_cpu.conda + sha256: 51c8c7c3e5fc0532d33c2464b985548a683476b38976c9bdab9e46e77452919e + md5: 529e738c9f7641f742e458b5dd903a87 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 hd1700fa_4_cpu - - libcxx >=19 + - libarrow 23.0.0 h8071b21_0_cpu + - libcxx >=21 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libre2-11 >=2025.8.12 - - libutf8proc >=2.11.0,<2.12.0a0 + - libutf8proc >=2.11.3,<2.12.0a0 - re2 license: Apache-2.0 - license_family: APACHE purls: [] - size: 2394943 - timestamp: 1763230184019 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_4_cpu.conda - build_number: 4 - sha256: 63d6f8ccfaa61aaa3415d666e22ee12f3a2644068f4907656396cf0ea665d743 - md5: 8b416d4245113c42f37f024d75598efe + size: 2403204 + timestamp: 1769256571727 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-23.0.0-h2db994a_0_cpu.conda + sha256: 522d7f674a6768c1f57456ce9f241be6282a532d9affb16bb73d3cc23c1712da + md5: 3dc0dfb46631dc00a44c4ed869e54cfa depends: - - libarrow 22.0.0 h117da51_4_cpu + - libarrow 23.0.0 hcf7e2ff_0_cpu - libre2-11 >=2025.8.12 - - libutf8proc >=2.11.0,<2.12.0a0 + - libutf8proc >=2.11.3,<2.12.0a0 - re2 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE purls: [] - size: 1680370 - timestamp: 1763230549106 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_4_cpu.conda - build_number: 4 - sha256: 31c410ca02fb477d8c19792ebb6b5f50144e510ed50a41be268fba6cca6a3417 - md5: 64d5722c982b89dabf848feb7edf97f9 + size: 1774422 + timestamp: 1769259309856 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-23.0.0-h9737151_0_cpu.conda + sha256: 54e9f65b484ce5b3164fdce7002a98c48d49a786bcbd5a3069def50c2f6fd342 + md5: 29bcbe4c43773e9c75b9ce72fd93ee34 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 hd1700fa_4_cpu - - libarrow-acero 22.0.0 h2db2d7d_4_cpu - - libarrow-compute 22.0.0 h7751554_4_cpu - - libcxx >=19 + - libarrow 23.0.0 h8071b21_0_cpu + - libarrow-acero 23.0.0 h9737151_0_cpu + - libarrow-compute 23.0.0 hc26cc94_0_cpu + - libcxx >=21 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libparquet 22.0.0 habb56ca_4_cpu + - libparquet 23.0.0 ha0d2768_0_cpu - libprotobuf >=6.31.1,<6.31.2.0a0 license: Apache-2.0 - license_family: APACHE purls: [] - size: 533092 - timestamp: 1763230993273 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_4_cpu.conda - build_number: 4 - sha256: 1e58be0777222ed586d43835fc1140439646da9a73caa9abd6a613af4d3956e5 - md5: cfec90bf4005cdfa5a47170b15174c25 + size: 552421 + timestamp: 1769257199184 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-23.0.0-h7d8d6a5_0_cpu.conda + sha256: 026b8e67e8dcd9a8cd11e7ac6670c4d2896ab6dde4b1203b46b55fe96a1c253f + md5: 9636a9e56e2884a13af82b52f40e3335 depends: - - libarrow 22.0.0 h117da51_4_cpu - - libarrow-acero 22.0.0 h7d8d6a5_4_cpu - - libarrow-compute 22.0.0 h2db994a_4_cpu - - libparquet 22.0.0 h7051d1f_4_cpu + - libarrow 23.0.0 hcf7e2ff_0_cpu + - libarrow-acero 23.0.0 h7d8d6a5_0_cpu + - libarrow-compute 23.0.0 h2db994a_0_cpu + - libparquet 23.0.0 h7051d1f_0_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE purls: [] - size: 430223 - timestamp: 1763230939077 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_4_cpu.conda - build_number: 4 - sha256: ecc37e1e0faa308f7bed2e346a1b3aa2bae7155f6df2312f11ad25fe30731bd4 - md5: c2f7a8fec7db2ce12d5aaabeed2cedea + size: 446822 + timestamp: 1769259620882 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-23.0.0-h7f2e36e_0_cpu.conda + sha256: ce2185282b8fa0b507d278afb5cfd97964faa917784123e9cb20aa3aedb9f396 + md5: 863dc1e33bafc3288f32098ab5ea9efc depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 hd1700fa_4_cpu - - libarrow-acero 22.0.0 h2db2d7d_4_cpu - - libarrow-dataset 22.0.0 h2db2d7d_4_cpu - - libcxx >=19 + - libarrow 23.0.0 h8071b21_0_cpu + - libarrow-acero 23.0.0 h9737151_0_cpu + - libarrow-dataset 23.0.0 h9737151_0_cpu + - libcxx >=21 - libprotobuf >=6.31.1,<6.31.2.0a0 license: Apache-2.0 - license_family: APACHE purls: [] - size: 447573 - timestamp: 1763231087749 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_4_cpu.conda - build_number: 4 - sha256: 0189bf49c4282bf52760b55d80a1968d7e798bc80f30bc497807d0bb68962944 - md5: 6c44b4c5d10c20d08059350e4be2a2c3 + size: 465745 + timestamp: 1769257286608 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-23.0.0-hf865cc0_0_cpu.conda + sha256: eaf10b91f78d048db073367289706dceea442cd392182da4ebd18e1ab1f88952 + md5: a0822fb8692ae257f0cbba0003aa4e62 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h117da51_4_cpu - - libarrow-acero 22.0.0 h7d8d6a5_4_cpu - - libarrow-dataset 22.0.0 h7d8d6a5_4_cpu + - libarrow 23.0.0 hcf7e2ff_0_cpu + - libarrow-acero 23.0.0 h7d8d6a5_0_cpu + - libarrow-dataset 23.0.0 h7d8d6a5_0_cpu - libprotobuf >=6.31.1,<6.31.2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE purls: [] - size: 358564 - timestamp: 1763230991635 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-4_he492b99_openblas.conda - build_number: 4 - sha256: 293e5290eee6d9be5a817ba4e1830ba18b04be9d619c2bdffeacf8ba3b0bef8d - md5: fa78d175db3b07d8eb963558e1bd9228 + size: 375788 + timestamp: 1769259661708 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda + build_number: 5 + sha256: 4754de83feafa6c0b41385f8dab1b13f13476232e16f524564a340871a9fc3bc + md5: 36d2e68a156692cbae776b75d6ca6eae depends: - libopenblas >=0.3.30,<0.3.31.0a0 - libopenblas >=0.3.30,<1.0a0 constrains: + - liblapack 3.11.0 5*_openblas + - blas 2.305 openblas + - libcblas 3.11.0 5*_openblas - mkl <2026 - - liblapack 3.11.0 4*_openblas - - libcblas 3.11.0 4*_openblas - - liblapacke 3.11.0 4*_openblas - - blas 2.304 openblas + - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18702 - timestamp: 1764824607451 -- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-3_hf2e6a31_mkl.conda - build_number: 3 - sha256: 0abcb8902f44274cf67bc2525be140f70e7ca2818b8fafc9bacd53b3cc936f79 - md5: 5cd17bc2e8b4a641816e1a674075a7f7 + size: 18476 + timestamp: 1765819054657 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda + build_number: 5 + sha256: f0cb7b2697461a306341f7ff32d5b361bb84f3e94478464c1e27ee01fc8f276b + md5: f9decf88743af85c9c9e05556a4c47c0 depends: - mkl >=2025.3.0,<2026.0a0 constrains: - - blas 2.303 mkl - - liblapack 3.11.0 3*_mkl - - liblapacke 3.11.0 3*_mkl - - libcblas 3.11.0 3*_mkl + - liblapack 3.11.0 5*_mkl + - libcblas 3.11.0 5*_mkl + - blas 2.305 mkl + - liblapacke 3.11.0 5*_mkl license: BSD-3-Clause + license_family: BSD purls: [] - size: 67656 - timestamp: 1764721105300 + size: 67438 + timestamp: 1765819100043 - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda sha256: 4c19b211b3095f541426d5a9abac63e96a5045e509b3d11d4f9482de53efe43b md5: f157c098841474579569c85a60ece586 @@ -2926,35 +3721,36 @@ packages: purls: [] size: 252903 timestamp: 1764017901735 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-4_h9b27e0a_openblas.conda - build_number: 4 - sha256: 2412cc96eda9455cdddc6221b023df738f4daef269007379d06cfe79cfd065be - md5: 4ebb29d020eb3c2c8ac9674d8cfa4a31 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda + build_number: 5 + sha256: 8077c29ea720bd152be6e6859a3765228cde51301fe62a3b3f505b377c2cb48c + md5: b31d771cbccff686e01a687708a7ca41 depends: - - libblas 3.11.0 4_he492b99_openblas + - libblas 3.11.0 5_he492b99_openblas constrains: - - liblapacke 3.11.0 4*_openblas - - liblapack 3.11.0 4*_openblas - - blas 2.304 openblas + - liblapack 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18690 - timestamp: 1764824633990 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-3_h2a3cdd5_mkl.conda - build_number: 3 - sha256: 202762643b4fbadeace2f24036e4cc0f3fd63f494a4746db99a22041e6048ab1 - md5: b7ac6152e3268dca486e4ef415b82269 + size: 18484 + timestamp: 1765819073006 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda + build_number: 5 + sha256: 49dc59d8e58360920314b8d276dd80da7866a1484a9abae4ee2760bc68f3e68d + md5: b3fa8e8b55310ba8ef0060103afb02b5 depends: - - libblas 3.11.0 3_hf2e6a31_mkl + - libblas 3.11.0 5_hf2e6a31_mkl constrains: - - blas 2.303 mkl - - liblapack 3.11.0 3*_mkl - - liblapacke 3.11.0 3*_mkl + - liblapack 3.11.0 5*_mkl + - liblapacke 3.11.0 5*_mkl + - blas 2.305 mkl license: BSD-3-Clause + license_family: BSD purls: [] - size: 68257 - timestamp: 1764721142545 + size: 68079 + timestamp: 1765819124349 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 sha256: 3043869ac1ee84554f177695e92f2f3c2c507b260edad38a0bf3981fce1632ff md5: 23d6d5a69918a438355d7cbc4c3d54c9 @@ -2976,9 +3772,9 @@ packages: purls: [] size: 25694 timestamp: 1633684287072 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda - sha256: 80c7c8ff76eb699ec8d096dce80642b527fd8fc9dd72779bccec8d140c5b997a - md5: 9ddfaeed0eafce233ae8f4a430816aa5 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + sha256: 1a0af3b7929af3c5893ebf50161978f54ae0256abb9532d4efba2735a0688325 + md5: de1910529f64ba4a9ac9005e0be78601 depends: - __osx >=10.13 - krb5 >=1.21.3,<1.22.0a0 @@ -2990,11 +3786,11 @@ packages: license: curl license_family: MIT purls: [] - size: 413119 - timestamp: 1765379670120 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda - sha256: 651daa5d2bad505b5c72b1d5d4d8c7fc0776ab420e67af997ca9391b6854b1b3 - md5: cfade9be135edb796837e7d4c288c0fb + size: 419089 + timestamp: 1767822218800 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda + sha256: 86258e30845571ea13855e8a0605275905781476f3edf8ae5df90a06fcada93a + md5: 2688214a9bee5d5650cd4f5f6af5c8f2 depends: - krb5 >=1.21.3,<1.22.0a0 - libssh2 >=1.11.1,<2.0a0 @@ -3005,18 +3801,18 @@ packages: license: curl license_family: MIT purls: [] - size: 378897 - timestamp: 1762333969177 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.7-h3d58e20_0.conda - sha256: 0ac1b1d1072a14fe8fd3a871c8ca0b411f0fdf30de70e5c95365a149bd923ac8 - md5: 67c086bf0efc67b54a235dd9184bd7a2 + size: 383261 + timestamp: 1767821977053 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda + sha256: cbd8e821e97436d8fc126c24b50df838b05ba4c80494fbb93ccaf2e3b2d109fb + md5: 9f8a60a77ecafb7966ca961c94f33bd1 depends: - __osx >=10.13 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 571564 - timestamp: 1764676139160 + size: 569777 + timestamp: 1765919624323 - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda sha256: 025f8b1e85dd8254e0ca65f011919fb1753070eb507f03bca317871a884d24de md5: 31aa65919a729dc48180893f62c25221 @@ -3189,23 +3985,24 @@ packages: purls: [] size: 422960 timestamp: 1764839601296 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_15.conda - sha256: 4488ea36bdef6e6ad088aff604316cfd779723a514b6f7b7fc9d55dbdd255b63 - md5: e05ab7ace69b10ae32f8a710a5971f4f +- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda + sha256: 24984e1e768440ba73021f08a1da0c1ec957b30d7071b9a89b877a273d17cae8 + md5: 1edb8bd8e093ebd31558008e9cb23b47 depends: - _openmp_mutex >=4.5 - libwinpthread >=12.0.0.r4.gg4f2fc60ca constrains: - - libgcc-ng ==15.2.0=*_15 + - libgomp 15.2.0 h8ee18e1_16 + - libgcc-ng ==15.2.0=*_16 - msys2-conda-epoch <0.0a0 - - libgomp 15.2.0 h8ee18e1_15 license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 819575 - timestamp: 1764840888141 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.0-hfd904f9_2.conda - sha256: eac1f9b85fa5d9085297ed03cca246168086eee90bfec95516280e8d45362d16 - md5: 2394c1d85bb5c80355fda7ff366c5fc4 + size: 819696 + timestamp: 1765260437409 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda + sha256: c290f76783e7fb7480bc43eb1c8b5c2388d3bb7b554ca2324e3514114f937591 + md5: 5fedeef42dca8c3bba696092097d3d73 depends: - __osx >=10.13 - blosc >=1.21.6,<2.0a0 @@ -3223,7 +4020,7 @@ packages: - libjxl >=0.11,<0.12.0a0 - libkml >=1.3.0,<1.4.0a0 - liblzma >=5.8.1,<6.0a0 - - libpng >=1.6.51,<1.7.0a0 + - libpng >=1.6.53,<1.7.0a0 - libspatialite >=5.1.0,<5.2.0a0 - libsqlite >=3.51.1,<4.0a0 - libwebp-base >=1.6.0,<2.0a0 @@ -3238,15 +4035,15 @@ packages: - xerces-c >=3.3.0,<3.4.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - libgdal 3.12.0.* + - libgdal 3.12.1.* license: MIT license_family: MIT purls: [] - size: 10709925 - timestamp: 1764691561079 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.0-hd4e8292_2.conda - sha256: 9ef93caf69a64c0ebbd18b4f76c803707a47fe2a0fc36efde14183e01de77f8c - md5: 851d7058b2e8040831ad90071683010e + size: 10730106 + timestamp: 1766093828044 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda + sha256: 6e016ae30f9e74038dac1bc6541d38ae806f21a9da9307675591d648bb837ac4 + md5: cfc8f1a9b92c8ddb31a3e9d0582de2e2 depends: - blosc >=1.21.6,<2.0a0 - geos >=3.14.1,<3.14.2.0a0 @@ -3260,7 +4057,7 @@ packages: - libjxl >=0.11,<0.12.0a0 - libkml >=1.3.0,<1.4.0a0 - liblzma >=5.8.1,<6.0a0 - - libpng >=1.6.51,<1.7.0a0 + - libpng >=1.6.53,<1.7.0a0 - libspatialite >=5.1.0,<5.2.0a0 - libsqlite >=3.51.1,<4.0a0 - libwebp-base >=1.6.0,<2.0a0 @@ -3278,11 +4075,12 @@ packages: - xerces-c >=3.3.0,<3.4.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - libgdal 3.12.0.* + - libgdal 3.12.1.* license: MIT + license_family: MIT purls: [] - size: 9786792 - timestamp: 1764690203971 + size: 9775599 + timestamp: 1766095956934 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda sha256: 7bb4d51348e8f7c1a565df95f4fc2a2021229d42300aab8366eda0ea1af90587 md5: a089323fefeeaba2ae60e1ccebf86ddc @@ -3307,17 +4105,18 @@ packages: purls: [] size: 1061950 timestamp: 1764839609607 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_15.conda - sha256: 54689a6061ef03e381591069bd6bd4ce1d1e3a0a91807252aa31adf24a81ed8c - md5: 18713a6d90ce576053ac3ce9f792fe14 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda + sha256: 9c86aadc1bd9740f2aca291da8052152c32dd1c617d5d4fd0f334214960649bb + md5: ab8189163748f95d4cb18ea1952943c3 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: 663321 - timestamp: 1764840809009 + size: 663567 + timestamp: 1765260367147 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda sha256: 9b50362bafd60c4a3eb6c37e6dbf7e200562dab7ae1b282b1ebd633d4d77d4bd md5: 06564befaabd2760dfa742e47074bad2 @@ -3433,9 +4232,9 @@ packages: purls: [] size: 14433486 timestamp: 1761053760632 -- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda - sha256: 266dfe151066c34695dbdc824ba1246b99f016115ef79339cbcf005ac50527c1 - md5: b0cac6e5b06ca5eeb14b4f7cf908619f +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 + md5: 3b576f6860f838f950c570f4433b086e depends: - libwinpthread >=12.0.0.r4.gg4f2fc60ca - libxml2 @@ -3446,8 +4245,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 2414731 - timestamp: 1757624335056 + size: 2411241 + timestamp: 1765104337762 - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda sha256: 2f49632a3fd9ec5e38a45738f495f8c665298b0b35e6c89cef8e0fbc39b3f791 md5: bb8ff4fec8150927a54139af07ef8069 @@ -3513,35 +4312,35 @@ packages: purls: [] size: 841783 timestamp: 1762094814336 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libjxl-0.11.1-h4ee1b5b_5.conda - sha256: f203822559bdefe8ef0d93967a997001bc2d0d8b73e790fe1f39eec72962b0ec - md5: b5e1f8b97695f5303c8ad0f8d72c7534 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libjxl-0.11.1-hde0fb83_8.conda + sha256: fa5ee8b83d7d87e7bd3bfd4623c5e50a7135ccbcbbebf247b992df284c85d679 + md5: 5e478d37b1027d73872f7c8d579dc314 depends: - __osx >=10.13 - - libbrotlidec >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - libcxx >=19 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 - libhwy >=1.3.0,<1.4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1547591 - timestamp: 1761788908653 -- conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.1-hac9b6f3_5.conda - sha256: 54e35ad6152fb705f26491c6651d4b77757315c446a494ffc477f36fb2203c79 - md5: 8e3cc52433c99ad9632f430d3ac2a077 + size: 1761909 + timestamp: 1768822114809 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.1-hf3f85d1_8.conda + sha256: 53cdc0e894cf1f622fcd08a447da473cfe7f9edeffa0882b41eadb3b0a67b1d3 + md5: 60ca4943052b9634a92d841e1860b8d6 depends: - - libbrotlidec >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libhwy >=1.3.0,<1.4.0a0 - - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libhwy >=1.3.0,<1.4.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1092699 - timestamp: 1761788697831 + size: 1317273 + timestamp: 1768821992120 - conda: https://conda.anaconda.org/conda-forge/osx-64/libkml-1.3.0-h450b6c2_1022.conda sha256: 9d0fa449acb13bd0e7a7cb280aac3578f5956ace0602fa3cf997969432c18786 md5: ec47f97e9a3cdfb729e1b1173d80ed0f @@ -3571,59 +4370,60 @@ packages: purls: [] size: 1659205 timestamp: 1761132867821 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-4_h859234e_openblas.conda - build_number: 4 - sha256: cd490682199bd61c8db56cb72e71c154d91e8bf652cb28327690fa38246085d5 - md5: ebce74f166fc65413f751b8a125d4be3 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-5_h859234e_openblas.conda + build_number: 5 + sha256: 2c915fe2b3d806d4b82776c882ba66ba3e095e9e2c41cc5c3375bffec6bddfdc + md5: eb5b1c25d4ac30813a6ca950a58710d6 depends: - - libblas 3.11.0 4_he492b99_openblas + - libblas 3.11.0 5_he492b99_openblas constrains: - - liblapacke 3.11.0 4*_openblas - - libcblas 3.11.0 4*_openblas - - blas 2.304 openblas + - libcblas 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18692 - timestamp: 1764824659093 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-3_hf9ab0e9_mkl.conda - build_number: 3 - sha256: 3e62c95ace9787c10beb6bae2f6399fb334e7fa9c08f0704c2c7dafe85415ccb - md5: cb13ddc09ffa85ac572e453046a4ccaf + size: 18491 + timestamp: 1765819090240 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda + build_number: 5 + sha256: a2d33f5cc2b8a9042f2af6981c6733ab1a661463823eaa56595a9c58c0ab77e1 + md5: e62c42a4196dee97d20400612afcb2b1 depends: - - libblas 3.11.0 3_hf2e6a31_mkl + - libblas 3.11.0 5_hf2e6a31_mkl constrains: - - blas 2.303 mkl - - liblapacke 3.11.0 3*_mkl - - libcblas 3.11.0 3*_mkl + - libcblas 3.11.0 5*_mkl + - blas 2.305 mkl + - liblapacke 3.11.0 5*_mkl license: BSD-3-Clause + license_family: BSD purls: [] - size: 80104 - timestamp: 1764721178120 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 - md5: 8468beea04b9065b9807fc8b9cdc5894 + size: 80225 + timestamp: 1765819148014 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + sha256: 7ab3c98abd3b5d5ec72faa8d9f5d4b50dcee4970ed05339bc381861199dabb41 + md5: 688a0c3d57fa118b9c97bf7e471ab46c depends: - __osx >=10.13 constrains: - - xz 5.8.1.* + - xz 5.8.2.* license: 0BSD purls: [] - size: 104826 - timestamp: 1749230155443 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc - md5: c15148b2e18da456f5108ccb5e411446 + size: 105482 + timestamp: 1768753411348 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c + md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 depends: - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - xz 5.8.1.* + - xz 5.8.2.* license: 0BSD purls: [] - size: 104935 - timestamp: 1749230611612 + size: 106169 + timestamp: 1768752763559 - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda sha256: c48d7e1cc927aef83ff9c48ae34dd1d7495c6ccc1edc4a3a6ba6aff1624be9ac md5: e7630cef881b1174d40f3e69a883e55f @@ -3683,69 +4483,62 @@ packages: purls: [] size: 362175 timestamp: 1751782820895 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_4_cpu.conda - build_number: 4 - sha256: f195841bde46a049fe449cf59b8e42db7f83e2459ffd1de4dad2bd192db86b84 - md5: 67ff6ca0e1fdec92bdc20fa593390ba1 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-23.0.0-ha0d2768_0_cpu.conda + sha256: 6d725561a295e51125f76a0bf62caba33359e599f543d9cd91b800afc8e922bf + md5: 291f3afc764f78ea4a83516585a1e7c3 depends: - __osx >=11.0 - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 hd1700fa_4_cpu - - libcxx >=19 + - libarrow 23.0.0 h8071b21_0_cpu + - libcxx >=21 - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - libprotobuf >=6.31.1,<6.31.2.0a0 - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.4,<4.0a0 license: Apache-2.0 - license_family: APACHE purls: [] - size: 1073343 - timestamp: 1763230480681 -- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_4_cpu.conda - build_number: 4 - sha256: ea75648db5492d9fc3906bec3ae281fe9d7656ea7e0beffc8835acf043c8d847 - md5: 6fab9241407392bbbab0a2c6dc80e688 + size: 1095286 + timestamp: 1769256845564 +- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-23.0.0-h7051d1f_0_cpu.conda + sha256: 7b29537fdd29351a36f8817fb1959b3f13259a4b68b2c448b8793f620cc25571 + md5: fa8b0d1f7d292d01a78dcc370d903ba3 depends: - - libarrow 22.0.0 h117da51_4_cpu + - libarrow 23.0.0 hcf7e2ff_0_cpu - libthrift >=0.22.0,<0.22.1.0a0 - openssl >=3.5.4,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 - license_family: APACHE purls: [] - size: 920722 - timestamp: 1763230729257 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - sha256: 62a861e407bf0d0a2a983d0b0167ed263ae035cae7061976e9994f9963e6c68d - md5: 0cdbbd56f660997cfe5d33e516afac2f + size: 948280 + timestamp: 1769259453124 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.54-h07817ec_0.conda + sha256: c0efdf9b34132e7d4e0051bf65a97f1b9e1125c7f8a9067a35ec119af367eb38 + md5: 3d43dcdfcc3971939c80f855cf2df235 depends: - __osx >=10.13 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement purls: [] - size: 298397 - timestamp: 1764981064303 -- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.51-h7351971_0.conda - sha256: 4a558e1901cc67b1c336cf719dfa1b806c5e69492df9fe6c19991da57a6845d2 - md5: 5b98079b7e86c25c7e70ed7fd7da7da5 + size: 298894 + timestamp: 1768285676981 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.54-h7351971_0.conda + sha256: 6e269361aa18a57bd2e593e480d83d93fc5f839d33d3bfc31b4ffe10edf6751c + md5: 638ecb69e44b6a588afd5633e81f9e61 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: 383255 - timestamp: 1763764166376 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-h03562ea_2.conda - sha256: 40a32a77cdb7f7b49187a4c9faf5c7812d95233288ab96b06e0dd9978ecd8e6d - md5: 39b7711c03a0d0533e832e734641e56e + size: 383094 + timestamp: 1768285706434 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda + sha256: 2058eb9748a6e29a1821fea8aeea48e87d73c83be47b0504ac03914fee944d0e + md5: f22705f9ebb3f79832d635c4c2919b15 depends: - __osx >=11.0 - libabseil * cxx17* @@ -3755,11 +4548,11 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 3550823 - timestamp: 1760550860606 -- conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_2.conda - sha256: bb28909aef3777c5e950b769b30fe4bf02e0a7fb5322e583042a5cdc76bb15d0 - md5: 0e44c704760bbe4b696d981c3313f665 + size: 3079808 + timestamp: 1766315644973 +- conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda + sha256: a0f78f254f5833c8ec3ac38caf5dd7d826b5d7496df5aebc4b11baabd741e041 + md5: 2031f591ca8c1289838a4f85ea1c7e74 depends: - libabseil * cxx17* - libabseil >=20250512.1,<20250513.0a0 @@ -3770,8 +4563,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 7787239 - timestamp: 1760550955606 + size: 7488966 + timestamp: 1766316540495 - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda sha256: 901fb4cfdabf1495e7f080f8e8e218d1ad182c9bcd3cea2862481fef0e9d534f md5: a0237623ed85308cb816c3dcced23db2 @@ -3828,6 +4621,26 @@ packages: purls: [] size: 403088 timestamp: 1761671197546 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + sha256: d3975cfe60e81072666da8c76b993af018cf2e73fe55acba2b5ba0928efaccf5 + md5: 6af4b059e26492da6013e79cbcb4d069 + depends: + - __osx >=10.13 + license: ISC + purls: [] + size: 210249 + timestamp: 1716828641383 +- 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/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda sha256: 4f4a08255e92e4c320252a7693cc27ba27e731a48f8fd5e41a76c1a671bb82e3 md5: 14067124e9dd23b72cd78d68d78fac03 @@ -3876,28 +4689,27 @@ packages: purls: [] size: 8671657 timestamp: 1761681604524 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-h6cc646a_0.conda - sha256: 8460901daff15749354f0de143e766febf0682fe9201bf307ea84837707644d1 - md5: f71213ed0c51030cb17a77fc60a757f1 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + sha256: 710a7ea27744199023c92e66ad005de7f8db9cf83f10d5a943d786f0dac53b7c + md5: d910105ce2b14dfb2b32e92ec7653420 depends: - __osx >=10.13 - - icu >=75.1,<76.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 991350 - timestamp: 1764359781222 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_0.conda - sha256: a976c8b455d9023b83878609bd68c3b035b9839d592bd6c7be7552c523773b62 - md5: f92bef2f8e523bb0eabe60099683617a + size: 987506 + timestamp: 1768148247615 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda + sha256: 756478128e3e104bd7e7c3ce6c1b0efad7e08c7320c69fdc726e039323c63fbb + md5: 903979414b47d777d548e5f0165e6cd8 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 1291059 - timestamp: 1764359545703 + size: 1291616 + timestamp: 1768148278261 - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 @@ -3987,19 +4799,19 @@ packages: purls: [] size: 993166 timestamp: 1762022118895 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda - sha256: 83f2799e28643c7793730aa32e007832ffb520c5d77714d2097c227424f33ef1 - md5: e630b1baa02a5eeb0ef351c6125865c4 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda + sha256: 626db214208e8da6aa9a904518a0442e5bff7b4602cc295dd5ce1f4a98844c1d + md5: 2c49b6f6ec9a510bbb75ecbd2a572697 depends: - __osx >=10.13 license: MIT license_family: MIT purls: [] - size: 84943 - timestamp: 1764062312835 -- conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda - sha256: ff63a5e402fb5007174ea9796a210617da898a43d00b4e8a3192537cad0bd403 - md5: 405c392813b74f3df06276e99c0e2841 + size: 84535 + timestamp: 1768735249136 +- conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + sha256: 5d82af0779eab283416240da792a0d2fe4f8213c447e9f04aeaab1801468a90c + md5: 5f34fcb6578ea9bdbfd53cc2cfb88200 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -4007,8 +4819,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 89116 - timestamp: 1764062179403 + size: 89061 + timestamp: 1768735187639 - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda sha256: 00dbfe574b5d9b9b2b519acb07545380a6bc98d1f76a02695be4995d4ec91391 md5: 7bb6608cf1f83578587297a158a6630b @@ -4075,45 +4887,44 @@ packages: purls: [] size: 1208687 timestamp: 1727279378819 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h7b7ecba_0.conda - sha256: ddf87bf05955d7870a41ca6f0e9fbd7b896b5a26ec1a98cd990883ac0b4f99bb - md5: e7ed73b34f9d43d80b7e80eba9bce9f3 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda + sha256: 24ecb3a3eed2b17cec150714210067cafc522dec111750cbc44f5921df1ffec3 + md5: c58fc83257ad06634b9c935099ef2680 depends: - __osx >=10.13 - - icu >=75.1,<76.0a0 + - icu >=78.1,<79.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 ha1d9b0f_0 + - libxml2-16 2.15.1 he456531_1 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 39985 - timestamp: 1761015935429 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda - sha256: f507960adf64ee9c9c7b7833d8b11980765ebd2bf5345f73d5a3b21b259eaed5 - md5: 9176ee05643a1bfe7f2e7b4c921d2c3d + size: 40016 + timestamp: 1766327339623 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda + sha256: 8b47d5fb00a6ccc0f495d16787ab5f37a434d51965584d6000966252efecf56d + md5: 68dc154b8d415176c07b6995bd3a65d9 depends: + - icu >=78.1,<79.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h692994f_0 + - libxml2-16 2.15.1 h3cfd58e_1 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - constrains: - - icu <0.0a0 license: MIT license_family: MIT purls: [] - size: 43209 - timestamp: 1761016354235 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-ha1d9b0f_0.conda - sha256: e23c5ac1da7b9b65bd18bf32b68717cd9da0387941178cb4d8cc5513eb69a0a9 - md5: 453807a4b94005e7148f89f9327eb1b7 + size: 43387 + timestamp: 1766327259710 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda + sha256: eff0894cd82f2e055ea761773eb80bfaacdd13fbdd427a80fe0c5b00bf777762 + md5: 6cd21078a491bdf3fdb7482e1680ef63 depends: - __osx >=10.13 - - icu >=75.1,<76.0a0 + - icu >=78.1,<79.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 @@ -4122,12 +4933,13 @@ packages: license: MIT license_family: MIT purls: [] - size: 494318 - timestamp: 1761015899881 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda - sha256: 04129dc2df47a01c55e5ccf8a18caefab94caddec41b3b10fbc409e980239eb9 - md5: 70ca4626111579c3cd63a7108fe737f9 + size: 494450 + timestamp: 1766327317287 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda + sha256: a857e941156b7f462063e34e086d212c6ccbc1521ebdf75b9ed66bd90add57dc + md5: 07d73826fde28e7dbaec52a3297d7d26 depends: + - icu >=78.1,<79.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 @@ -4135,48 +4947,46 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - icu <0.0a0 - libxml2 2.15.1 license: MIT license_family: MIT purls: [] - size: 518135 - timestamp: 1761016320405 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h7b7ecba_0.conda - sha256: e2f50cbcd5f8bc880decf3e734d87aac05f9cd97f48404a48a2bde528f205b69 - md5: d48da211fb9523b22a299bce824c1242 + size: 518964 + timestamp: 1766327232819 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda + sha256: 5db52eae7357f89c16d08ab21ec89b35a7361e1d7be277716505e9764fe37eb8 + md5: cc1c67f0676478f972e26c5649ea68ac depends: - __osx >=10.13 - - icu >=75.1,<76.0a0 + - icu >=78.1,<79.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - - libxml2 2.15.1 h7b7ecba_0 - - libxml2-16 2.15.1 ha1d9b0f_0 + - libxml2 2.15.1 h24ca049_1 + - libxml2-16 2.15.1 he456531_1 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 79819 - timestamp: 1761015961507 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h5d26750_0.conda - sha256: 814d4efa70c354b79049f7aa18b8dadfbc46c112ba1348dd6a0ae52db0f6cff6 - md5: 93b3ed4c07b0e4bba3fd5dc4af62fc07 + size: 79886 + timestamp: 1766327359472 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda + sha256: aa029a0c5f193237011033e178433dd126796fd7693acbb6bffca134c3d3849e + md5: 83b2850ed45d2d66ac89e5cf2465cb43 depends: + - icu >=78.1,<79.0a0 - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - - libxml2 2.15.1 h5d26750_0 - - libxml2-16 2.15.1 h692994f_0 + - libxml2 2.15.1 h779ef1b_1 + - libxml2-16 2.15.1 h3cfd58e_1 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - constrains: - - icu <0.0a0 license: MIT license_family: MIT purls: [] - size: 123636 - timestamp: 1761016381443 + size: 123251 + timestamp: 1766327276864 - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 md5: 003a54a4e32b02f7355b50a837e699da @@ -4216,33 +5026,34 @@ packages: - pkg:pypi/lingua-language-detector?source=hash-mapping size: 84671772 timestamp: 1735923870862 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.7-h472b3d1_0.conda - sha256: 5ae51ca08ac19ce5504b8201820ba6387365662033f20af2150ae7949f3f308a - md5: c9f0fc88c8f46637392b95bef78dc036 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + sha256: 2a41885f44cbc1546ff26369924b981efa37a29d20dc5445b64539ba240739e6 + md5: e2d811e9f464dd67398b4ce1f9c7c872 depends: - __osx >=10.13 constrains: - - openmp 21.1.7|21.1.7.* + - openmp 21.1.8|21.1.8.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 311027 - timestamp: 1764721464764 -- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.7-h4fa8253_0.conda - sha256: 79121242419bf8b485c313fa28697c5c61ec207afa674eac997b3cb2fd1ff892 - md5: 5823741f7af732cd56036ae392396ec6 + size: 311405 + timestamp: 1765965194247 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda + sha256: 145c4370abe870f10987efa9fc15a8383f1dab09abbc9ad4ff15a55d45658f7b + md5: 0d8b425ac862bcf17e4b28802c9351cb depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - intel-openmp <0.0a0 - - openmp 21.1.7|21.1.7.* + - openmp 21.1.8|21.1.8.* license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 347969 - timestamp: 1764722187332 + size: 347566 + timestamp: 1765964942856 - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda sha256: 8da3c9d4b596e481750440c0250a7e18521e7f69a47e1c8415d568c847c08a1c md5: d6b9bd7e356abd7e3a633d59b753495a @@ -4319,21 +5130,6 @@ packages: - pkg:pypi/markdown-it-py?source=hash-mapping size: 64736 timestamp: 1754951288511 -- conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - sha256: e0cbfea51a19b3055ca19428bd9233a25adca956c208abb9d00b21e7259c7e03 - md5: fab1be106a50e20f10fe5228fd1d1651 - depends: - - python >=3.10 - constrains: - - jinja2 >=3.0.0 - track_features: - - markupsafe_no_compile - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 15499 - timestamp: 1759055275624 - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.3-py312hacf3034_0.conda sha256: e50fa11ea301d42fe64e587e2262f6afbe2ec42afe95e3ad4ccba06910b63155 md5: 2e6f78b0281181edc92337aa12b96242 @@ -4349,14 +5145,31 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 24541 timestamp: 1759055509267 -- conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.8-py312h7894933_0.conda - sha256: 2ce31cad23d5d5fc16ca9d25f47dcfc52e93f2a0c6e1dc6db28e583c42f88bdc - md5: 853618b60fdd11a6c3dbaadaa413407c +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py312h05f76fc_0.conda + sha256: db1d772015ef052fedb3b4e7155b13446b49431a0f8c54c56ca6f82e1d4e258f + md5: 9a50d5e7b4f2bf5db9790bbe9421cdf8 depends: - - __osx >=10.13 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - 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: 28388 + timestamp: 1759055474173 +- conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.8-py312h7894933_0.conda + sha256: 2ce31cad23d5d5fc16ca9d25f47dcfc52e93f2a0c6e1dc6db28e583c42f88bdc + md5: 853618b60fdd11a6c3dbaadaa413407c + depends: + - __osx >=10.13 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 - freetype - kiwisolver >=1.3.1 - libcxx >=19 @@ -4406,6 +5219,18 @@ packages: - pkg:pypi/matplotlib?source=hash-mapping size: 8076859 timestamp: 1763055636237 +- 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=hash-mapping + size: 15175 + timestamp: 1761214578417 - conda: https://conda.anaconda.org/conda-forge/noarch/maxminddb-2.6.2-pyhd8ed1ab_0.conda sha256: e170820ac4d5941feca5049514b444da55d35a601f9593cb28b748508a7c5b6d md5: 36825ad83ea9eca4353b3ed346616b0f @@ -4461,34 +5286,61 @@ packages: purls: [] size: 86618 timestamp: 1746450788037 -- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda - sha256: 3c432e77720726c6bd83e9ee37ac8d0e3dd7c4cf9b4c5805e1d384025f9e9ab6 - md5: c83ec81713512467dfe1b496a8292544 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + sha256: d3fb4beb5e0a52b6cc33852c558e077e1bfe44df1159eb98332d69a264b14bae + md5: b11e360fc4de2b0035fc8aaa74f17fd6 depends: - - llvm-openmp >=21.1.4 - - tbb >=2022.2.0 + - python >=3.10 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mistune?source=compressed-mapping + size: 74250 + timestamp: 1766504456031 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda + sha256: b2b4c84b95210760e4d12319416c60ab66e03674ccdcbd14aeb59f82ebb1318d + md5: fd05d1e894497b012d05a804232254ed + depends: + - llvm-openmp >=21.1.8 + - tbb >=2022.3.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/noarch/multidict-6.6.3-pyh62beb40_0.conda - sha256: c4257649d1be3d19a97213457032073737cd3179bd0ed3bd2b9885955d11f6b8 - md5: 36b9579bd0896b224df0424e46efc1b5 + size: 100224829 + timestamp: 1767634557029 +- conda: https://conda.anaconda.org/conda-forge/osx-64/msgspec-0.20.0-py312h1a1c95f_2.conda + sha256: b6078cad703eb8de2fa1228468d44c1001d232ad939fc83817e4b2fa9d2615af + md5: 8d4b910054d3abe9248508ac3fd992f2 depends: - - python >=3.9 - - typing-extensions >=4.1.0 - track_features: - - multidict_no_compile - license: Apache-2.0 - license_family: APACHE + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/multidict?source=hash-mapping - size: 37036 - timestamp: 1751310675422 + - pkg:pypi/msgspec?source=hash-mapping + size: 215747 + timestamp: 1768737993113 +- conda: https://conda.anaconda.org/conda-forge/win-64/msgspec-0.20.0-py312he06e257_2.conda + sha256: 87829a757aa507b1ec2407347b55da5f03e03f6fd8c8990cf044292433c90ab8 + md5: 658521110647084869216aa90867820c + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/msgspec?source=hash-mapping + size: 200099 + timestamp: 1768737908543 - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.7.0-py312h2352a57_0.conda sha256: 7dfaf8ee2c1bad866b7b975191e22d1dab529b8eecb9012480005dd190e079e7 md5: bf8bb4d92f3d07f998bd4fae10f46d14 @@ -4502,6 +5354,21 @@ packages: - pkg:pypi/multidict?source=hash-mapping size: 88942 timestamp: 1765460710634 +- conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.7.0-py312h05f76fc_0.conda + sha256: 002b3a8ea6a5482613e3bd8746a7875d159e1fd6707fea6973dd717f88807659 + md5: c3ef35651feadbfa926790b0c0343197 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/multidict?source=hash-mapping + size: 91021 + timestamp: 1765460781178 - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 md5: 37293a85a0f4f77bbd9cf7aaefc62609 @@ -4537,41 +5404,38 @@ packages: purls: [] size: 148557 timestamp: 1747117340968 -- conda: https://conda.anaconda.org/conda-forge/osx-64/murmurhash-1.0.15-py312hbfd3414_0.conda - sha256: 739e6d5026e05859af9fad1718527ba559e3ce6498e2cd159defb29afc2d9ded - md5: 6deb49ca8c8511feecfd4987160a9528 +- conda: https://conda.anaconda.org/conda-forge/osx-64/murmurhash-1.0.15-py312h29de90a_1.conda + sha256: 19edb1ba9544a4365fb0b8441245267d5180e58b7f151574198ca2d3988db570 + md5: 0ac3af29a4b774de8343cabd89854edb depends: - python - - libcxx >=19 - __osx >=10.13 + - libcxx >=19 - python_abi 3.12.* *_cp312 license: MIT license_family: MIT purls: - pkg:pypi/murmurhash?source=hash-mapping - size: 36894 - timestamp: 1763924150338 -- conda: https://conda.anaconda.org/conda-forge/win-64/murmurhash-1.0.15-py312ha1a9051_0.conda - sha256: 586cf9306177c002cc1d15c62a9a24dbe0f7776588760b655a86337aa7c3f97b - md5: 049cd1697939ae9a680e3aff5f0edf0b + size: 37753 + timestamp: 1768531528761 +- conda: https://conda.anaconda.org/conda-forge/win-64/murmurhash-1.0.15-py312ha1a9051_1.conda + sha256: dbb7a3a712539a4401469a532972a30ba0601bc9ff44c6ef5f5fc82e09c33a10 + md5: 7347a9e81ea2ce0e338b57d610791367 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.12.* *_cp312 license: MIT license_family: MIT purls: - pkg:pypi/murmurhash?source=hash-mapping - size: 32413 - timestamp: 1763924017658 -- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.13.0-pyhcf101f3_0.conda - sha256: 03220ba0560de1d81b8b122e8ff6313238dbb1ed621db39f4b81f767904ed475 - md5: 0129bb97a81c2ca0f57031673424387a + size: 32369 + timestamp: 1768531440515 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda + sha256: 2e64699401c6170ce9a0916461ff4686f8d10b076f6abe1d887cbcb7061c0e85 + md5: 37926bb0db8b04b8b99945076e1442d0 depends: - python >=3.10 - python @@ -4579,8 +5443,68 @@ packages: license_family: MIT purls: - pkg:pypi/narwhals?source=compressed-mapping - size: 268700 - timestamp: 1764604454148 + size: 272452 + timestamp: 1767693390284 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + sha256: 1b66960ee06874ddceeebe375d5f17fb5f393d025a09e15b830ad0c4fffb585b + md5: 00f5b8dafa842e0c27c1cd7296aa4875 + depends: + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - nbformat >=5.1 + - python >=3.8 + - traitlets >=5.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbclient?source=compressed-mapping + size: 28473 + timestamp: 1766485646962 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda + sha256: 8f575e5c042b17f4677179a6ba474bdbe76573936d3d3e2aeb42b511b9cb1f3f + md5: cfc86ccc3b1de35d36ccaae4c50391f5 + depends: + - beautifulsoup4 + - bleach-with-css !=5.0.0 + - defusedxml + - importlib-metadata >=3.6 + - jinja2 >=3.0 + - jupyter_core >=4.7 + - jupyterlab_pygments + - markupsafe >=2.0 + - mistune >=2.0.3,<4 + - nbclient >=0.5.0 + - nbformat >=5.7 + - packaging + - pandocfilters >=1.4.1 + - pygments >=2.4.1 + - python >=3.10 + - traitlets >=5.1 + - python + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.16.6 *_1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbconvert?source=compressed-mapping + size: 199273 + timestamp: 1760797634443 +- 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/osx-64/ncurses-6.5-h0622a9a_3.conda sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 md5: ced34dd9929f491ca6dab6a2927aff25 @@ -4590,23 +5514,17 @@ packages: purls: [] size: 822259 timestamp: 1738196181298 -- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6-pyhcf101f3_0.conda - sha256: 57b0bbb72ed5647438a81e7caf4890075390f80030c1333434467f9366762db7 - md5: 6725bfdf8ea7a8bf6415f096f3f1ffa5 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 + md5: 598fd7d4d0de2455fb74f56063969a97 depends: - - python >=3.11 - - python - constrains: - - numpy >=1.25 - - scipy >=1.11.2 - - matplotlib-base >=3.8 - - pandas >=2.0 - license: BSD-3-Clause + - python >=3.9 + license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/networkx?source=compressed-mapping - size: 1584885 - timestamp: 1763962034867 + - pkg:pypi/nest-asyncio?source=hash-mapping + size: 11543 + timestamp: 1733325673691 - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 md5: a2c1eeadae7a309daed9d62c96012a2b @@ -4621,19 +5539,19 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/networkx?source=compressed-mapping + - pkg:pypi/networkx?source=hash-mapping size: 1587439 timestamp: 1765215107045 -- conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda - sha256: 186edb5fe84bddf12b5593377a527542f6ba42486ca5f49cd9dfeda378fb0fbe - md5: 5e9bee5fa11d91e1621e477c3cb9b9ba +- conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h06076ce_1.conda + sha256: 8e1b8ac88e07da2910c72466a94d1fc77aa13c722f8ddbc7ae3beb7c19b41fc7 + md5: 97d7a1cda5546cb0bbdefa3777cb9897 constrains: - nlohmann_json-abi ==3.12.0 license: MIT license_family: MIT purls: [] - size: 136667 - timestamp: 1758194361656 + size: 137081 + timestamp: 1768670842725 - conda: https://conda.anaconda.org/conda-forge/noarch/nltk-3.9.2-pyhcf101f3_1.conda sha256: 83f64b761df8a174b9b13c1744c4792e5ff3b808100e87d8c41162070d6286ff md5: 0dc14490fe2a7788902dfb9378911837 @@ -4650,48 +5568,45 @@ packages: - pkg:pypi/nltk?source=hash-mapping size: 1131839 timestamp: 1759331744254 -- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py312ha3982b3_0.conda - sha256: 62c2a6fb30fec82f8d46defcf33c94a04d5c890ce02b3ddeeda3263f9043688c - md5: 6941ace329a1f088d1b3b399369aecec +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.1-py312hb34da66_0.conda + sha256: fa106137912ff6bf28d5dcdbf6ba8904fd62c1fced7fe1b35f74f990d9c4c08a + md5: 2c8ff39230936832bf4c6d7a5ac92ff8 depends: - python - libcxx >=19 - __osx >=10.13 - - liblapack >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - python_abi 3.12.* *_cp312 + - liblapack >=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: 7992092 - timestamp: 1763350891083 -- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py312ha72d056_0.conda - sha256: 1db03d0b892a196351544dabf8ac93a7f9f78dc85d3732de31ecb52c0da65d1b - md5: 1c96af76fd575e8dcc48eea3e851579f + - pkg:pypi/numpy?source=compressed-mapping + size: 7977192 + timestamp: 1768085565414 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.1-py312ha72d056_0.conda + sha256: 06d2acce4c5cfe230213c4bc62823de3fa032d053f83c93a28478c7b8ee769bc + md5: e06f225f5bf5784b3412b21a2a44da72 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 - - libblas >=3.9.0,<4.0a0 - python_abi 3.12.* *_cp312 - - liblapack >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 + - liblapack >=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=hash-mapping - size: 7438208 - timestamp: 1763350928802 + - pkg:pypi/numpy?source=compressed-mapping + size: 7163582 + timestamp: 1768085586766 - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda sha256: fdf4708a4e45b5fd9868646dd0c0a78429f4c0b8be490196c975e06403a841d0 md5: a67d3517ebbf615b91ef9fdc99934e0c @@ -4745,9 +5660,9 @@ packages: purls: [] size: 9440812 timestamp: 1762841722179 -- conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - sha256: a00d48750d2140ea97d92b32c171480b76b2632dbb9d19d1ae423999efcc825f - md5: b4646b6ddcbcb3b10e9879900c66ed48 +- conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.2-h3073fbf_0.conda + sha256: 6c7048ba82eea4c92c1dc8bdf0a6989609367ffef9ff719cf86066bab046e0d0 + md5: 7323bc020618321c05afaf23f78460c0 depends: - __osx >=11.0 - libcxx >=19 @@ -4760,11 +5675,11 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 521463 - timestamp: 1759424838652 -- conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - sha256: f28f8f2d743c2091f76161b8d59f82c4ba4970d03cb9900c52fb908fe5e8a7c4 - md5: a9b6ebf475194b0e5ad43168e9b936a7 + size: 522041 + timestamp: 1768248087348 +- conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.2-hbd3206f_0.conda + sha256: 86549f63b4b30764e70fd3edc2df4d69e17880b317afa9fa93318a83f9213807 + md5: e20393ad8ebe534f3937e0a5da44e287 depends: - libprotobuf >=6.31.1,<6.31.2.0a0 - libzlib >=1.3.1,<2.0a0 @@ -4778,20 +5693,32 @@ packages: license: Apache-2.0 license_family: Apache purls: [] - size: 1064397 - timestamp: 1759424869069 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 - md5: 58335b26c38bf4a20f399384c33cbcf9 + size: 1164012 + timestamp: 1768247969345 +- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c + md5: e51f1e4089cad105b6cac64bd8166587 + depends: + - python >=3.9 + - typing_utils + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/overrides?source=hash-mapping + size: 30139 + timestamp: 1734587755455 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 + md5: b76541e68fea4d511b1ac46a28dcd2c6 depends: - python >=3.8 - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging?source=hash-mapping - size: 62477 - timestamp: 1745345660407 + - pkg:pypi/packaging?source=compressed-mapping + size: 72010 + timestamp: 1769093650580 - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py312h86abcb1_2.conda sha256: 112273ffd9572a4733c98b9d80a243f38db4d0fce5d34befaf9eb6f64ed39ba3 md5: d7dfad2b9a142319cec4736fe88d8023 @@ -4892,12 +5819,12 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pandas?source=compressed-mapping + - pkg:pypi/pandas?source=hash-mapping size: 13779090 timestamp: 1764615170494 -- conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-2.3.3.251201-pyhd8ed1ab_0.conda - sha256: a78aea1e127a7988ba5d0ae92e330fca31cb40e1a5791f8e71464a3da43c873b - md5: 7eb8757889cd231ed46c4db504f75f8a +- conda: https://conda.anaconda.org/conda-forge/noarch/pandas-stubs-2.3.3.260113-pyhd8ed1ab_0.conda + sha256: 01ca8d406c5959ee84d4c467025005e0825c46f4e1098112309875c6d67c657d + md5: 7fd6f0c1f9fe715a5ee192f727e74528 depends: - numpy >=1.26.0 - python >=3.10 @@ -4906,8 +5833,41 @@ packages: license_family: BSD purls: - pkg:pypi/pandas-stubs?source=hash-mapping - size: 105273 - timestamp: 1764685601365 + size: 106767 + timestamp: 1768403429992 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + md5: 457c2c8c08e54905d6954e79cb5b5db9 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandocfilters?source=hash-mapping + size: 11627 + timestamp: 1631603397334 +- 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 +- pypi: https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl + name: patsy + version: 1.0.2 + sha256: 37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a + requires_dist: + - numpy>=1.4 + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - scipy ; extra == 'test' + requires_python: '>=3.6' - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda sha256: 8d64a9d36073346542e5ea042ef8207a45a0069a2e65ce3323ee3146db78134c md5: 08f970fb2b75f5be27678e077ebedd46 @@ -4934,55 +5894,108 @@ packages: purls: [] size: 995992 timestamp: 1763655708300 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.0.0-py312hea0c9db_2.conda - sha256: 8c2fc5ff5d9b6d9e285ef217e78d90820d507c98b961256dd410f48307360754 - md5: 1d9e77d994f7593d52f6f42ec2712b4d +- 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/osx-64/pillow-12.1.0-py312h4985050_0.conda + sha256: ae49f74594eab749f3f78441f4c33a58ac710c813d3823b9a8862dddc1f0af28 + md5: 2cc7fe00971062013ccc3c6616665182 depends: - python - __osx >=10.13 - - tk >=8.6.13,<8.7.0a0 - - lcms2 >=2.17,<3.0a0 - - python_abi 3.12.* *_cp312 - - libjpeg-turbo >=3.1.2,<4.0a0 - libxcb >=1.17.0,<2.0a0 - openjpeg >=2.5.4,<3.0a0 - - zlib-ng >=2.3.1,<2.4.0a0 - - libwebp-base >=1.6.0,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - zlib-ng >=2.3.2,<2.4.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - lcms2 >=2.17,<3.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping - size: 961639 - timestamp: 1764330318999 -- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.0.0-py312h31f0997_2.conda - sha256: f790f3ea6ae82d8ee3490d62cc2400311f0ca130eaf73292c599019e0b3ccae4 - md5: 4155ddcc60faad07fb2a5b3b988b3741 + size: 964428 + timestamp: 1767353261550 +- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py312h31f0997_0.conda + sha256: 5ad93e9f91e0e8863ca3f54a9dffe51633b41dc7f66e1d7debaec62f8d458f0a + md5: 2e481e979b46c223b3be6485113f7ad1 depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 + - libwebp-base >=1.6.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - - libjpeg-turbo >=3.1.2,<4.0a0 - - zlib-ng >=2.3.1,<2.4.0a0 - - libxcb >=1.17.0,<2.0a0 - - tk >=8.6.13,<8.7.0a0 - python_abi 3.12.* *_cp312 - openjpeg >=2.5.4,<3.0a0 + - tk >=8.6.13,<8.7.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - zlib-ng >=2.3.2,<2.4.0a0 - lcms2 >=2.17,<3.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - libwebp-base >=1.6.0,<2.0a0 license: HPND purls: - pkg:pypi/pillow?source=hash-mapping - size: 931818 - timestamp: 1764330112081 -- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.5.0-pyhd8ed1ab_0.conda - sha256: 13b06d2380fc46c299d2ae3465f90f156929b7f98597fc22b0e7ac0cfd40c20d - md5: 6d4c79b604d50c1140c32164f7eca72a + size: 933613 + timestamp: 1767353195061 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + sha256: b67692da1c0084516ac1c9ada4d55eaf3c5891b54980f30f3f444541c2706f1e + md5: c55515ca43c6444d2572e0f0d93cb6b9 + depends: + - python >=3.10,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + size: 1177534 + timestamp: 1762776258783 +- conda: https://conda.anaconda.org/conda-forge/noarch/pixi-kernel-0.7.1-pyhbbac1ac_0.conda + sha256: 506c9330b8dc5ae98f4c32629fa59fa40e6bdd42a681c48d2f9554693dd01156 + md5: d57ef7cb7ad6b5d62cef8b9bdf1d400b + depends: + - ipykernel >=6 + - jupyter_client >=7 + - jupyter_server >=2.4 + - msgspec >=0.18 + - python >=3.10 + - returns >=0.23 + - tomli >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pixi-kernel?source=hash-mapping + size: 39509 + timestamp: 1764156429044 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + sha256: 04c64fb78c520e5c396b6e07bc9082735a5cc28175dbe23138201d0a9441800b + md5: 1bd2e65c8c7ef24f4639ae6e850dacc2 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 23922 + timestamp: 1764950726246 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.5.2-pyhd8ed1ab_0.conda + sha256: 48d2caf66b8209bfb3fa160f5bc7cbd625deaa4826e8aa1bad706b2dd22bbb86 + md5: 7702bcd70891dd0154d765a69e1afa94 depends: - narwhals >=1.15.1 - packaging @@ -4993,11 +6006,23 @@ packages: license_family: MIT purls: - pkg:pypi/plotly?source=hash-mapping - size: 5179039 - timestamp: 1763430425844 -- conda: https://conda.anaconda.org/conda-forge/osx-64/preshed-3.0.12-py312h69bf00f_0.conda - sha256: 3f57f46b642a6e9a3f0b635cb439392679aacdaa98a03994fa7c5620a8c8b082 - md5: adf5d625c0d7e2554d6b5eb9ee3963d9 + size: 4924275 + timestamp: 1768442503807 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=compressed-mapping + size: 25877 + timestamp: 1764896838868 +- conda: https://conda.anaconda.org/conda-forge/osx-64/preshed-3.0.12-py312h11f4fa3_1.conda + sha256: d52b91535deb1051a070b1bf1ba3c557fbae22aad5ef41a970e5a3b3730f45ab + md5: 8d336f20d0050bf7d98388c47f60cb38 depends: - __osx >=10.13 - cymem >=2.0.2,<2.1.0 @@ -5009,11 +6034,11 @@ packages: license_family: MIT purls: - pkg:pypi/preshed?source=hash-mapping - size: 102144 - timestamp: 1763427614243 -- conda: https://conda.anaconda.org/conda-forge/win-64/preshed-3.0.12-py312hbb81ca0_0.conda - sha256: cbbc5f11e9b95882cb20f65c06e00153d9532fd5d6d94b797d4c04b2b56280cf - md5: 5c2195af353b08221ab99c7f126ac455 + size: 102220 + timestamp: 1768547054993 +- conda: https://conda.anaconda.org/conda-forge/win-64/preshed-3.0.12-py312hbb81ca0_1.conda + sha256: 8896b2c9cae1c7edcfa1e7b9681230ec07a1b665c9678c0ab6d3e694abdad27d + md5: 81009ef89759eb208650c5f1f4ef8f15 depends: - cymem >=2.0.2,<2.1.0 - murmurhash >=0.28.0,<1.1.0 @@ -5026,43 +6051,64 @@ packages: license_family: MIT purls: - pkg:pypi/preshed?source=hash-mapping - size: 90264 - timestamp: 1763427572962 -- conda: https://conda.anaconda.org/conda-forge/osx-64/proj-9.7.0-h3124640_0.conda - sha256: f8d45ec8e2a6ea58181a399a58f5e2f6ab6d25f772ba63ac08091e887498ab83 - md5: c952a9e5ecd52f6dfdb1b4e43e033893 + size: 90265 + timestamp: 1768546992428 +- pypi: https://files.pythonhosted.org/packages/50/07/8f02b5c352e5deaf1461ededd4cb844e96da96f0158fccfa397e85f4a8d0/prince-0.16.5-py3-none-any.whl + name: prince + version: 0.16.5 + sha256: 1556502acfbd3dfa655b7ea7cfc01b9ea586340b8d5cbd1a438663c0f8fe7ad8 + requires_dist: + - scikit-learn>=1.5.1 + - pandas>=2.2.0 + - altair>=5.0.0 + - nbconvert>=7.16.5 ; extra == 'dev' + - fbpca>=1.0 ; extra == 'dev' + - pytest>=8.3.4 ; extra == 'dev' + - ipykernel>=6.13.0 ; extra == 'dev' + - rpy2>=3.5.2 ; extra == 'dev' + - ruff>=0.8.8 ; extra == 'dev' + - xarray>=2025.1.0 ; extra == 'dev' + - pre-commit>=4.0.1 ; extra == 'dev' + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/osx-64/proj-9.7.1-h4aacef1_2.conda + sha256: 76efc2d9d359662246aa09b03ac52c25a6df1871a988a27fb13585af413aa4fd + md5: 2deeb48139ea69c6000e5f26296195fc depends: - - __osx >=10.13 - - libcurl >=8.14.1,<9.0a0 - - libcxx >=19 - - libsqlite >=3.50.4,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - sqlite + - libtiff + - libcurl + - libcxx >=19 + - __osx >=10.13 + - libsqlite >=3.51.2,<4.0a0 + - libcurl >=8.18.0,<9.0a0 + - libtiff >=4.7.1,<4.8.0a0 constrains: - proj4 ==999999999999 license: MIT license_family: MIT purls: [] - size: 2918228 - timestamp: 1757930204492 -- conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda - sha256: c582fd23ceaabe435f4fc78f4cb1f0f4ca46964e19d3b56dc3813dd83a25b115 - md5: 9839364b9ca98be1917a72046e5880fd + size: 3235293 + timestamp: 1769194275134 +- conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_2.conda + sha256: 81b19db0e1b1f3812ea32ef1afe74608df778a42540600a4a8d73a2fcf49268a + md5: 0a127152bc983e99981b50d44ac4a092 depends: - - libcurl >=8.17.0,<9.0a0 - - libsqlite >=3.51.1,<4.0a0 - - libtiff >=4.7.1,<4.8.0a0 - sqlite - - ucrt >=10.0.20348.0 + - libtiff + - libcurl - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libcurl >=8.18.0,<9.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libsqlite >=3.51.2,<4.0a0 constrains: - proj4 ==999999999999 license: MIT license_family: MIT purls: [] - size: 2817020 - timestamp: 1764624798704 + size: 3084258 + timestamp: 1769194305364 - conda: https://conda.anaconda.org/conda-forge/osx-64/prometheus-cpp-1.3.0-h7802330_0.conda sha256: af754a477ee2681cb7d5d77c621bd590d25fe1caf16741841fc2d176815fc7de md5: f36107fa2557e63421a46676371c4226 @@ -5077,19 +6123,31 @@ packages: purls: [] size: 179103 timestamp: 1730769223221 -- conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.3.1-pyhe1237c8_0.conda - sha256: d8927d64b35e1fb82285791444673e47d3729853be962c7045e75fc0fd715cec - md5: b1cda654f58d74578ac9786909af84cd +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + sha256: 75b2589159d04b3fb92db16d9970b396b9124652c784ab05b66f584edc97f283 + md5: 7526d20621b53440b0aae45d4797847e depends: - - python >=3.9 - track_features: - - propcache_no_compile + - python >=3.10 license: Apache-2.0 - license_family: APACHE + license_family: Apache purls: - - pkg:pypi/propcache?source=hash-mapping - size: 17693 - timestamp: 1744525054494 + - pkg:pypi/prometheus-client?source=compressed-mapping + size: 56634 + timestamp: 1768476602855 +- 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/osx-64/propcache-0.3.1-py312h3520af0_0.conda sha256: b589b640427dbfdc09a54783f89716440f4c9a4d9e479a2e4f33696f1073c401 md5: 9e58210edacc700e43c515206904f0ca @@ -5103,18 +6161,33 @@ packages: - pkg:pypi/propcache?source=hash-mapping size: 51501 timestamp: 1744525135519 -- conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.26.1-pyhd8ed1ab_0.conda - sha256: 88217ba299be4a56c0534ccdef676390b76ca10b07ac26d16940d9a944d6212c - md5: 6fcfcf4432cd80d05ee9c6e20830bd36 +- conda: https://conda.anaconda.org/conda-forge/win-64/propcache-0.3.1-py312h31fea79_0.conda + sha256: 2824ee1e6597d81e6b2840ab9502031ee873cab57eadf8429788f1d3225e09ad + md5: 8a1fef8f5796cf8076c7d1897e28ed5a + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/propcache?source=hash-mapping + size: 50573 + timestamp: 1744525241304 +- conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.27.0-pyhd8ed1ab_0.conda + sha256: cd703393ac925c2cbb79c58d141552d5135b106b53ce2201982284f104b4f86a + md5: 1099a038989e7f4037d3ce21e8ee9f2c depends: - protobuf >=3.19.0,<7.0.0 - - python >=3.9 + - python >=3.10 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/proto-plus?source=hash-mapping - size: 42466 - timestamp: 1741676252602 + size: 43122 + timestamp: 1765906462817 - conda: https://conda.anaconda.org/conda-forge/osx-64/protobuf-6.31.1-py312h457ac99_2.conda sha256: f943fdccd095beaa7773615dab762ce846aa1f98a9d7ba0dcb90b85de77bdb21 md5: 4283909633ec7d07839e150f7a52c01b @@ -5152,6 +6225,34 @@ packages: - pkg:pypi/protobuf?source=hash-mapping size: 480805 timestamp: 1760394064571 +- conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.2.1-py312hf7082af_0.conda + sha256: 5af96e184ddff68c96bfd7b9333e05d0bbcf5bfbac3a33b742ce582cd0608b33 + md5: 15f4c2db60fbc6b770b69319861cfc2b + depends: + - python + - __osx >=10.13 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 233850 + timestamp: 1767012478963 +- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.1-py312he5662c2_0.conda + sha256: cda67d235498657689953fecb614c00dc62412c1fd97d61ec76785ad719e48d0 + md5: 42ac55610af0bf0ae2a55c0f019c9e84 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 239389 + timestamp: 1767012412860 - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda sha256: 05944ca3445f31614f8c674c560bca02ff05cb51637a96f665cb2bbe496099e5 md5: 8bcf980d2c6b17094961198284b8e862 @@ -5174,46 +6275,65 @@ packages: purls: [] size: 9389 timestamp: 1726802555076 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-22.0.0-py312hb401068_0.conda - sha256: 2aa3268e84e3fa92c70d172cc5e0dcdeacf571a58eb40544910a1eab5eaaef67 - md5: 4f99ad72cb5935960c38b11f6c923446 - depends: - - libarrow-acero 22.0.0.* - - libarrow-dataset 22.0.0.* - - libarrow-substrait 22.0.0.* - - libparquet 22.0.0.* - - pyarrow-core 22.0.0 *_0_* +- 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/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/osx-64/pyarrow-23.0.0-py312hb401068_0.conda + sha256: 5a86def13d0b89b649f3c9bc07f175b88aa44e84c50468e416b8b83681a5d1b1 + md5: 4e75d068299eb2fcd0ecc448d99a6880 + depends: + - libarrow-acero 23.0.0.* + - libarrow-dataset 23.0.0.* + - libarrow-substrait 23.0.0.* + - libparquet 23.0.0.* + - pyarrow-core 23.0.0 *_0_* - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 - license_family: APACHE purls: [] - size: 26228 - timestamp: 1761649158373 -- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-22.0.0-py312h2e8e312_0.conda - sha256: 454c90e1c341335aa08fae2152d4f2b410406dcda76db21cd2f1c2720dac67b1 - md5: 1e2ead2c5717977fb85b9c6809b0896e - depends: - - libarrow-acero 22.0.0.* - - libarrow-dataset 22.0.0.* - - libarrow-substrait 22.0.0.* - - libparquet 22.0.0.* - - pyarrow-core 22.0.0 *_0_* + size: 27204 + timestamp: 1769291581498 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-23.0.0-py312h2e8e312_0.conda + sha256: c77b31c6adad7b1919c2e7f4b9e6257a1effc8613b17a540237f9fac0d5c2dfc + md5: e1519e126722ddb9406bb63a9393b59c + depends: + - libarrow-acero 23.0.0.* + - libarrow-dataset 23.0.0.* + - libarrow-substrait 23.0.0.* + - libparquet 23.0.0.* + - pyarrow-core 23.0.0 *_0_* - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 license: Apache-2.0 - license_family: APACHE purls: [] - size: 26662 - timestamp: 1761648571813 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py312hefc66a4_0_cpu.conda - sha256: 868a3a4a44f8eb77d701c635d4618782a1774a8a6f2d7b4162162ad7b72035f1 - md5: 8f850be5abc40c5d57562024b140db43 + size: 27620 + timestamp: 1769291986767 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-23.0.0-py312ha422e09_0_cpu.conda + sha256: d9dba06f5227ba17b6393175d9fa2e25d25ce7511c9bde0547a5aa40c485e990 + md5: 465737e64566d5df2bc621fd8d1dcc49 depends: - __osx >=10.13 - - libarrow 22.0.0.* *cpu - - libarrow-compute 22.0.0.* *cpu - - libcxx >=18 + - libarrow 23.0.0.* *cpu + - libarrow-compute 23.0.0.* *cpu + - libcxx >=21 - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -5221,17 +6341,16 @@ packages: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 - license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 4029697 - timestamp: 1761648927880 -- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py312h85419b5_0_cpu.conda - sha256: de96d67311385a7f3a23cdc4b49408e65c70e42af9a08bbd8ee6085ae8a26104 - md5: 18679999d9e40f043228de1e00847136 - depends: - - libarrow 22.0.0.* *cpu - - libarrow-compute 22.0.0.* *cpu + size: 4419434 + timestamp: 1769291543384 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-23.0.0-py312h85419b5_0_cpu.conda + sha256: 2cc38a12d517c57204a3af60ca72ed9cb98250e4b98dec4feb8fe5076ac9fb60 + md5: f72dc289f49117c9bf697dffd7174286 + depends: + - libarrow 23.0.0.* *cpu + - libarrow-compute 23.0.0.* *cpu - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -5242,22 +6361,21 @@ packages: - numpy >=1.21,<3 - apache-arrow-proc * cpu license: Apache-2.0 - license_family: APACHE purls: - pkg:pypi/pyarrow?source=hash-mapping - size: 3504560 - timestamp: 1761648524205 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.1-pyhd8ed1ab_2.conda - sha256: d06051df66e9ab753683d7423fcef873d78bb0c33bd112c3d5be66d529eddf06 - md5: 09bb17ed307ad6ab2fd78d32372fdd4e + size: 3557733 + timestamp: 1769291505775 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.2-pyhd8ed1ab_0.conda + sha256: 2b6e22e97af814153c0a993ea66811de9db05b2a6946dcb97a3953af13c33a80 + md5: c203d401759f448f9e792974e055bcdc depends: - - python >=3.9 + - python >=3.10 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pyasn1?source=hash-mapping - size: 62230 - timestamp: 1733217699113 + - pkg:pypi/pyasn1?source=compressed-mapping + size: 63471 + timestamp: 1769186345593 - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda sha256: 5495061f5d3d6b82b74d400273c586e7c1f1700183de1d2d1688e900071687cb md5: c689b62552f6b63f32f3322e463f3805 @@ -5345,6 +6463,36 @@ packages: - pkg:pypi/pygments?source=hash-mapping size: 889287 timestamp: 1750615908735 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-12.1-py312h4a480f0_0.conda + sha256: ecf778f886aaf50db22c0971fb0873f0dbe25663f124bd714bc87b4d0925f534 + md5: 18a20cb8c3e19f0b3799a48eba5b44aa + depends: + - __osx >=10.13 + - libffi >=3.5.2,<3.6.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-core?source=hash-mapping + size: 487397 + timestamp: 1763151480498 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-12.1-py312h1993040_0.conda + sha256: 3a29ca3cc2044b408447ff86ae0c57ecc3ff805a8fc838525610921024c8521a + md5: b6881a919e1bfd66349e2260b163dc7c + depends: + - __osx >=10.13 + - libffi >=3.5.2,<3.6.0a0 + - pyobjc-core 12.1.* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping + size: 375580 + timestamp: 1763160526695 - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py312h17ccd7d_0.conda sha256: d22ac3e5a554878d739bd06dd412c47adfd5552c2f002eea3fcb6bde2c68bcf9 md5: e6452e30b697d485a9929bd1eebcd7a2 @@ -5394,18 +6542,18 @@ packages: - pkg:pypi/pyopenssl?source=hash-mapping size: 126393 timestamp: 1760304658366 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda - sha256: 6814b61b94e95ffc45ec539a6424d8447895fef75b0fec7e1be31f5beee883fb - md5: 6c8979be6d7a17692793114fa26916e8 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de + md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/pyparsing?source=hash-mapping - size: 104044 - timestamp: 1758436411254 + - pkg:pypi/pyparsing?source=compressed-mapping + size: 110893 + timestamp: 1769003998136 - conda: https://conda.anaconda.org/conda-forge/noarch/pyphen-0.17.2-pyhd8ed1ab_0.conda sha256: 7cbd50ff7d308007e037817d0cf31540d4b8efa56711dfceab264a482c09a669 md5: 16801a63b53db57e6cfe7f84625e5762 @@ -5608,6 +6756,39 @@ packages: - 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.12.12-hd8ed1ab_1.conda + sha256: 59f17182813f8b23709b7d4cfda82c33b72dd007cb729efa0033c609fbd92122 + md5: c20172b4c59fbe288fa50cdc1b693d73 + depends: + - cpython 3.12.12.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + size: 45888 + timestamp: 1761175248278 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/python-json-logger?source=hash-mapping + size: 13383 + timestamp: 1677079727691 - conda: https://conda.anaconda.org/conda-forge/osx-64/python-rapidjson-1.23-py312h69bf00f_0.conda sha256: 322eb64460257d33c79dbcab4888cea50446c21a73662b516e30a621a8db17e0 md5: af9f74887119c227aa0ac3d93efaf80e @@ -5622,9 +6803,9 @@ packages: - pkg:pypi/python-rapidjson?source=hash-mapping size: 201337 timestamp: 1765095915721 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-rapidjson-1.22-py312hbb81ca0_0.conda - sha256: 4b44ab7431ebaa3ed12d34e893326d23d1ff9098d06b5794fd996e40a14a825c - md5: 3968dc06e39455110c844885aeefe2e2 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-rapidjson-1.23-py312hbb81ca0_0.conda + sha256: d2bdb5bfa655c4c3425c68e13aba3a84c8bd1b81820beb16fd355e54ef7ae1c3 + md5: 8437527491f72df3e3f584cbb37689d2 depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -5635,19 +6816,19 @@ packages: license_family: MIT purls: - pkg:pypi/python-rapidjson?source=hash-mapping - size: 150219 - timestamp: 1761029602178 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda - sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 - md5: 88476ae6ebd24f39261e0854ac244f33 + size: 152792 + timestamp: 1765095818040 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + sha256: 467134ef39f0af2dbb57d78cb3e4821f01003488d331a8dd7119334f4f47bfbd + md5: 7ead57407430ba33f681738905278d03 depends: - - python >=3.9 + - python >=3.10 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/tzdata?source=hash-mapping - size: 144160 - timestamp: 1742745254292 + - pkg:pypi/tzdata?source=compressed-mapping + size: 143542 + timestamp: 1765719982349 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda build_number: 8 sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 @@ -5682,6 +6863,108 @@ packages: - pkg:pypi/pyu2f?source=hash-mapping size: 36786 timestamp: 1733738704089 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_1.conda + sha256: a7505522048dad63940d06623f07eb357b9b65510a8d23ff32b99add05aac3a1 + md5: 64cbe4ecbebe185a2261d3f298a60cde + 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.12.* *_cp312 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/pywin32?source=hash-mapping + size: 6684490 + timestamp: 1756487136116 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py312h275cf98_1.conda + sha256: 61cc6c2c712ab4d2b8e7a73d884ef8d3262cb80cc93a4aa074e8b08aa7ddd648 + md5: 66255d136bd0daa41713a334db41d9f0 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - winpty + license: MIT + license_family: MIT + purls: + - pkg:pypi/pywinpty?source=hash-mapping + size: 215371 + timestamp: 1759557609855 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py312hacf3034_0.conda + sha256: 28814df783a5581758d197262d773c92a72c8cedbec3ccadac90adf22daecd25 + md5: dbc6cfbec3095d84d9f3baab0c6a5c24 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 192483 + timestamp: 1758892060370 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_0.conda + sha256: 54d04e61d17edffeba1e5cad45f10f272a016b6feec1fa8fa6af364d84a7b4fc + md5: 4a68f80fbf85499f093101cc17ffbab7 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - 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=hash-mapping + size: 180635 + timestamp: 1758891847871 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-27.1.0-py312hb7d603e_0.conda + noarch: python + sha256: 4e052fa3c4ed319e7bcc441fca09dee4ee4006ac6eb3d036a8d683fceda9304b + md5: 81511d0be03be793c622c408c909d6f9 + depends: + - python + - __osx >=10.13 + - 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: 191697 + timestamp: 1757387104297 +- 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/osx-64/qhull-2020.2-h3c5361c_5.conda sha256: 79d804fa6af9c750e8b09482559814ae18cd8df549ecb80a4873537a5a31e06e md5: dd1ea9ff27c93db7c01a7b7656bd4ad4 @@ -5735,16 +7018,32 @@ packages: purls: [] size: 216623 timestamp: 1762397986736 -- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 - md5: 342570f8e02f2f022147a7f841475784 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 + md5: eefd65452dfe7cce476a519bece46704 depends: + - __osx >=10.13 - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 256712 - timestamp: 1740379577668 + size: 317819 + timestamp: 1765813692798 +- 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/osx-64/regex-2023.12.25-py312h41838bb_0.conda sha256: b96c99d652448b52dc5ca02d59f730e1302e54c7db785c540bf97ce9398dd8d4 md5: dfc1a4a7f6be6a92360c358c186eac6f @@ -5772,26 +7071,76 @@ packages: - pkg:pypi/regex?source=hash-mapping size: 358546 timestamp: 1703393933800 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - sha256: 8dc54e94721e9ab545d7234aa5192b74102263d3e704e6d0c8aa7008f2da2a7b - md5: db0c6b99149880c8ba515cf4abe93ee4 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 + md5: c65df89a0b2e321045a9e01d1337b182 depends: + - python >=3.10 - certifi >=2017.4.17 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - python >=3.9 - urllib3 >=1.21.1,<3 + - python 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/rich-14.2.0-pyhcf101f3_0.conda - sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 - md5: a247579d8a59931091b16a1e932bbed6 + - pkg:pypi/requests?source=compressed-mapping + size: 63602 + timestamp: 1766926974520 +- conda: https://conda.anaconda.org/conda-forge/noarch/returns-0.26.0-pyhe01879c_0.conda + sha256: 619962bf637f5cadf967adcec2c5ad1d408418b56830a701aec19e876e5197d0 + md5: bec7ce42bd4cc803e21c43e9b7fb8860 + depends: + - python >=3.10 + - typing_extensions >=4.0,<5.0 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/returns?source=hash-mapping + size: 100610 + timestamp: 1753812221549 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5 + md5: 36de09a8d3e5d5e6f4ee63af49e59706 + depends: + - python >=3.9 + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3339-validator?source=hash-mapping + size: 10209 + timestamp: 1733600040800 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 + md5: 912a71cc01012ee38e6b90ddd561e36f + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3986-validator?source=hash-mapping + size: 7818 + timestamp: 1598024297745 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92 + md5: 7234f99325263a5af6d4cd195035e8f2 + depends: + - python >=3.9 + - lark >=1.2.2 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rfc3987-syntax?source=hash-mapping + size: 22913 + timestamp: 1752876729969 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda + sha256: 8d9c9c52bb4d3684d467a6e31814d8c9fccdacc8c50eb1e3e5025e88d6d57cb4 + md5: 83d94f410444da5e2f96e5742b7a4973 depends: - markdown-it-py >=2.2.0 - pygments >=2.13.0,<3.0.0 @@ -5799,11 +7148,40 @@ packages: - typing_extensions >=4.0.0,<5.0.0 - python license: MIT + purls: + - pkg:pypi/rich?source=compressed-mapping + size: 208244 + timestamp: 1769302653091 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.30.0-py312h8a6388b_0.conda + sha256: 3df6f3ad2697f5250d38c37c372b77cc2702b0c705d3d3a231aae9dc9f2eec62 + md5: 9adbe03b6d1b86cab37fb37709eb4e38 + depends: + - python + - __osx >=10.13 + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 370624 + timestamp: 1764543158734 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py312hdabe01f_0.conda + sha256: faad05e6df2fc15e3ae06fdd71a36e17ff25364777aa4c40f2ec588740d64091 + md5: 2c51baeda0a355b0a5e7b6acb28cf02d + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + license: MIT license_family: MIT purls: - - pkg:pypi/rich?source=hash-mapping - size: 200840 - timestamp: 1760026188268 + - pkg:pypi/rpds-py?source=hash-mapping + size: 243577 + timestamp: 1764543069837 - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda sha256: e32e94e7693d4bc9305b36b8a4ef61034e0428f58850ebee4675978e3c2e5acf md5: 58958bb50f986ac0c46f73b6e290d5fe @@ -5815,50 +7193,50 @@ packages: purls: - pkg:pypi/rsa?source=hash-mapping size: 31709 - timestamp: 1744825527634 -- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-py312hfee4f84_0.conda - sha256: 6a0c1612b9e9957bde60772a856555ca51c1635387d43d479e473aab78e3c4c2 - md5: a1af779e83653754fe8547c7e7f043cc - depends: - - __osx >=10.13 - - joblib >=1.3.0 - - libcxx >=19 - - llvm-openmp >=19.1.7 - - numpy >=1.23,<3 + timestamp: 1744825527634 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py312h47bbdc5_1.conda + sha256: 1a03f549462e9c700c93664c663c08a651f6c93c0979384417ac132549c44b98 + md5: 9c037f2050f55c721704013b87c9724e + depends: + - python - numpy >=1.24.1 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - scipy >=1.10.0 + - joblib >=1.3.0 - threadpoolctl >=3.2.0 + - __osx >=10.13 + - llvm-openmp >=19.1.7 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scikit-learn?source=hash-mapping - size: 9025588 - timestamp: 1765351314138 -- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.7.2-py312h91ac024_0.conda - sha256: 22666360c1026cb5d197ca3f5b6e6e7902414cde266b0bb7e8b50f894254348e - md5: 640f74b19cfe413de754391df630a15a - depends: - - joblib >=1.2.0 - - numpy >=1.22.0 - - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - scipy >=1.8.0 - - threadpoolctl >=3.1.0 - - ucrt >=10.0.20348.0 + size: 9288972 + timestamp: 1766550860454 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py312hea30aaf_1.conda + sha256: cc3057fd244a13afe94bdb5e3fb6ecbd7ece78559ebdb55a86ae40202ed813a0 + md5: e5cd920b237e02178573ce47ffa87e8c + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.3.0 + - threadpoolctl >=3.2.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scikit-learn?source=hash-mapping - size: 8736451 - timestamp: 1757433576165 -- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.3-py312he2acf2f_1.conda - sha256: e37dbb3881e422cd4979882f34f760c0f66ba7a90fcecd95cd55472d41e661d7 - md5: d84da8b0c914cd3071be89b458e2811e + size: 8884013 + timestamp: 1765801252142 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.0-py312ha20b133_1.conda + sha256: 6cc34c00442e95199a41bd551a3003ec5f2cac43e8e71158e03462a0dc61b799 + md5: 9ab1af443bf4a42fd14a2baf21e394b9 depends: - __osx >=10.13 - libblas >=3.9.0,<4.0a0 @@ -5866,9 +7244,8 @@ packages: - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - - libgfortran5 >=15.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy <2.6 + - numpy <2.7 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.12,<3.13.0a0 @@ -5877,16 +7254,16 @@ packages: license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 15248796 - timestamp: 1763221288506 -- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.3-py312hd0164fe_1.conda - sha256: 898caf77968dd262b84568316af5a69a511d573b39addf10739124c6c2909ef8 - md5: a586f151952f8157e00365a564d08914 + size: 15064644 + timestamp: 1768800945420 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.0-py312h9b3c559_1.conda + sha256: 0f90709b8b8ffa3f3f8a3e023154be77e3fe7dbeda3de3d62479c862111761f2 + md5: da72702707bdb757ad57637815f165b1 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - - numpy <2.6 + - numpy <2.7 - numpy >=1.23,<3 - numpy >=1.25.2 - python >=3.12,<3.13.0a0 @@ -5897,20 +7274,48 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy?source=hash-mapping - size: 14804382 - timestamp: 1763221169515 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 - md5: 4de79c071274a53dcaf2a8c749d1499e + - pkg:pypi/scipy?source=compressed-mapping + size: 14843889 + timestamp: 1768801821822 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_0.conda + sha256: 6b1a863b2a3e106e573a6efce2303963c3adc2764dfdbf08c4a35dbe62604988 + md5: 297e2901b530c5d321c563e66a65db99 depends: - - python >=3.9 + - __osx + - pyobjc-framework-cocoa + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/send2trash?source=hash-mapping + size: 22409 + timestamp: 1768402460843 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_0.conda + sha256: b64e5cdb66f5d31fcef05b6ed95b8be3e80796528aa8a165428496c0dda3383f + md5: 69ba308f1356f39901f5654d82405df3 + depends: + - __win + - pywin32 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/send2trash?source=hash-mapping + size: 22700 + timestamp: 1768402455730 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda + sha256: 89d5bb48047e7e27aa52a3a71d6ebf386e5ee4bdbd7ca91d653df9977eca8253 + md5: cb72cedd94dd923c6a9405a3d3b1c018 + depends: + - python >=3.10 license: MIT license_family: MIT purls: - - pkg:pypi/setuptools?source=hash-mapping - size: 748788 - timestamp: 1748804951958 + - pkg:pypi/setuptools?source=compressed-mapping + size: 678025 + timestamp: 1768998156365 - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.1.2-py312hd8edc82_2.conda sha256: 0ad376aee3a2fe149443af9345aadeb8ad82a95953bee74b59ca17997da03012 md5: eae9cbc6418de8f26e08f4fb255759e9 @@ -5966,6 +7371,33 @@ packages: - pkg:pypi/six?source=hash-mapping size: 18455 timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/sklearn-compat-0.1.5-pyhd8ed1ab_0.conda + sha256: 003f33fa9e555ba8adc3da59b8be98ca2a61829da123abb7a9bea2d95b7f6261 + md5: 5a9f81c5642665ff94675c05096828e4 + depends: + - python >=3.10 + - scikit-learn >=1.2,<1.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sklearn-compat?source=hash-mapping + size: 24060 + timestamp: 1766329827681 +- conda: https://conda.anaconda.org/conda-forge/noarch/sklearn-pandas-2.2.0-pyhd8ed1ab_0.tar.bz2 + sha256: e360f1d15125d2c1fc76dabd31dc057e0f8afbe668ef9e556cefa8935913a87e + md5: 3bf01094aaabae0b69ec93bfc6f09c2a + depends: + - numpy >=1.18.1 + - pandas >=1.1.4 + - python >=3.7 + - scikit-learn >=0.23.0 + - scipy >=1.5.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sklearn-pandas?source=hash-mapping + size: 13351 + timestamp: 1620483338731 - conda: https://conda.anaconda.org/conda-forge/noarch/smart-open-7.5.0-h0f9f196_0.conda sha256: 16f0537ce0cc20b265d161765f94a720e5f1a2e1772c27601a3926ecc25c4fc3 md5: 6ef36c6a6ce87cc57cf0094abfa3d35b @@ -6015,11 +7447,17 @@ packages: purls: [] size: 67417 timestamp: 1762948090450 -- 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/soupsieve-2.8.3-pyhd8ed1ab_0.conda + sha256: 23b71ecf089967d2900126920e7f9ff18cdcef82dbff3e2f54ffa360243a17ac + md5: 18de09b20462742fe093ba39185d9bac + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/soupsieve?source=hash-mapping + size: 38187 + timestamp: 1769034509657 - conda: https://conda.anaconda.org/conda-forge/osx-64/spacy-3.8.11-py312h46c259a_0.conda sha256: 29502698c59413153b4ea2c2c1f4659dd137aeb7d460ffeb425577c0b4104abd md5: 4d410080a75074b621d5ab35cebbb75e @@ -6107,35 +7545,64 @@ packages: - pkg:pypi/spacy-loggers?source=hash-mapping size: 21760 timestamp: 1694527261289 -- conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h9e4bfbb_0.conda - sha256: e493fb82215a4f0a9cd8e62193d821b94ba64226860253295335bb59bdbd4d4e - md5: abe6e51b7529c047912848821ba2f872 +- conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.2-h5af3ad2_0.conda + sha256: 89fde12f2a5e58edb9bd1497558a77df9c090878971559bcf0c8513e0966795e + md5: 9eef7504045dd9eb1be950b2f934d542 depends: - __osx >=10.13 - - icu >=75.1,<76.0a0 - - libsqlite 3.51.1 h6cc646a_0 + - libsqlite 3.51.2 hb99441e_0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - readline >=8.2,<9.0a0 + - readline >=8.3,<9.0a0 license: blessing purls: [] - size: 174016 - timestamp: 1764359811089 -- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_0.conda - sha256: 87284f2f3c5da52fa00d694fea32656b9616fcdd425b970cef46c5de0ac636e8 - md5: 2a4cacda574f3377fb7e14630c9c0c73 + size: 174119 + timestamp: 1768148271396 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.2-hdb435a2_0.conda + sha256: 8194c1326f052852dd827f5277ba381228a968e841d410eb18c622cf851b11ba + md5: bc9265bd9f30f9ded263cb762a4fc847 depends: - - libsqlite 3.51.1 hf5d6505_0 + - libsqlite 3.51.2 hf5d6505_0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 400644 - timestamp: 1764359585715 -- conda: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.4-pyhcf101f3_1.conda - sha256: 4ef08b50c6d49e2b15859967d07b02be64875c5830b4010c70b100a286d1b0f0 - md5: 65d949d575edd0d9b9044bf78f36caa0 + size: 400812 + timestamp: 1768148302390 +- conda: https://conda.anaconda.org/conda-forge/noarch/sqlite-fts4-1.0.3-pyhaa4b35c_1.conda + sha256: 50045a7946deb292e31c50f9fb487eabc8c3d87e9d912ea073e8add3f9cbda0c + md5: 41b9df532996914d8563564e7edc2bdd + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/sqlite-fts4?source=hash-mapping + size: 19130 + timestamp: 1734711168651 +- conda: https://conda.anaconda.org/conda-forge/noarch/sqlite-utils-3.39-pyhcf101f3_0.conda + sha256: 1b838bfc72b65694a02872d0509eae23a3b410a75812118e7822aa0ebbf15346 + md5: c284acf6e4f73570cedc0de32bd53d8c + depends: + - python >=3.10 + - sqlite-fts4 + - click >=8.3.1 + - click-default-group >=1.2.3 + - tabulate + - python-dateutil + - pluggy + - pip + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/sqlite-utils?source=hash-mapping + size: 124269 + timestamp: 1764620525880 +- conda: https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.5-pyhcf101f3_0.conda + sha256: 20159c171d31cbbde7937f2f74c4cfc78eeaf1e3e9de4c830d0e070c93aa16c4 + md5: a1db6adc1093f9d5b3e6ffd46dac84b1 depends: - python >=3.10 - python @@ -6143,8 +7610,8 @@ packages: license_family: BSD purls: - pkg:pypi/sqlparse?source=hash-mapping - size: 44161 - timestamp: 1764433038651 + size: 44238 + timestamp: 1766143791089 - conda: https://conda.anaconda.org/conda-forge/osx-64/srsly-2.5.2-py312h69bf00f_0.conda sha256: 8c154164ce76855553b4886db03367b3859f54be9b69e019e8f73910e09100ad md5: eda738793dba5fecab574a8844843331 @@ -6180,22 +7647,146 @@ packages: - pkg:pypi/srsly?source=hash-mapping size: 591687 timestamp: 1763419937212 -- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda - sha256: c31cac57913a699745d124cdc016a63e31c5749f16f60b3202414d071fc50573 - md5: 17c38aaf14c640b85c4617ccb59c1146 +- 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 +- pypi: https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl + name: statsmodels + version: 0.14.6 + sha256: fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5 + requires_dist: + - numpy>=1.22.3,<3 + - scipy>=1.8,!=1.9.2 + - pandas>=1.4,!=2.1.0 + - patsy>=0.5.6 + - packaging>=21.3 + - cython>=3.0.10 ; extra == 'build' + - cython>=3.0.10 ; extra == 'develop' + - cython>=3.0.10,<4 ; extra == 'develop' + - setuptools-scm[toml]~=8.0 ; extra == 'develop' + - matplotlib>=3 ; extra == 'develop' + - colorama ; extra == 'develop' + - joblib ; extra == 'develop' + - jinja2 ; extra == 'develop' + - pytest>=7.3.0,<8 ; extra == 'develop' + - pytest-randomly ; extra == 'develop' + - pytest-xdist ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - pywinpty ; os_name == 'nt' and extra == 'develop' + - flake8 ; extra == 'develop' + - isort ; extra == 'develop' + - sphinx ; extra == 'docs' + - nbconvert ; extra == 'docs' + - jupyter-client ; extra == 'docs' + - ipykernel ; extra == 'docs' + - matplotlib ; extra == 'docs' + - nbformat ; extra == 'docs' + - numpydoc ; extra == 'docs' + - pandas-datareader ; extra == 'docs' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl + name: statsmodels + version: 0.14.6 + sha256: b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f + requires_dist: + - numpy>=1.22.3,<3 + - scipy>=1.8,!=1.9.2 + - pandas>=1.4,!=2.1.0 + - patsy>=0.5.6 + - packaging>=21.3 + - cython>=3.0.10 ; extra == 'build' + - cython>=3.0.10 ; extra == 'develop' + - cython>=3.0.10,<4 ; extra == 'develop' + - setuptools-scm[toml]~=8.0 ; extra == 'develop' + - matplotlib>=3 ; extra == 'develop' + - colorama ; extra == 'develop' + - joblib ; extra == 'develop' + - jinja2 ; extra == 'develop' + - pytest>=7.3.0,<8 ; extra == 'develop' + - pytest-randomly ; extra == 'develop' + - pytest-xdist ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - pywinpty ; os_name == 'nt' and extra == 'develop' + - flake8 ; extra == 'develop' + - isort ; extra == 'develop' + - sphinx ; extra == 'docs' + - nbconvert ; extra == 'docs' + - jupyter-client ; extra == 'docs' + - ipykernel ; extra == 'docs' + - matplotlib ; extra == 'docs' + - nbformat ; extra == 'docs' + - numpydoc ; extra == 'docs' + - pandas-datareader ; extra == 'docs' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda + sha256: 795e03d14ce50ae409e86cf2a8bd8441a8c459192f97841449f33d2221066fef + md5: de98449f11d48d4b52eefb354e2bfe35 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tabulate?source=hash-mapping + size: 40319 + timestamp: 1765140047040 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9 + md5: 0f9817ffbe25f9e69ceba5ea70c52606 depends: - - libhwloc >=2.12.1,<2.12.2.0a0 + - libhwloc >=2.12.2,<2.12.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] - size: 155714 - timestamp: 1762510341121 -- conda: https://conda.anaconda.org/conda-forge/noarch/textstat-0.7.11-pyhd8ed1ab_0.conda - sha256: a34f7b3cb533200321f96982180ea9372b553853d1d3b27c0e950e39a1f4d169 - md5: 04058d5f24993ebf36f27f3786488b4d + size: 155869 + timestamp: 1767886839029 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + sha256: b375e8df0d5710717c31e7c8e93c025c37fa3504aea325c7a55509f64e5d4340 + md5: e43ca10d61e55d0a8ec5d8c62474ec9e + depends: + - __win + - pywinpty >=1.1.0 + - python >=3.10 + - tornado >=6.1.0 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/terminado?source=hash-mapping + size: 23665 + timestamp: 1766513806974 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + sha256: 6b6727a13d1ca6a23de5e6686500d0669081a117736a87c8abf444d60c1e40eb + md5: 17b43cee5cc84969529d5d0b0309b2cb + depends: + - __unix + - ptyprocess + - python >=3.10 + - tornado >=6.1.0 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/terminado?source=hash-mapping + size: 24749 + timestamp: 1766513766867 +- conda: https://conda.anaconda.org/conda-forge/noarch/textstat-0.7.12-pyhd8ed1ab_0.conda + sha256: b312354db7a9dc6e70afc5a935b4cc19748377c95d9b2869ba9b3d08974973f6 + md5: b07f3c4d87ab09b9717cd494c0b48ceb depends: - cmudict - nltk @@ -6206,8 +7797,8 @@ packages: license_family: MIT purls: - pkg:pypi/textstat?source=hash-mapping - size: 136583 - timestamp: 1762338707590 + size: 137525 + timestamp: 1765663971514 - conda: https://conda.anaconda.org/conda-forge/osx-64/thinc-8.3.10-py312h46c259a_0.conda sha256: 012873ab1c7702599d1da6c5a2d8d715f2fac6092f71e2222795021674001fcc md5: 34771f873b0779f2a8c7abb3e8e3dee9 @@ -6270,6 +7861,19 @@ packages: - pkg:pypi/threadpoolctl?source=hash-mapping size: 23869 timestamp: 1741878358548 +- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda + sha256: 7c803480dbfb8b536b9bf6287fa2aa0a4f970f8c09075694174eb4550a4524cd + md5: c0d0b883e97906f7524e2aac94be0e0d + depends: + - python >=3.10 + - webencodings >=0.4 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/tinycss2?source=compressed-mapping + size: 30571 + timestamp: 1764621508086 - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda sha256: 0d0b6cef83fec41bc0eb4f3b761c4621b7adfb14378051a8177bd9bb73d26779 md5: bd9f1de651dbd80b51281c694827f78f @@ -6293,6 +7897,46 @@ packages: purls: [] size: 3472313 timestamp: 1763055164278 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8 + md5: 72e780e9aa2d0a3295f59b1874e3768b + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=compressed-mapping + size: 21453 + timestamp: 1768146676791 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py312h404bc50_0.conda + sha256: 44ba44075b754a0da5a476d5cdc6783e290d3f26d355c9fc236abaaefa902d4d + md5: fc935f8c37abef2b3cc3b9f15b951c6d + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 854453 + timestamp: 1765836802876 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py312he06e257_0.conda + sha256: 84e1ed65db7e30b3cf6061fe5cf68a7572b1561daf5efc8edfeebb65e16c6ff4 + md5: 4109bfc75570fe3fd08e2b879d2f76bc + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - 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: 857173 + timestamp: 1765836731961 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 md5: 9efbfdc37242619130ea42b1cc4ed861 @@ -6304,49 +7948,60 @@ packages: - pkg:pypi/tqdm?source=hash-mapping size: 89498 timestamp: 1735661472632 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda - sha256: 17a1e572939af33d709248170871d4da74f7e32b48f2e9b5abca613e201c6e64 - md5: 23a53fdefc45ba3f4e075cc0997fd13b +- 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/typer-0.21.1-pyhf8876ea_0.conda + sha256: 62b359b76ae700ef4a4f074a196bc8953f2188a2784222029d0b3d19cdea59f9 + md5: 7f66f45c1bb6eb774abf6d2f02ccae9d depends: - - typer-slim-standard ==0.20.0 h4daf872_1 + - typer-slim-standard ==0.21.1 h378290b_0 - python >=3.10 - python license: MIT license_family: MIT purls: - pkg:pypi/typer?source=hash-mapping - size: 79829 - timestamp: 1762984042927 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda - sha256: 4b5ded929080b91367f128e7299619f6116f08bc77d9924a2f8766e2a1b18161 - md5: 4b02a515f3e882dcfe9cfbf0a1f5cd3a + size: 82073 + timestamp: 1767711188310 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda + sha256: 9ef3c1b5ea2b355904b94323fc3fc95a37584ef09c6c86aafe472da156aa4d70 + md5: 3f64f1c7f9a23bead591884648949622 depends: - python >=3.10 - click >=8.0.0 - typing_extensions >=3.7.4.3 - python constrains: - - typer 0.20.0.* + - typer 0.21.1.* - rich >=10.11.0 - shellingham >=1.3.0 license: MIT license_family: MIT purls: - pkg:pypi/typer-slim?source=compressed-mapping - size: 47951 - timestamp: 1762984042920 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_1.conda - sha256: 5027768bc9a580c8ffbf25872bb2208c058cbb79ae959b1cf2cc54b5d32c0377 - md5: 37b26aafb15a6687b31a3d8d7a1f04e7 + size: 48131 + timestamp: 1767711188309 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda + sha256: 6a300a4e8d1e30b7926a966e805201ec08d4a5ab97c03a7d0f927996413249d7 + md5: f08a1f489c4d07cfd4a9983963073480 depends: - - typer-slim ==0.20.0 pyhcf101f3_1 + - typer-slim ==0.21.1 pyhcf101f3_0 - rich - shellingham license: MIT license_family: MIT purls: [] size: 5322 - timestamp: 1762984042927 + timestamp: 1767711188310 - conda: https://conda.anaconda.org/conda-forge/noarch/types-pytz-2025.2.0.20251108-pyhd8ed1ab_0.conda sha256: 407eede257ad94d77dae4fd60b1a574d6551aa470d9f5c92ea0262d737a54109 md5: 3121e2dcab1bae684b349509b033aec1 @@ -6376,7 +8031,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/typing-inspection?source=compressed-mapping + - pkg:pypi/typing-inspection?source=hash-mapping size: 18923 timestamp: 1764158430324 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -6391,13 +8046,39 @@ packages: - pkg:pypi/typing-extensions?source=hash-mapping size: 51692 timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 - md5: 4222072737ccff51314b5ece9c7d6f5a +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c + md5: f6d7aa696c67756a650e91e15e88223c + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/typing-utils?source=hash-mapping + size: 15183 + timestamp: 1733331395943 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 license: LicenseRef-Public-Domain purls: [] - size: 122968 - timestamp: 1742727099393 + size: 119135 + timestamp: 1767016325805 +- pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl + name: ua-parser + version: 1.0.1 + sha256: b059f2cb0935addea7e551251cbbf42e9a8872f86134163bc1a4f79e0945ffea + requires_dist: + - ua-parser-builtins + - pyyaml ; extra == 'yaml' + - google-re2 ; extra == 're2' + - ua-parser-rs ; extra == 'regex' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl + name: ua-parser-builtins + version: '202601' + sha256: f5dc93b0f53724dcd5c3eb79edb0aea281cb304a2c02a9436cbeb8cfb8bc4ad1 + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 md5: 71b24316859acd00bdb8b38f5e2ce328 @@ -6468,6 +8149,17 @@ packages: - pkg:pypi/unicodedata2?source=hash-mapping size: 405140 timestamp: 1763054857048 +- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0 + md5: e7cb0f5745e4c5035a460248334af7eb + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/uri-template?source=hash-mapping + size: 23990 + timestamp: 1733323714454 - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda sha256: fec8e52955fc314580a93dee665349bf430ce6df19019cea3fae7ec60f732bdd md5: 649890a63cc818b24fbbf0572db221a5 @@ -6491,24 +8183,9 @@ packages: purls: [] size: 49181 timestamp: 1715010467661 -- 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/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda - sha256: a66fc716c9dc6eb048c40381b0d1c5842a1d74bba7ce3d16d80fc0a7232d8644 - md5: fb84f0f6ee8a0ad67213cd1bea98bf5b +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a + md5: 9272daa869e03efe68833e3dc7a02130 depends: - backports.zstd >=1.0.0 - brotli-python >=1.2.0 @@ -6518,9 +8195,15 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/urllib3?source=compressed-mapping - size: 102817 - timestamp: 1765212810619 + - pkg:pypi/urllib3?source=hash-mapping + size: 103172 + timestamp: 1767817860341 +- pypi: https://files.pythonhosted.org/packages/8f/1c/20bb3d7b2bad56d881e3704131ddedbb16eb787101306887dff349064662/user_agents-2.2.0-py3-none-any.whl + name: user-agents + version: 2.2.0 + sha256: a98c4dc72ecbc64812c4534108806fb0a0b3a11ec3fd1eafe807cee5b0a942e7 + requires_dist: + - ua-parser>=0.10.0 - pypi: https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl name: validators version: 0.35.0 @@ -6528,53 +8211,53 @@ packages: requires_dist: - eth-hash[pycryptodome]>=0.7.0 ; extra == 'crypto-eth-addresses' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf - md5: ef02bbe151253a72b8eda264a935db66 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a + md5: 1e610f2416b6acdd231c5f573d754a0f depends: - - vc14_runtime >=14.42.34433 + - vc14_runtime >=14.44.35208 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 + size: 19356 + timestamp: 1767320221521 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 + md5: 37eb311485d2d8b2c419449582046a42 depends: - ucrt >=10.0.20348.0 - - vcomp14 14.44.35208 h818238b_32 + - vcomp14 14.44.35208 h818238b_34 constrains: - - vs2015_runtime 14.44.35208.* *_32 + - vs2015_runtime 14.44.35208.* *_34 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 + size: 683233 + timestamp: 1767320219644 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 + md5: 242d9f25d2ae60c76b38a5e42858e51d depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.44.35208.* *_32 + - vs2015_runtime 14.44.35208.* *_34 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary purls: [] - size: 114846 - timestamp: 1760418593847 -- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_32.conda - sha256: 65cea43f4de99bc81d589e746c538908b2e95aead9042fecfbc56a4d14684a87 - md5: dfc1e5bbf1ecb0024a78e4e8bd45239d + size: 115235 + timestamp: 1767320173250 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda + sha256: 63ff4ec6e5833f768d402f5e95e03497ce211ded5b6f492e660e2bfc726ad24d + md5: f276d1de4553e8fca1dfb6988551ebb4 depends: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] - size: 18919 - timestamp: 1760418632059 + size: 19347 + timestamp: 1767320221943 - conda: https://conda.anaconda.org/conda-forge/noarch/wasabi-1.1.3-pyhd8ed1ab_1.conda sha256: fd0635cbd4f76916e2ec39d0c359e930fc377ff6be1ac13cc375cf7fa8a3eebc md5: fa76741f59d973f2e07d810ee124cb25 @@ -6586,11 +8269,17 @@ packages: - pkg:pypi/wasabi?source=hash-mapping size: 28780 timestamp: 1740630860493 -- pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - name: wcwidth - version: 0.2.14 - sha256: a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1 - requires_python: '>=3.6' +- 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/weasel-0.4.3-pyhd8ed1ab_0.conda sha256: a66313ea2b68840fae66a0d71c3668939ab557d1ac76b633745b36d7a02d5206 md5: 86102837379dce9cbe670da42e60d4b2 @@ -6612,6 +8301,51 @@ packages: - pkg:pypi/weasel?source=hash-mapping size: 43362 timestamp: 1763083904946 +- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6 + md5: 6639b6b0d8b5a284f027a2003669aa65 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webcolors?source=hash-mapping + size: 18987 + timestamp: 1761899393153 +- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 + md5: 2841eb5bfc75ce15e9a0054b98dcd64d + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webencodings?source=hash-mapping + size: 15496 + timestamp: 1733236131358 +- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + sha256: 42a2b61e393e61cdf75ced1f5f324a64af25f347d16c60b14117393a98656397 + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/websocket-client?source=hash-mapping + size: 61391 + timestamp: 1759928175142 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda + sha256: d6cf2f0ebd5e09120c28ecba450556ce553752652d91795442f0e70f837126ae + md5: bdbd7385b4a67025ac2dba4ef8cb6a8f + depends: + - packaging >=24.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 31858 + timestamp: 1769139207397 - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f md5: 46e441ba871f524e2b067929da3051c2 @@ -6623,6 +8357,13 @@ packages: - pkg:pypi/win-inet-pton?source=hash-mapping size: 9555 timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + sha256: 9df10c5b607dd30e05ba08cbd940009305c75db242476f4e845ea06008b0a283 + md5: 1cee351bf20b830d991dbe0bc8cd7dfe + license: MIT + license_family: MIT + purls: [] + size: 1176306 - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-2.0.1-py312h80b0991_1.conda sha256: 2258e7766c912b387b33ff7aa743a6e02359d9faacb5b6a0e824c2b1d7b08522 md5: 44ae6baf386bc605c091fa40bed30434 @@ -6651,30 +8392,30 @@ packages: - pkg:pypi/wrapt?source=hash-mapping size: 84777 timestamp: 1762595250957 -- conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-hd0321b6_0.conda - sha256: 8769f3f08e78f26fdf6f530efc84a48d05ce7d8dbde405bd81d87e5dc43cb2d9 - md5: 3ad24748832587b79c7a1f96ca874376 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda + sha256: 214dc4f27f9160830bb5b82bdc53a943a052071b0f23b8d4771a2f4e469763c6 + md5: 21338f14e1226ca108452b770e770455 depends: - __osx >=10.13 - - icu >=75.1,<76.0a0 - - libcxx >=17 + - icu >=78.1,<79.0a0 + - libcxx >=19 license: Apache-2.0 license_family: Apache purls: [] - size: 1353665 - timestamp: 1728976213621 -- conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-he0c23c2_0.conda - sha256: bba9bc42593fc8e1da32bc8f810c305ab3fd230689c41b59e6fe77ab79cbe7d7 - md5: 9c600d9aaba64595d0c3561f1b9d700b + size: 1358256 + timestamp: 1766327914262 +- conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + sha256: 9583a8fcf01c59b26a4285bc151b6315fd0bd504e1628f004519dc871eb17073 + md5: d1097e01041cfed41c81f1e3d1f52572 depends: - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] - size: 3560268 - timestamp: 1728976534703 + size: 3598939 + timestamp: 1766327729418 - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda sha256: 928f28bd278c7da674b57d71b2e7f4ac4e7c7ce56b0bf0f60d6a074366a2e76d md5: 47f1b8b4a76ebd0cd22bd7153e54a4dc @@ -6730,6 +8471,31 @@ packages: - pkg:pypi/xyzservices?source=hash-mapping size: 51128 timestamp: 1763813786075 +- conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 + md5: a645bb90997d3fc2aea0adf6517059bd + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 79419 + timestamp: 1753484072608 +- 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 - pypi: https://files.pythonhosted.org/packages/51/38/347d1fcde4edabd338d5872ca5759ccfb95ff1cf5207dafded981fd08c4f/yara_python-4.5.4.tar.gz name: yara-python version: 4.5.4 @@ -6738,38 +8504,70 @@ packages: name: yara-python version: 4.5.4 sha256: bf14a8af06b2b980a889bdc3f9e8ccd6e703d2b3fa1c98da5fd3a1c3b551eb47 -- conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.22.0-pyh7db6752_0.conda - sha256: b04271f56c68483b411c5465afff73b8eabdea564e942f0e7afed06619272635 - md5: ca3c00c764cee005798a518cba79885c +- conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.22.0-py312hacf3034_0.conda + sha256: c030ea7a6f88a54ded713db44420091e1606a04ea57b2cb2b4e00c5c41594929 + md5: e441d2fc9a075115c08ec037d78d94d9 depends: + - __osx >=10.13 - idna >=2.0 - multidict >=4.0 - propcache >=0.2.1 - - python >=3.10 - track_features: - - yarl_no_compile + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 73066 - timestamp: 1761337117132 -- conda: https://conda.anaconda.org/conda-forge/osx-64/yarl-1.22.0-py312hacf3034_0.conda - sha256: c030ea7a6f88a54ded713db44420091e1606a04ea57b2cb2b4e00c5c41594929 - md5: e441d2fc9a075115c08ec037d78d94d9 + size: 143615 + timestamp: 1761337116037 +- conda: https://conda.anaconda.org/conda-forge/win-64/yarl-1.22.0-py312h05f76fc_0.conda + sha256: b622ef03b033a1c3984cb3e47e198370f23bf239c579a0c04f9179237fbb541b + md5: d4975947624e265fa594b86ce148a0c1 depends: - - __osx >=10.13 - idna >=2.0 - multidict >=4.0 - propcache >=0.2.1 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/yarl?source=hash-mapping - size: 143615 - timestamp: 1761337116037 + size: 141998 + timestamp: 1761337573480 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h6c33b1e_9.conda + sha256: 30aa5a2e9c7b8dbf6659a2ccd8b74a9994cdf6f87591fcc592970daa6e7d3f3c + md5: d940d809c42fbf85b05814c3290660f5 + depends: + - __osx >=10.13 + - 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: 259628 + timestamp: 1757371000392 +- 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-pyhcf101f3_1.conda sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae md5: 30cd29cb87d819caead4d55184c1d115 @@ -6806,48 +8604,29 @@ packages: purls: [] size: 107439 timestamp: 1727963788936 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h53ec75d_0.conda - sha256: 9183b2ada178d83ca6f8a66ba2ddcfb5f2476c2e866a4609c1f84dd5f32d796e - md5: 1e979f90e823b82604ab1da7e76c75e5 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda + sha256: 945725769bc668435af1c23733c3c1dba01eb115ad3bad5393c9df2e23de6cfc + md5: cdd69480d52f2b871fad1a91324d9942 depends: - __osx >=10.13 - libcxx >=19 license: Zlib + license_family: Other purls: [] - size: 135199 - timestamp: 1764716055794 -- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h5112557_0.conda - sha256: 331e63a801efc9aa47e0a7f7be5becc81d9c52c1163308182078108e003c12e5 - md5: 2b4f8712b09b5fd3182cda872ce8482c + size: 120585 + timestamp: 1766077108928 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda + sha256: e058e925bed8d9e5227cecc098e02992813046fd89206194435e975a9f6eff56 + md5: bc2fba648e1e784c549e20bbe1a8af40 depends: + - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 license: Zlib + license_family: Other purls: [] - size: 134848 - timestamp: 1764715928393 -- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py312he5662c2_1.conda - sha256: 49241574c373331ae63d9cb4978836db3b2571176a7db81fe48436c84ce38ff4 - md5: e9e25949b682e95535068bae33153ba6 - 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 - - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 374949 - timestamp: 1762512770373 + size: 123890 + timestamp: 1766076739436 - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f md5: 727109b184d680772e3122f40136d5ca @@ -6868,6 +8647,7 @@ packages: - ucrt >=10.0.20348.0 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause + license_family: BSD purls: [] size: 388453 timestamp: 1764777142545 diff --git a/pixi.toml b/pixi.toml index bbdf2aa..5cca1e0 100644 --- a/pixi.toml +++ b/pixi.toml @@ -17,21 +17,29 @@ pandas = ">=2.3.3,<3" requests = ">=2.32.5,<3" plotly = ">=6.5.0,<7" geoip2 = ">=4.8.0,<5" -gdal = ">=3.12.0,<4" +gdal = ">=3.12.1,<4" pandas-stubs = ">=2.3.3.251201,<3" -pyarrow = ">=22.0.0,<23" +pyarrow = ">=23.0.0,<24" geopandas = ">=1.1.1,<2" geocoder = ">=1.38.1,<2" pyrosm = ">=0.6.2,<0.7" curl = ">=8.17.0,<9" -textstat = ">=0.7.11,<0.8" +textstat = ">=0.7.12,<0.8" nltk = ">=3.9.2,<4" spacy = ">=3.8.11,<4" lingua-language-detector = ">=1.3.4,<2" google-cloud-translate = ">=3.23.0,<4" +sqlite = ">=3.51.2,<4" +sklearn-compat = ">=0.1.5,<0.2" +sklearn-pandas = ">=2.2.0,<3" +scikit-learn = ">=1.8.0,<2" +pixi-kernel = ">=0.7.1,<0.8" +libsqlite = ">=3.51.2,<4" +sqlite-utils = ">=3.39,<4" [pypi-dependencies] scipy = "*" +statsmodels = "*" chardet = ">=5.2.0, <6" charset-normalizer = "*" ftfy = ">=6.3.1, <7" @@ -39,3 +47,5 @@ yara-python = ">=4.5.4, <5" ioc-finder = ">=5.0.3, <6" validators = ">=0.35.0, <0.36" deep-translator = ">=1.11.4, <2" +prince = ">=0.16.5, <0.17" +user-agents = ">=2.2.0, <3" diff --git a/script.py b/script.py index 03c414e..09d46aa 100644 --- a/script.py +++ b/script.py @@ -1,13 +1,39 @@ -#%% library init +# %% [markdown] +# # Cybersecurity Attacks Dataset - Exploratory Data Analysis +# +# This notebook performs comprehensive EDA on a cybersecurity attacks dataset, +# including IP geolocation analysis, attack pattern visualization, and +# statistical analysis of network traffic features. + +# %% Library Initialization +# ============================================================================= +# LIBRARY IMPORTS AND CONFIGURATION +# ============================================================================= +# This cell imports all required libraries and configures the environment: +# - pandas: Data manipulation and analysis +# - prince: Multiple Correspondence Analysis (MCA) for categorical data +# - plotly: Interactive visualizations +# - geoip2/django: IP geolocation services +# - sklearn: Machine learning metrics (Matthews correlation) +# - user_agents: Browser/device detection from User-Agent strings import pandas as pd import prince import plotly.io import os import numpy as np -os.environ[ "GDAL_LIBRARY_PATH" ] = "C:/Users/KalooIna/anaconda3/envs/cybersecurity_attacks/Library/bin/gdal311.dll" # make sure this is the name of your gdal.dll file ( rename it to appropriate version if necessary ) + +# Optional GDAL configuration for geospatial operations +# Uncomment and adjust path if needed for your environment +""" +os.environ["GDAL_LIBRARY_PATH"] = ( + "C:/Users/KalooIna/anaconda3/envs/cybersecurity_attacks/Library/bin/gdal311.dll" +) """ import geoip2.database -plotly.io.renderers.default = "browser" # plotly settings for browser settings + +# Configure Plotly to render charts in the default browser +plotly.io.renderers.default = "browser" + import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots as subp @@ -17,1177 +43,2098 @@ from user_agents import parse from user_agents import parse as ua_parse from django.conf import settings -# django settings for geoIP2 -settings.configure( - GEOIP_PATH = "data/geolite2_db" , - INSTALLED_APPS = [ "django.contrib.gis" ] +from django.contrib.gis.geoip2 import GeoIP2 + +# ----------------------------------------------------------------------------- +# Django GeoIP2 Configuration +# Configure Django settings for IP geolocation using MaxMind GeoLite2 database +# The database must be downloaded from MaxMind and placed in ./geolite2_db/ +# ----------------------------------------------------------------------------- +if not settings.configured: + settings.configure( + GEOIP_PATH="./geolite2_db", INSTALLED_APPS=["django.contrib.gis"] ) django.setup() -from django.contrib.gis.geoip2 import GeoIP2 + +# Initialize GeoIP2 lookup service geoIP = GeoIP2() -# useful links +# Reference URLs for GeoIP2 setup and documentation maxmind_geoip2_db_url = "https://www.maxmind.com/en/accounts/1263991/geoip/downloads" geoip2_doc_url = "https://geoip2.readthedocs.io/en/latest/" geoip2_django_doc_url = "https://docs.djangoproject.com/en/5.2/ref/contrib/gis/geoip2/" -# loadding dataset -# df = pd.read_csv( "data/cybersecurity_attacks.csv" ) -df = pd.read_csv( "data/df.csv" , sep = "|" , index_col = 0 ) - -# transform categorical variable to binary variables [ 0 , 1 ] -def catvar_mapping( col_name , values , name = None) : - df1 = df.copy( deep = True ) - if name is None : +# ----------------------------------------------------------------------------- +# Load Dataset +# The dataset contains network traffic records with attack classifications +# Columns include: timestamps, IP addresses, ports, protocols, attack types, etc. +# ----------------------------------------------------------------------------- +df = pd.read_csv("data/df.csv", sep="|", index_col=0) + + +# ============================================================================= +# UTILITY FUNCTIONS +# ============================================================================= + +def catvar_mapping(col_name, values, name=None): + """ + Transform categorical variables to binary (0/1) indicator columns. + + This function performs one-hot style encoding for specified categorical values, + creating new binary columns that indicate presence/absence of each category. + + Parameters: + ----------- + col_name : str + Name of the categorical column to transform + values : list + List of categorical values to create binary indicators for + name : list, optional + Custom names for the new binary columns. If None, uses the values. + Use ["/"] to replace the original column in-place. + + Returns: + -------- + DataFrame + Copy of the dataframe with new binary columns added + + Example: + -------- + # Create "Protocol UDP" and "Protocol ICMP" binary columns + df = catvar_mapping("Protocol", ["UDP", "ICMP"]) + """ + df1 = df.copy(deep=True) + if name is None: name = values - elif ( len( name ) == 1 ) and ( name != [ "/" ]) : - col_target = f"{ col_name } { name[ 0 ]}" - df1 = df1.rename( columns = { col_name : col_target }) + elif (len(name) == 1) and (name != ["/"]): + col_target = f"{col_name} {name[0]}" + df1 = df1.rename(columns={col_name: col_target}) col_name = col_target - name = [ col_target ] - col = df1.columns.get_loc( col_name ) + 1 - for val , nm in zip( values , name ) : - if ( nm == "/" ) : + name = [col_target] + col = df1.columns.get_loc(col_name) + 1 + for val, nm in zip(values, name): + if nm == "/": col_target = col_name - elif ( len( name ) == 1 ) : + elif len(name) == 1: col_target = nm - else : - col_target = f"{ col_name } { nm }" - df1.insert( col , col_target , value = pd.NA ) - bully = df1[ col_name ] == val - df1.loc[ bully , col_target ] = 1 - df1.loc[ ~ bully , col_target ] = 0 + else: + col_target = f"{col_name} {nm}" + if col_target not in df1.columns: + df1.insert(col, col_target, value=pd.NA) + bully = df1[col_name] == val + df1.loc[bully, col_target] = 1 + df1.loc[~bully, col_target] = 0 col += 1 return df1 - -# pieichart generator for a column -def piechart_col( col , names = None ) : - if names is None : - fig = px.pie( - values = df[ col ].value_counts() , - names = df[ col ].value_counts().index , - ) + + +def piechart_col(col, names=None): + """ + Generate an interactive pie chart for a categorical column. + + Parameters: + ----------- + col : str + Column name to visualize + names : list, optional + Custom labels for pie chart segments. If None, uses actual values. + """ + if names is None: + fig = px.pie( + values=df[col].value_counts(), + names=df[col].value_counts().index, + title=f"Distribution of {col}", + ) + fig.update_traces( + textposition='inside', + textinfo='percent+label', + hovertemplate="%{label}
Count: %{value}
Percentage: %{percent}" + ) fig.show() - else : - fig = px.pie( - values = df[ col ].value_counts() , - names = names , - ) + else: + fig = px.pie( + values=df[col].value_counts(), + names=names, + title=f"Distribution of {col}", + ) + fig.update_traces( + textposition='inside', + textinfo='percent+label', + hovertemplate="%{label}
Count: %{value}
Percentage: %{percent}" + ) fig.show() -# transforms IP addresses to infos : longitude , latitude , country , city -def ip_to_coords( ip_address ) : - print( ip_address ) - ret = pd.Series( dtype = object ) - try : - res = geoIP.geos( ip_address ).wkt - lon , lat = res.replace( "(" , "" ).replace( ")" , "" ).split()[ 1 : ] - ret = pd.concat([ ret , pd.Series([ lat , lon ])] , ignore_index = True ) - except : - ret = pd.concat([ ret , pd.Series([ pd.NA , pd.NA ])] , ignore_index = True ) - try : - res = geoIP.city( ip_address ) - ret = pd.concat([ ret , pd.Series([ res[ "country_name" ] , res[ "city" ]])] , ignore_index = True ) - except : - ret = pd.concat([ ret , pd.Series([ pd.NA , pd.NA ])] , ignore_index = True ) + +def ip_to_coords(ip_address): + """ + Convert an IP address to geographic coordinates and location info. + + Uses MaxMind GeoIP2 database to lookup geographic information for IP addresses. + + Parameters: + ----------- + ip_address : str + IPv4 or IPv6 address to geolocate + + Returns: + -------- + pd.Series + Series containing [latitude, longitude, country_name, city] + Returns NA values for any fields that cannot be resolved + """ + print(ip_address) + ret = pd.Series(dtype=object) + try: + res = geoIP.geos(ip_address).wkt + lon, lat = res.replace("(", "").replace(")", "").split()[1:] + ret = pd.concat([ret, pd.Series([lat, lon])], ignore_index=True) + except: + ret = pd.concat([ret, pd.Series([pd.NA, pd.NA])], ignore_index=True) + try: + res = geoIP.city(ip_address) + ret = pd.concat( + [ret, pd.Series([res["country_name"], res["city"]])], ignore_index=True + ) + except: + ret = pd.concat([ret, pd.Series([pd.NA, pd.NA])], ignore_index=True) return ret - - -#%% EDA - -# renaming columns -df = df.rename( columns = { - "Timestamp" : "date" , - "Source Port" : "Source Port ephemeral" , - "Destination Port" : "Destination Port ephemeral" , - "Alerts/Warnings" : "Alert Trigger" , - }) -df = df.drop( "User Information" , axis = 1 ) -print( df.describe()) - -# generation of crosstables for cat variables + + +# %% [markdown] +# ## Exploratory Data Analysis (EDA) +# This section performs initial data exploration: +# - Column renaming for clarity +# - Missing value analysis +# - Target variable distribution (Attack Type) +# - Temporal distribution of attacks + +# %% EDA - Data Preparation and Overview +# ============================================================================= +# DATA PREPARATION +# ============================================================================= +# Rename columns for better readability and consistency +# - "Timestamp" -> "date" for temporal analysis +# - Port columns renamed to indicate ephemeral port analysis +# - Alerts/Warnings -> Alert Trigger for binary encoding +df = df.rename( + columns={ + "Timestamp": "date", + "Source Port": "Source Port ephemeral", + "Destination Port": "Destination Port ephemeral", + "Alerts/Warnings": "Alert Trigger", + } +) + +# Display summary statistics for numerical columns +print("=" * 60) +print("DATASET SUMMARY STATISTICS") +print("=" * 60) +print(df.describe()) + +# ----------------------------------------------------------------------------- +# Cross-tabulation utility function +# Used to analyze relationships between categorical variables +# ----------------------------------------------------------------------------- crosstabs = {} -def crosstab_col( col ,target , name_col , name_target ) : - name_tab = f"{ name_col }_x_{ name_target }" - crosstabs[ name_tab ] = pd.crosstab( df[ target ] , df[ col ] , normalize = True ) * 100 - -# NAs -df_s0 = df.shape[ 0 ] -for col in df.columns : - NA_n = sum( df[ col ].isna()) - if NA_n > 0 : - print( f"number of NAs in { col } = { NA_n } / { df_s0 } = { NA_n / df_s0 } " ) - -# Attack Type !!!! TARGET VARIABLE !!!! -col_name = "Attack Type" -print( df[ col_name ].value_counts()) -piechart_col( col_name ) -# date + +def crosstab_col(col, target, name_col, name_target): + """ + Create a normalized cross-tabulation between two categorical columns. + + Parameters: + ----------- + col : str + Column name for the independent variable + target : str + Column name for the dependent/target variable + name_col, name_target : str + Short names for labeling the crosstab result + """ + name_tab = f"{name_col}_x_{name_target}" + crosstabs[name_tab] = pd.crosstab(df[target], df[col], normalize=True) * 100 + + +# ----------------------------------------------------------------------------- +# Missing Value Analysis +# Identify columns with missing data and their percentages +# ----------------------------------------------------------------------------- +print("\n" + "=" * 60) +print("MISSING VALUE ANALYSIS") +print("=" * 60) +df_s0 = df.shape[0] +for col in df.columns: + NA_n = sum(df[col].isna()) + if NA_n > 0: + print(f"Missing values in {col}: {NA_n:,} / {df_s0:,} ({100*NA_n/df_s0:.2f}%)") + +# ----------------------------------------------------------------------------- +# TARGET VARIABLE ANALYSIS: Attack Type +# This is the primary classification target with 3 classes: +# - Malware: Malicious software attacks +# - Intrusion: Unauthorized access attempts +# - DDoS: Distributed Denial of Service attacks +# ----------------------------------------------------------------------------- +print("\n" + "=" * 60) +print("TARGET VARIABLE: Attack Type Distribution") +print("=" * 60) +col_name = "Attack Type" +print(df[col_name].value_counts()) +piechart_col(col_name) + +# ----------------------------------------------------------------------------- +# TEMPORAL ANALYSIS: Attack Distribution Over Time +# Analyze when attacks occurred to identify patterns or trends +# ----------------------------------------------------------------------------- +print("\n" + "=" * 60) +print("TEMPORAL DISTRIBUTION") +print("=" * 60) col_name = "date" -df[ col_name ] = pd.to_datetime( df[ col_name ]) -date_end = max( df[ col_name ]) -date_start = min( df[ col_name ]) -print( f"dates go from { date_start } and { date_end }" ) -fig = px.histogram( df , col_name ) +df[col_name] = pd.to_datetime(df[col_name]) +date_end = max(df[col_name]) +date_start = min(df[col_name]) +print(f"Dataset time range: {date_start} to {date_end}") +print(f"Duration: {(date_end - date_start).days} days") + +fig = px.histogram( + df, + x=col_name, + title="Distribution of Cyber Attacks Over Time", + labels={"date": "Date", "count": "Number of Attacks"}, + color_discrete_sequence=["#636EFA"] +) +fig.update_layout( + xaxis_title="Date", + yaxis_title="Number of Attacks", + showlegend=False +) fig.show() -#%% IP address +# %% [markdown] +# ## IP Address Geolocation Analysis +# This section: +# - Extracts geographic information from Source and Destination IP addresses +# - Visualizes global distribution of attack origins and targets +# - Analyzes proxy usage patterns in the network traffic + +# %% IP Address Geolocation +# ============================================================================= +# IP ADDRESS GEOLOCATION EXTRACTION +# ============================================================================= +# Convert IP addresses to geographic coordinates using MaxMind GeoIP2 +# This enables geographic visualization and analysis of attack patterns + +print("=" * 60) +print("IP ADDRESS GEOLOCATION PROCESSING") +print("=" * 60) i = 2 -for destsource in [ "Source" , "Destination" ] : - col = df.columns.get_loc( f"{ destsource } IP Address" ) + 1 - df.insert( col , f"{ destsource } IP latitude" , value = pd.NA ) - df.insert( col + 1 , f"{ destsource } IP longitude" , value = pd.NA ) - df.insert( col + 2 , f"{ destsource } IP country" , value = pd.NA ) - df.insert( col + 3 , f"{ destsource } IP city" , value = pd.NA ) - df[[ f"{ destsource } IP latitude" , f"{ destsource } IP longitude" , f"{ destsource } IP country" , f"{ destsource } IP city" ]] = df[ f"{ destsource } IP Address" ].apply( lambda x : ip_to_coords( x )) - -## IP address map graph +for destsource in ["Source", "Destination"]: + geo_columns = [ + f"{destsource} IP latitude", + f"{destsource} IP longitude", + f"{destsource} IP country", + f"{destsource} IP city", + ] + + # Skip geolocation if already processed (columns exist) + if all(col in df.columns for col in geo_columns): + print(f"{destsource} IP geolocation already processed - skipping") + continue + + print(f"Processing {destsource} IP addresses...") + col = df.columns.get_loc(f"{destsource} IP Address") + 1 + + # Insert new columns for geographic data + for i, geo_col in enumerate(geo_columns): + if geo_col not in df.columns: + df.insert(col + i, geo_col, value=pd.NA) + + # Apply geolocation lookup to each IP address + geo_data = df[f"{destsource} IP Address"].apply(ip_to_coords) + geo_df = pd.DataFrame(geo_data.tolist(), index=df.index) + + df[geo_columns[0]] = geo_df[0] # Latitude + df[geo_columns[1]] = geo_df[1] # Longitude + df[geo_columns[2]] = geo_df[2] # Country + df[geo_columns[3]] = geo_df[3] # City + +# ----------------------------------------------------------------------------- +# GLOBAL IP DISTRIBUTION MAP +# Orthographic projection showing attack source and destination locations +# Left globe: Source IPs (where attacks originate) +# Right globe: Destination IPs (attack targets) +# ----------------------------------------------------------------------------- fig = subp( - rows = 1 , - cols = 2 , - specs = [[ - { "type" : "scattergeo" } , - { "type" : "scattergeo" } , - ]] , - subplot_titles = ( - "Source IP locations" , - "Destination IP locations" - ) - ) + rows=1, + cols=2, + specs=[ + [ + {"type": "scattergeo"}, + {"type": "scattergeo"}, + ] + ], + subplot_titles=( + "Attack Origin Locations (Source IPs)", + "Attack Target Locations (Destination IPs)" + ), +) + +# Source IP locations - Blue markers fig.add_trace( go.Scattergeo( - lat = df[ "Source IP latitude" ] , - lon = df[ "Source IP longitude" ] , - mode = "markers" , - marker = { - "size" : 5 , - "color" : "blue" - } - ) , - row = 1 , - col = 1 - ) + lat=df["Source IP latitude"], + lon=df["Source IP longitude"], + mode="markers", + marker={"size": 5, "color": "blue", "opacity": 0.6}, + name="Source IPs", + hovertemplate="Attack Origin
Lat: %{lat:.2f}
Lon: %{lon:.2f}" + ), + row=1, + col=1, +) + +# Destination IP locations - Blue markers fig.add_trace( go.Scattergeo( - lat = df[ "Destination IP latitude" ] , - lon = df[ "Destination IP longitude" ] , - mode = "markers" , - marker = { - "size" : 5 , - "color" : "blue" - } - ) , - row = 1 , - col = 2 - ) + lat=df["Destination IP latitude"], + lon=df["Destination IP longitude"], + mode="markers", + marker={"size": 5, "color": "blue", "opacity": 0.6}, + name="Destination IPs", + hovertemplate="Attack Target
Lat: %{lat:.2f}
Lon: %{lon:.2f}" + ), + row=1, + col=2, +) + fig.update_geos( - projection_type = "orthographic" , - showcountries = True , - showland = True , - # landcolor = "LightGreen" + projection_type="orthographic", + showcountries=True, + showland=True, + landcolor="lightgray", + countrycolor="white", + oceancolor="lightblue", + showocean=True ) fig.update_layout( - height = 750 , - margin = { - "r" : 0 , - "t" : 80 , - "l" : 0 , - "b" : 0 - } , - title_text = "IP Address Locations" , - title_x = 0.5 + height=750, + margin={"r": 0, "t": 80, "l": 0, "b": 0}, + title_text="Global Distribution of Cyber Attack Traffic", + title_x=0.5, + title_font_size=18, + showlegend=True, + legend=dict( + orientation="h", + yanchor="bottom", + y=-0.1, + xanchor="center", + x=0.5 + ) ) fig.show() -# Proxy Information +# ----------------------------------------------------------------------------- +# PROXY INFORMATION COLUMNS +# Prepare columns for proxy IP geolocation data +# Proxies may be used to mask the true origin of attacks +# ----------------------------------------------------------------------------- col_name = "Proxy Information" -# print( df[ col_name ].value_counts()) -col = df.columns.get_loc( col_name ) -df.insert( col + 1 , "Proxy latitude" , value = pd.NA ) -df.insert( col + 2 , "Proxy longitude" , value = pd.NA ) -df.insert( col + 3 , "Proxy country" , value = pd.NA ) -df.insert( col + 4 , "Proxy city" , value = pd.NA ) -df[[ "Proxy latitude" , "Proxy longitude" , "Proxy country" , "Proxy city" ]] = df[ "Proxy Information" ].apply( lambda x : ip_to_coords( x )) - -def sankey_diag_IPs( ntop ) : +col = df.columns.get_loc(col_name) + +for i, new_col in enumerate( + ["Proxy latitude", "Proxy longitude", "Proxy country", "Proxy city"], start=1 +): + if new_col not in df.columns: + df.insert(col + i, new_col, value=pd.NA) + + +def sankey_diag_IPs(ntop): + """ + Create a Sankey diagram showing traffic flow between Source, Proxy, and Destination countries. + + This visualization shows how network traffic flows geographically: + - Left nodes: Source IP countries (where traffic originates) + - Middle nodes: Proxy countries (intermediate routing points) + - Right nodes: Destination IP countries (final targets) + + Parameters: + ----------- + ntop : int + Number of top countries to display (others grouped as "other") + + Returns: + -------- + DataFrame + Aggregated IP flow counts grouped by source, proxy, and destination + """ IPs_col = {} - labels = pd.Series( dtype = "string" ) - for IPid , dfcol in zip([ "SIP" , "DIP" , "PIP" ] , [ "Source IP country" , "Destination IP country" , "Proxy country" ]) : - IPs_col[ IPid ] = df[ dfcol ].copy( deep = True ) - IPs_col[ f"{ IPid }labs" ] = pd.Series( IPs_col[ IPid ].value_counts().index[ : ntop ]) - bully = ( IPs_col[ IPid ].isin( IPs_col[ f"{IPid}labs" ]) | IPs_col[ IPid ].isna()) - IPs_col[ IPid ].loc[ ~ bully ] = "other" - IPs_col[ f"{ IPid }labs" ] = f"{ IPid } " + pd.concat([ IPs_col[ f"{ IPid }labs" ] , pd.Series([ "other" ])]) - labels = pd.concat([ labels , IPs_col[ f"{ IPid }labs" ]]) - labels = list( labels.reset_index( drop = True )) - - aggregIPs = pd.DataFrame({ - "SIP" : IPs_col[ "SIP" ] , - "PIP" : IPs_col[ "PIP" ] , - "DIP" : IPs_col[ "DIP" ] , - }) - aggregIPs = aggregIPs.groupby( by = [ - "SIP" , - "PIP" , - "DIP" - ]).size().to_frame( "count" ) + labels = pd.Series(dtype="string") + + # Process each IP type: Source (SIP), Destination (DIP), Proxy (PIP) + for IPid, dfcol in zip( + ["SIP", "DIP", "PIP"], + ["Source IP country", "Destination IP country", "Proxy country"], + ): + IPs_col[IPid] = df[dfcol].copy(deep=True) + IPs_col[f"{IPid}labs"] = pd.Series(IPs_col[IPid].value_counts().index[:ntop]) + bully = IPs_col[IPid].isin(IPs_col[f"{IPid}labs"]) | IPs_col[IPid].isna() + IPs_col[IPid].loc[~bully] = "other" + IPs_col[f"{IPid}labs"] = f"{IPid} " + pd.concat( + [IPs_col[f"{IPid}labs"], pd.Series(["other"])] + ) + labels = pd.concat([labels, IPs_col[f"{IPid}labs"]]) + labels = list(labels.reset_index(drop=True)) + + # Aggregate traffic flows between countries + aggregIPs = pd.DataFrame( + { + "SIP": IPs_col["SIP"], + "PIP": IPs_col["PIP"], + "DIP": IPs_col["DIP"], + } + ) + aggregIPs = aggregIPs.groupby(by=["SIP", "PIP", "DIP"]).size().to_frame("count") - # computation of source , target , value + # Build Sankey diagram links source = [] target = [] value = [] nlvl = aggregIPs.index.nlevels - for idx , row in aggregIPs.iterrows() : + for idx, row in aggregIPs.iterrows(): row_labs = [] - if ( nlvl == 1 ) : - row_labs.append( f"{ aggregIPs.index.name } { idx }" ) - else : - for i , val in enumerate( idx ) : - row_labs.append( f"{ aggregIPs.index.names[ i ] } { val }" ) - for i in range( 0 , nlvl - 1 ) : - source.append( labels.index( row_labs[ i ])) - target.append( labels.index( row_labs[ i + 1 ])) - value.append( row.item() ) - - # plot the sankey diagram - n = len( labels ) + if nlvl == 1: + row_labs.append(f"{aggregIPs.index.name} {idx}") + else: + for i, val in enumerate(idx): + row_labs.append(f"{aggregIPs.index.names[i]} {val}") + for i in range(0, nlvl - 1): + source.append(labels.index(row_labs[i])) + target.append(labels.index(row_labs[i + 1])) + value.append(row.item()) + + # Create Sankey diagram with Inferno color scale + n = len(labels) colors = px.colors.sample_colorscale( - px.colors.sequential.Inferno , - [ i / ( n - 1 ) for i in range( n )] - ) - fig = go.Figure( data = [ go.Sankey( - node = dict( - pad = 15 , - thickness = 20 , - line = dict( - color = "rgba( 0 , 0 , 0 , 0.1 )" , - width = 0.5 - ) , - label = labels , - color = colors , - ) , - link = dict( - source = source , - target = target , - value = value - ))]) + px.colors.sequential.Inferno, [i / (n - 1) for i in range(n)] + ) + fig = go.Figure( + data=[ + go.Sankey( + node=dict( + pad=15, + thickness=20, + line=dict(color="rgba(0, 0, 0, 0.1)", width=0.5), + label=labels, + color=colors, + hovertemplate="%{label}
Total flows: %{value}" + ), + link=dict( + source=source, + target=target, + value=value, + hovertemplate="Flow
From: %{source.label}
To: %{target.label}
Count: %{value}" + ), + ) + ] + ) fig.update_layout( - title_text = "Sankey Diagram" , - # font_family = "Courier New" , - # font_color = "blue" , - font_size = 20 , - title_font_family = "Avenir" , - title_font_color = "black", - ) + title_text="Network Traffic Flow: Source → Proxy → Destination Countries", + title_font_size=18, + font_size=14, + title_font_family="Avenir", + title_font_color="black", + annotations=[ + dict(x=0.01, y=1.05, text="Source Countries", showarrow=False, font_size=12), + dict(x=0.5, y=1.05, text="Proxy Countries", showarrow=False, font_size=12), + dict(x=0.99, y=1.05, text="Destination Countries", showarrow=False, font_size=12), + ] + ) fig.show() - + return aggregIPs -aggregIPs = sankey_diag_IPs( 10 ) -#%% Source Port + +# Generate IP traffic flow Sankey diagram with top 10 countries +print("\n" + "=" * 60) +print("IP TRAFFIC FLOW ANALYSIS") +print("=" * 60) +aggregIPs = sankey_diag_IPs(10) + +# %% [markdown] +# ## Network Protocol and Port Analysis +# This section analyzes network layer characteristics: +# - Port classification (ephemeral vs registered) +# - Protocol distribution (TCP, UDP, ICMP) +# - Packet types and traffic categories + +# %% Source and Destination Port Analysis +# ============================================================================= +# PORT ANALYSIS: EPHEMERAL vs REGISTERED PORTS +# ============================================================================= +# Port Classification: +# - Ephemeral ports (49152-65535): Dynamically assigned for outbound connections +# - Registered ports (1024-49151): Assigned to specific services +# - Well-known ports (0-1023): Reserved for common services (HTTP, SSH, etc.) +# +# Binary encoding: 1 = ephemeral port, 0 = registered/well-known port + +print("\n" + "=" * 60) +print("PORT ANALYSIS") +print("=" * 60) + +# Source Port Classification col_name = "Source Port ephemeral" -## create boolean value for ephemeral and assigned ports -""" - ephemeral port > 49151 = 1 - assigned/registered port <= 49151 = 0 -""" -bully = df[ col_name ] > 49151 -df.loc[ bully , col_name ] = 1 -df.loc[ ~ bully , col_name ] = 0 -print( df[ col_name ].value_counts()) -# piechart_col( col_name ) -crosstab_col( col_name , "Attack Type" , "sourceport" , "attacktype" ) - -# Destination Port +print(f"\n--- {col_name} ---") +print("Converting to binary: 1 = ephemeral (>49151), 0 = registered/well-known") +bully = df[col_name] > 49151 +df.loc[bully, col_name] = 1 +df.loc[~bully, col_name] = 0 +print(df[col_name].value_counts()) +crosstab_col(col_name, "Attack Type", "sourceport", "attacktype") + +# Destination Port Classification col_name = "Destination Port ephemeral" -## create boolean value for ephemeral and assigned ports -""" - ephemeral port > 49151 = 1 - assigned/registered port <= 49151 = 0 -""" -bully = df[ col_name ] > 49151 -df.loc[ bully , col_name ] = 1 -df.loc[ ~ bully , col_name ] = 0 -print( df[ col_name ].value_counts()) -# piechart_col( col_name ) -crosstab_col( col_name , "Attack Type" , "destport" , "attacktype" ) - -# Protocol +print(f"\n--- {col_name} ---") +print("Converting to binary: 1 = ephemeral (>49151), 0 = registered/well-known") +bully = df[col_name] > 49151 +df.loc[bully, col_name] = 1 +df.loc[~bully, col_name] = 0 +print(df[col_name].value_counts()) +crosstab_col(col_name, "Attack Type", "destport", "attacktype") + +# ============================================================================= +# PROTOCOL ANALYSIS +# ============================================================================= +# Network protocols observed in the traffic: +# - TCP: Connection-oriented, reliable delivery (web, email, file transfer) +# - UDP: Connectionless, fast but unreliable (DNS, streaming, gaming) +# - ICMP: Control messages and diagnostics (ping, traceroute) +# +# Binary encoding creates indicator columns for each protocol + +print("\n" + "=" * 60) +print("PROTOCOL ANALYSIS") +print("=" * 60) + col_name = "Protocol" -""" - UDP = { 1 if Protocol = "UDP" , 0 otherwise } - TCP = { 1 if Protocol = "TCP" , 0 otherwise } - IMCP = [ 0 , 0 ] -""" -print( df[ col_name ].value_counts()) -piechart_col( col_name ) -df = catvar_mapping( col_name , [ "UDP" , "ICMP" ]) -### cross table Protocol x Attack Type -crosstab_col( col_name , "Attack Type" , col_name , "attacktype" ) - -# Packet length -fig = px.histogram( df , "Packet Length" ) +print(df[col_name].value_counts()) +piechart_col(col_name) + +# Create binary indicator columns for protocols +if "Protocol UDP" not in df.columns: + df = catvar_mapping(col_name, ["UDP", "ICMP"]) +crosstab_col(col_name, "Attack Type", col_name, "attacktype") + +# ============================================================================= +# PACKET LENGTH DISTRIBUTION +# ============================================================================= +# Packet length can indicate: +# - Small packets: Control messages, ACKs, probes +# - Medium packets: Typical web traffic +# - Large packets: File transfers, streaming data +# - Unusual sizes: Potential attack indicators + +print("\n" + "=" * 60) +print("PACKET LENGTH ANALYSIS") +print("=" * 60) + +fig = px.histogram( + df, + x="Packet Length", + title="Distribution of Network Packet Sizes", + labels={"Packet Length": "Packet Length (bytes)", "count": "Frequency"}, + color_discrete_sequence=["#00CC96"] +) +fig.update_layout( + xaxis_title="Packet Length (bytes)", + yaxis_title="Number of Packets", + showlegend=False +) fig.show() -# Packet Type +# ============================================================================= +# PACKET TYPE ANALYSIS +# ============================================================================= +# Packet Types: +# - Control packets: Network management (SYN, ACK, FIN, RST) +# - Data packets: Actual payload/content transmission +# +# Binary encoding: Control = 1, Data = 0 + +print("\n" + "=" * 60) +print("PACKET TYPE ANALYSIS") +print("=" * 60) + col_name = "Packet Type" -""" - Control = 1 - Data = 0 -""" -print( df[ col_name ].value_counts()) -df = catvar_mapping( col_name , [ "Control" ] , [ "Control" ]) -piechart_col( "Packet Type Control" ) +if col_name in df.columns: + print(df[col_name].value_counts()) + df = catvar_mapping(col_name, ["Control"], ["Control"]) + piechart_col("Packet Type Control") +elif "Packet Type Control" in df.columns: + print("Packet Type already transformed to Packet Type Control") + piechart_col("Packet Type Control") + +# ============================================================================= +# TRAFFIC TYPE ANALYSIS +# ============================================================================= +# Application layer protocols: +# - DNS: Domain Name System queries/responses (port 53) +# - HTTP: Web traffic (port 80) +# - FTP: File Transfer Protocol (ports 20, 21) +# +# Binary encoding creates indicator columns for each traffic type + +print("\n" + "=" * 60) +print("TRAFFIC TYPE ANALYSIS") +print("=" * 60) -# Traffic Type col_name = "Traffic Type" -""" - DNS = { 1 if Traffic Type = "DNS" , 0 otherwise } - HTTP = { 1 if Traffic Type = "HTTP" , 0 otherwise } - FTP = [ 0 , 0 ] -""" -print( df[ col_name ].value_counts()) -df = catvar_mapping( col_name , [ "DNS" , "HTTP" ]) -piechart_col( col_name ) +print(df[col_name].value_counts()) +if "Traffic Type DNS" not in df.columns: + df = catvar_mapping(col_name, ["DNS", "HTTP"]) +piechart_col(col_name) + +# Malware Indicators +# ============================================================================= +# SECURITY INDICATORS ANALYSIS +# ============================================================================= +# These columns contain security-related flags and detection results + +print("\n" + "=" * 60) +print("SECURITY INDICATORS ANALYSIS") +print("=" * 60) +# ----------------------------------------------------------------------------- # Malware Indicators +# Indicators of Compromise (IoC) detected by security systems +# IoC examples: malicious file hashes, suspicious domains, known attack patterns +# Binary encoding: 1 = IoC detected, 0 = No IoC detected +# ----------------------------------------------------------------------------- col_name = "Malware Indicators" -print( df[ col_name ].value_counts()) -""" - IoC Detected = 1 - pd.NA = 0 -""" -df = catvar_mapping( col_name , [ "IoC Detected" ] , [ "/" ]) -piechart_col( col_name ) +print(f"\n--- {col_name} ---") +print(df[col_name].value_counts()) +if df[col_name].dtype == 'object' or "IoC Detected" in df[col_name].astype(str).values: + df = catvar_mapping(col_name, ["IoC Detected"], ["/"]) +piechart_col(col_name, names=["No IoC Detected", "IoC Detected"]) + +# ----------------------------------------------------------------------------- # Anomaly Scores -fig = px.histogram( df , "Anomaly Scores" ) +# Numerical score indicating how anomalous/suspicious the traffic is +# Higher scores suggest more deviation from normal behavior +# ----------------------------------------------------------------------------- +print("\n--- Anomaly Scores ---") +fig = px.histogram( + df, + x="Anomaly Scores", + title="Distribution of Anomaly Scores", + labels={"Anomaly Scores": "Anomaly Score", "count": "Frequency"}, + color_discrete_sequence=["#EF553B"] +) +fig.update_layout( + xaxis_title="Anomaly Score (higher = more suspicious)", + yaxis_title="Number of Records", + showlegend=False +) fig.show() +# ----------------------------------------------------------------------------- # Alert Trigger +# Whether the traffic triggered a security alert +# Binary encoding: 1 = Alert triggered, 0 = No alert +# ----------------------------------------------------------------------------- +print("\n--- Alert Trigger ---") col_name = "Alert Trigger" -# print( df[ col_name ].value_counts()) -df = catvar_mapping( col_name , [ "Alert Triggered" ] , [ "/" ]) -piechart_col( col_name , names = [ "Alert triggered" , "Alert not triggered" ]) +if df[col_name].dtype == 'object' or "Alert Triggered" in df[col_name].astype(str).values: + df = catvar_mapping(col_name, ["Alert Triggered"], ["/"]) +piechart_col(col_name, names=["No Alert Triggered", "Alert Triggered"]) +# ----------------------------------------------------------------------------- # Attack Signature +# Pattern matching results from signature-based detection systems +# Known Pattern A vs Known Pattern B (different attack signatures) +# Binary encoding: Pattern A = 1, Pattern B = 0 +# ----------------------------------------------------------------------------- +print("\n--- Attack Signature ---") col_name = "Attack Signature" -print( df[ "Attack Signature" ].value_counts()) -""" - Pattern A = 1 - Pattern B = 0 -""" -df = catvar_mapping( col_name , [ "Known Pattern A" ] , [ "patA" ]) -piechart_col( "Attack Signature patA" , [ "Pattern A" , "Pattern B" ]) - -# Action taken +if col_name in df.columns: + print(df["Attack Signature"].value_counts()) + df = catvar_mapping(col_name, ["Known Pattern A"], ["patA"]) + piechart_col("Attack Signature patA", ["Known Pattern A", "Known Pattern B"]) +elif "Attack Signature patA" in df.columns: + print("Attack Signature already transformed to Attack Signature patA") + piechart_col("Attack Signature patA", ["Known Pattern A", "Known Pattern B"]) + +# ----------------------------------------------------------------------------- +# Action Taken +# Response action by the security system +# - Logged: Traffic recorded for analysis +# - Blocked: Traffic denied/dropped +# - Ignored: No action taken +# ----------------------------------------------------------------------------- +print("\n--- Action Taken ---") col_name = "Action Taken" -print( df[ col_name ].value_counts()) -df = catvar_mapping( col_name , [ "Logged" , "Blocked" ]) -piechart_col( col_name ) - +if col_name in df.columns: + print(df[col_name].value_counts()) + df = catvar_mapping(col_name, ["Logged", "Blocked"]) + piechart_col(col_name) +elif "Action Taken Logged" in df.columns: + print("Action Taken already transformed") + +# ----------------------------------------------------------------------------- # Severity Level +# Classification of threat severity +# Ordinal encoding: Low = -1, Medium = 0, High = +1 +# This preserves the natural ordering for analysis +# ----------------------------------------------------------------------------- +print("\n--- Severity Level ---") col_name = "Severity Level" -print( df[ col_name ].value_counts()) -""" - Low = - 1 - Medium = 0 - High = + 1 -""" -df.loc[ df[ col_name ] == "Low" , col_name ] = - 1 -df.loc[ df[ col_name ] == "Medium" , col_name ] = 0 -df.loc[ df[ col_name ] == "High" , col_name ] = + 1 -piechart_col( col_name , [ "Low" , "Medium" , "High" ]) +print(df[col_name].value_counts()) + +df.loc[df[col_name] == "Low", col_name] = -1 +df.loc[df[col_name] == "Medium", col_name] = 0 +df.loc[df[col_name] == "High", col_name] = +1 +piechart_col(col_name, ["Low Severity", "Medium Severity", "High Severity"]) + +# %% [markdown] +# ## Device and User-Agent Analysis +# This section parses User-Agent strings to extract: +# - Browser information (family, version) +# - Operating system details +# - Device characteristics (mobile, tablet, PC, bot) + +# %% Device Information Extraction +# ============================================================================= +# USER-AGENT PARSING AND DEVICE CLASSIFICATION +# ============================================================================= +# The "Device Information" column contains User-Agent strings that reveal: +# - Browser: Chrome, Firefox, Safari, Edge, IE, etc. +# - Operating System: Windows, macOS, Linux, iOS, Android +# - Device Type: Desktop PC, Mobile phone, Tablet +# - Bot Detection: Automated crawlers vs human users +# +# This information helps identify: +# - Attack vectors targeting specific platforms +# - Bot-driven attacks vs human-initiated threats +# - Vulnerable browser/OS combinations + +print("\n" + "=" * 60) +print("DEVICE INFORMATION ANALYSIS") +print("=" * 60) -#%% Device Information col_name = "Device Information" -print( df[ col_name ].value_counts()) -col = df.columns.get_loc( col_name ) -df.insert( col + 1 , "Browser family" , value = pd.NA ) -df.insert( col + 2 , "Browser major" , value = pd.NA ) -df.insert( col + 3 , "Browser minor" , value = pd.NA ) -df.insert( col + 4 , "OS family" , value = pd.NA ) -df.insert( col + 5 , "OS major" , value = pd.NA ) -df.insert( col + 6 , "OS minor" , value = pd.NA ) -df.insert( col + 7 , "Device family" , value = pd.NA ) -df.insert( col + 8 , "Device brand" , value = pd.NA ) -df.insert( col + 9 , "Device type" , value = pd.NA ) -df.insert( col + 10 , "Device bot" , value = pd.NA ) - -df[ "Browser family" ] = df[ col_name ].apply( lambda x : parse( x ).browser.family if parse( x ).browser.family is not None else pd.NA ) -df[ "Browser major" ] = df[ col_name ].apply( lambda x : parse( x ).browser.version[ 0 ] if parse( x ).browser.version[ 0 ] is not None else pd.NA ) -df[ "Browser minor" ] = df[ col_name ].apply( lambda x: parse( x ).browser.version[ 1 ] if parse( x ).browser.version[ 1 ] is not None else pd.NA ) -df[ "OS family" ] = df[ col_name ].apply( lambda x : parse( x ).os.family if parse( x ).os.family is not None else pd.NA ) -df[ "OS major" ] = df[ col_name ].apply( lambda x : parse( x ).os.version[ 0 ] if len( parse( x ).os.version ) > 0 and parse( x ).os.version[ 0 ] is not None else pd.NA ) -df[ "OS minor" ] = df[ col_name ].apply( lambda x : parse( x ).os.version[ 1 ] if len( parse( x ).os.version ) > 1 and parse( x ).os.version[ 1 ] is not None else pd.NA ) -df[ "OS patch" ] = df[ col_name ].apply( lambda x : parse( x ).os.version[ 2 ] if len( parse( x ).os.version ) > 2 and parse( x ).os.version[ 2 ] is not None else pd.NA ) -df[ "Device family" ] = df[ col_name ].apply (lambda x : parse( x ).device.family if parse( x ).device.family is not None else pd.NA ) -df[ "Device brand" ] = df[ col_name].apply( lambda x : parse( x ).device.brand if parse( x ).device.brand is not None else pd.NA ) -# do not agree with setting to not specified , why nnot leave it pd.NA ?? -# df[ "OS major" ] = df[ "OS_major" ].fillna( "not specified" ) -# df[ "OS minor" ] = df[ "OS_major" ].fillna( "not specified" ) -# df[ "OS patch" ] = df[ "OS_patch" ].fillna( "not specified" ) -# df[ "Device brand" ] = df[ "Device_brand" ].fillna( "not specified" ) -# device info -def Device_type( ua_string ) : - try : - if not ua_string or pd.isna( ua_string ) : +print(f"Unique User-Agent strings: {df[col_name].nunique()}") +print("\nTop 10 User-Agent strings:") +print(df[col_name].value_counts().head(10)) + +# Parse User-Agent strings (skip if already processed) +if "Browser family" not in df.columns: + print("\nParsing User-Agent strings...") + col = df.columns.get_loc(col_name) + + # Create columns for parsed device information + device_info_cols = [ + "Browser family", "Browser major", "Browser minor", + "OS family", "OS major", "OS minor", + "Device family", "Device brand", "Device type", "Device bot" + ] + for i, new_col in enumerate(device_info_cols, start=1): + if new_col not in df.columns: + df.insert(col + i, new_col, value=pd.NA) + + # Extract browser information + df["Browser family"] = df[col_name].apply( + lambda x: parse(x).browser.family if parse(x).browser.family is not None else pd.NA + ) + df["Browser major"] = df[col_name].apply( + lambda x: parse(x).browser.version[0] + if parse(x).browser.version[0] is not None + else pd.NA + ) + df["Browser minor"] = df[col_name].apply( + lambda x: parse(x).browser.version[1] + if parse(x).browser.version[1] is not None + else pd.NA + ) + + # Extract operating system information + df["OS family"] = df[col_name].apply( + lambda x: parse(x).os.family if parse(x).os.family is not None else pd.NA + ) + df["OS major"] = df[col_name].apply( + lambda x: parse(x).os.version[0] + if len(parse(x).os.version) > 0 and parse(x).os.version[0] is not None + else pd.NA + ) + df["OS minor"] = df[col_name].apply( + lambda x: parse(x).os.version[1] + if len(parse(x).os.version) > 1 and parse(x).os.version[1] is not None + else pd.NA + ) + df["OS patch"] = df[col_name].apply( + lambda x: parse(x).os.version[2] + if len(parse(x).os.version) > 2 and parse(x).os.version[2] is not None + else pd.NA + ) + + # Extract device information + df["Device family"] = df[col_name].apply( + lambda x: parse(x).device.family if parse(x).device.family is not None else pd.NA + ) + df["Device brand"] = df[col_name].apply( + lambda x: parse(x).device.brand if parse(x).device.brand is not None else pd.NA + ) + print("User-Agent parsing complete.") +else: + print("Device information already extracted - skipping parsing.") + +# Note: Keeping NA values for missing information is preferred over +# placeholder strings like "not specified" for proper statistical analysis + +# ----------------------------------------------------------------------------- +# Device Type Classification +# Classify devices as Mobile, Tablet, or PC based on User-Agent +# ----------------------------------------------------------------------------- +def Device_type(ua_string): + """ + Classify device type from User-Agent string. + + Returns: + str: "Mobile", "Tablet", "PC", or pd.NA if unknown + """ + try: + if not ua_string or pd.isna(ua_string): return pd.NA - ua = ua_parse( ua_string ) - if getattr( ua , "is_mobile" , False ) : + ua = ua_parse(ua_string) + if getattr(ua, "is_mobile", False): return "Mobile" - if getattr( ua , "is_tablet" , False ) : + if getattr(ua, "is_tablet", False): return "Tablet" - if getattr( ua , "is_pc", False ) : + if getattr(ua, "is_pc", False): return "PC" - return pd.NA # replaced "Unknown" with pd.NA - except : - return pd.NA # replaced "Unknown" with pd.NA -df[ "Device type" ] = df[ col_name ].apply( Device_type()) -# detection of bots -df[ "Device bot" ] = df[ col_name ].apply( lambda x: ua_parse( x ).is_bot ) - -#%% Network Segment + return pd.NA + except: + return pd.NA + + +# Classify device types and detect bots +if "Device type" not in df.columns or df["Device type"].isna().all(): + print("Classifying device types...") + df["Device type"] = df[col_name].apply(Device_type) + +# Bot detection - identifies automated crawlers and scripts +if "Device bot" not in df.columns or df["Device bot"].isna().all(): + print("Detecting bot traffic...") + df["Device bot"] = df[col_name].apply(lambda x: ua_parse(x).is_bot) + +# %% [markdown] +# ## Network Infrastructure Analysis +# This section analyzes network segmentation and security system logs + +# %% Network Segment and Security Logs +# ============================================================================= +# NETWORK SEGMENTATION ANALYSIS +# ============================================================================= +# Network segments represent logical divisions of the network: +# - Segment A, B, C: Different network zones (e.g., DMZ, internal, guest) +# - Segmentation helps contain breaches and control traffic flow +# +# Binary encoding: segA = 1 if Segment A, segB = 1 if Segment B, else [0,0] for C + +print("\n" + "=" * 60) +print("NETWORK SEGMENTATION ANALYSIS") +print("=" * 60) + col_name = "Network Segment" -print( df[ col_name ].value_counts()) -""" - segA = { 1 if "Segment A" ; 0 otherwise } - segB = { 1 if "Segment B" ; 0 otherwise } - "Segment C" = [ 0 , 0 ] -""" -df = catvar_mapping( col_name , [ "Segment A" , "Segment B" ] , [ "segA" , "segB" ]) -piechart_col( col_name ) +print(df[col_name].value_counts()) + +if "Network Segment segA" not in df.columns: + df = catvar_mapping(col_name, ["Segment A", "Segment B"], ["segA", "segB"]) +piechart_col(col_name) + +# ============================================================================= +# GEO-LOCATION DATA PARSING +# ============================================================================= +# Parse "City, State" format into separate columns for geographic analysis + +print("\n" + "=" * 60) +print("GEO-LOCATION DATA PARSING") +print("=" * 60) -# Geo-location Data col_name = "Geo-location Data" -print( df[ col_name ].value_counts()) -col = df.columns.get_loc( col_name ) -df.insert( col + 1 , "Geo-location City" , value = pd.NA ) -df.insert( col + 2 , "Geo-location State" , value = pd.NA ) -def geolocation_data( info ) : - city , state = info.split( ", " ) - return pd.Series([ city , state ]) -df[[ "Geo-location City" , "Geo-location State" ]] = df[ "Geo-location Data" ].apply( lambda x : geolocation_data( x )) +print(f"Unique locations: {df[col_name].nunique()}") +print("\nTop 10 locations:") +print(df[col_name].value_counts().head(10)) + + +def geolocation_data(info): + """Split 'City, State' string into separate components.""" + city, state = info.split(", ") + return pd.Series([city, state]) + +if "Geo-location City" not in df.columns: + print("Parsing geo-location data...") + col = df.columns.get_loc(col_name) + df.insert(col + 1, "Geo-location City", value=pd.NA) + df.insert(col + 2, "Geo-location State", value=pd.NA) + df[["Geo-location City", "Geo-location State"]] = df["Geo-location Data"].apply( + lambda x: geolocation_data(x) + ) + +# ============================================================================= +# SECURITY SYSTEM LOGS ANALYSIS +# ============================================================================= +# Firewall Logs: Records of traffic allowed/denied by firewall rules +# IDS/IPS Alerts: Intrusion Detection/Prevention System alerts +# Log Source: Where the log originated (Firewall vs Server) + +print("\n" + "=" * 60) +print("SECURITY SYSTEM LOGS ANALYSIS") +print("=" * 60) + +# ----------------------------------------------------------------------------- # Firewall Logs +# Binary: 1 = Log data present, 0 = No log data +# ----------------------------------------------------------------------------- +print("\n--- Firewall Logs ---") col_name = "Firewall Logs" -print( df[ col_name ].value_counts()) -""" - Log Data = 1 - pd.NA = 0 -""" -df = catvar_mapping( col_name , [ "Log Data" ] , [ "/" ]) -# piechart_col( col_name , [ "Log Data" , "No Log Data" ]) +print(df[col_name].value_counts()) +if df[col_name].dtype == 'object' or "Log Data" in df[col_name].astype(str).values: + df = catvar_mapping(col_name, ["Log Data"], ["/"]) + +# ----------------------------------------------------------------------------- # IDS/IPS Alerts +# Intrusion Detection/Prevention System alerts +# Binary: 1 = Alert data present, 0 = No alert +# ----------------------------------------------------------------------------- +print("\n--- IDS/IPS Alerts ---") col_name = "IDS/IPS Alerts" -print( df[ col_name ].value_counts()) -""" - Alert Data = 1 - pd.NA = 0 -""" -bully = df[ col_name ] == "Alert Data" -df = catvar_mapping( col_name , [ "Alert Data" ] , [ "/" ]) -# piechart_col( col_name , [ "Alert Data" , "No Alert Data" ]) +print(df[col_name].value_counts()) +# Binary: 1 = Alert data present, 0 = No alert +if df[col_name].dtype == 'object' or "Alert Data" in df[col_name].astype(str).values: + df = catvar_mapping(col_name, ["Alert Data"], ["/"]) +# ----------------------------------------------------------------------------- # Log Source +# Origin of the log entry +# Binary: Firewall = 1, Server = 0 +# ----------------------------------------------------------------------------- +print("\n--- Log Source ---") col_name = "Log Source" -print( df[ col_name ].value_counts()) -""" - Firewall = 1 - Server = 0 -""" -df = catvar_mapping( col_name , [ "Firewall" ] , [ "Firewall" ]) -# piechart_col( col_name , [ "Firewall" , "Server" ]) -crosstab_col( "Log Source Firewall" , "Firewall Logs" , "logsource" , "firewallogs" ) +if col_name in df.columns: + print(df[col_name].value_counts()) + df = catvar_mapping(col_name, ["Firewall"], ["Firewall"]) +elif "Log Source Firewall" in df.columns: + print("Log Source already transformed to Log Source Firewall") +# Generate cross-tabulation between log source and firewall logs +crosstab_col("Log Source Firewall", "Firewall Logs", "logsource", "firewallogs") -#%% seperat dfs for attack types -df_attype = {} -attypes = [ "Malware" , "Intrusion" , "DDoS" ] -for attype in attypes : - df_attype[ attype ] = df[ df[ "Attack Type"] == attype ] +# %% [markdown] +# ## Attack Type Segmentation +# Create separate DataFrames for each attack type to enable +# comparative analysis between Malware, Intrusion, and DDoS attacks +# %% Separate DataFrames by Attack Type +# ============================================================================= +# ATTACK TYPE SEGMENTATION +# ============================================================================= +# Split dataset by attack type for comparative visualizations +# This enables side-by-side analysis of attack characteristics -#%% geo plot of "Attack Type" by "Anomaly Score" +print("\n" + "=" * 60) +print("ATTACK TYPE SEGMENTATION") +print("=" * 60) + +df_attype = {} +attypes = ["Malware", "Intrusion", "DDoS"] +for attype in attypes: + df_attype[attype] = df[df["Attack Type"] == attype] + print(f"{attype}: {len(df_attype[attype]):,} records") + + +# %% [markdown] +# ## Geographic Distribution by Attack Type and Anomaly Score +# Visualize where different attack types originate and target, +# with color intensity representing the anomaly score + +# %% Geographic Plot: Attack Types with Anomaly Scores +# ============================================================================= +# GEO-VISUALIZATION: ATTACK TYPES BY ANOMALY SCORE +# ============================================================================= +# 6-panel geographic visualization: +# - Rows: Malware, Intrusion, DDoS attacks +# - Columns: Source IPs (left) and Destination IPs (right) +# - Color: Anomaly score (Viridis scale - dark=low, bright=high) + +print("\n" + "=" * 60) +print("GEOGRAPHIC ATTACK VISUALIZATION") +print("=" * 60) fig = subp( - rows = 3 , - cols = 2 , - specs = [ - [{ "type" : "scattergeo" } , { "type" : "scattergeo" }] , - [{ "type" : "scattergeo" } , { "type" : "scattergeo" }] , - [{ "type" : "scattergeo" } , { "type" : "scattergeo" }] , - ] , - subplot_titles = ( - "Source IP locations" , - "Destination IP locations" - ) - ) -for i , ( attype , symb ) in enumerate( zip( attypes , [ "diamond" , "diamond" , "diamond" ])) : + rows=3, + cols=2, + specs=[ + [{"type": "scattergeo"}, {"type": "scattergeo"}], + [{"type": "scattergeo"}, {"type": "scattergeo"}], + [{"type": "scattergeo"}, {"type": "scattergeo"}], + ], + subplot_titles=( + "Malware - Source IPs", "Malware - Destination IPs", + "Intrusion - Source IPs", "Intrusion - Destination IPs", + "DDoS - Source IPs", "DDoS - Destination IPs" + ), +) + +for i, (attype, symb) in enumerate(zip(attypes, ["diamond", "diamond", "diamond"])): + # Source IP locations (left column) fig.add_trace( go.Scattergeo( - lat = df_attype[ attype ][ "Source IP latitude" ] , - lon = df_attype[ attype ][ "Source IP longitude" ] , - mode = "markers" , - marker = { - "size" : 4 , - "symbol" : symb , - "color" : df_attype[ attype ][ "Anomaly Scores" ] , - "colorscale" : "Viridis" , - "cmin" : df_attype[ attype ][ "Anomaly Scores" ].min() , - "cmax" : df_attype[ attype ][ "Anomaly Scores" ].max() , - "colorbar" : { "title" : "Anomaly Score" } - } - ) , - row = i + 1 , - col = 1 - ) + lat=df_attype[attype]["Source IP latitude"], + lon=df_attype[attype]["Source IP longitude"], + mode="markers", + name=f"{attype} Source", + marker={ + "size": 4, + "symbol": symb, + "color": df_attype[attype]["Anomaly Scores"], + "colorscale": "Viridis", + "cmin": df_attype[attype]["Anomaly Scores"].min(), + "cmax": df_attype[attype]["Anomaly Scores"].max(), + "colorbar": {"title": "Anomaly
Score", "len": 0.25, "y": 0.85 - i * 0.33}, + }, + hovertemplate=f"{attype} Attack Origin
Lat: %{{lat:.2f}}
Lon: %{{lon:.2f}}
Anomaly Score: %{{marker.color:.2f}}" + ), + row=i + 1, + col=1, + ) + # Destination IP locations (right column) fig.add_trace( go.Scattergeo( - lat = df_attype[ attype ][ "Destination IP latitude" ] , - lon = df_attype[ attype ][ "Destination IP longitude" ] , - mode = "markers" , - marker = { - "size" : 4 , - "symbol" : symb , - "color" : df_attype[ attype ][ "Anomaly Scores" ] , - "colorscale" : "Viridis" , - "cmin" : df_attype[ attype ][ "Anomaly Scores" ].min() , - "cmax" : df_attype[ attype ][ "Anomaly Scores" ].max() , - "colorbar" : { "title" : "Anomaly Score" } - } - ) , - row = i + 1 , - col = 2 - ) - i = i + 1 + lat=df_attype[attype]["Destination IP latitude"], + lon=df_attype[attype]["Destination IP longitude"], + mode="markers", + name=f"{attype} Dest", + marker={ + "size": 4, + "symbol": symb, + "color": df_attype[attype]["Anomaly Scores"], + "colorscale": "Viridis", + "cmin": df_attype[attype]["Anomaly Scores"].min(), + "cmax": df_attype[attype]["Anomaly Scores"].max(), + "colorbar": {"title": "Anomaly
Score", "len": 0.25, "y": 0.85 - i * 0.33, "x": 1.02}, + "showscale": False, # Hide duplicate colorbar + }, + hovertemplate=f"{attype} Attack Target
Lat: %{{lat:.2f}}
Lon: %{{lon:.2f}}
Anomaly Score: %{{marker.color:.2f}}" + ), + row=i + 1, + col=2, + ) + fig.update_geos( - # projection_type = "orthographic" , - showcountries = True , - showland = True , - # landcolor = "LightGreen" + showcountries=True, + showland=True, + landcolor="lightgray", + countrycolor="white" ) fig.update_layout( - height = 4000 , - margin = { - "r" : 0 , - "t" : 10 , - "l" : 0 , - "b" : 0 - } , - title_text = "IP Address Locations" , - title_x = 0.5 + height=1200, + margin={"r": 50, "t": 80, "l": 0, "b": 0}, + title_text="Geographic Distribution of Attacks by Type and Anomaly Score", + title_x=0.5, + title_font_size=18, + showlegend=False, ) fig.show() -#%% Packet Length x Attack Types +# %% [markdown] +# ## Attack Characteristics Comparison +# Compare packet lengths and anomaly scores across different attack types + +# %% Packet Length by Attack Type +# ============================================================================= +# PACKET LENGTH DISTRIBUTION BY ATTACK TYPE +# ============================================================================= +# Strip plot showing packet length distribution for each attack type +# Helps identify if different attacks have characteristic packet sizes + +print("\n" + "=" * 60) +print("PACKET LENGTH BY ATTACK TYPE") +print("=" * 60) fig = go.Figure() -for i , ( attype , symb ) in enumerate( zip( attypes , [ "diamond" , "diamond" , "diamond" ])) : +# Color palette for attack types +colors = {"Malware": "#636EFA", "Intrusion": "#EF553B", "DDoS": "#00CC96"} + +for i, (attype, symb) in enumerate(zip(attypes, ["diamond", "diamond", "diamond"])): fig.add_trace( go.Scatter( - x = df_attype[ attype ][ "Packet Length" ] , - y = [ i ] * df_attype[ attype ].shape[ 0 ] , - mode = "markers" , - name = attype , - marker = { - "size" : 4 , - "symbol" : symb , - "opacity" : 0.1 - } - ) , + x=df_attype[attype]["Packet Length"], + y=[i] * df_attype[attype].shape[0], + mode="markers", + name=f"{attype} ({len(df_attype[attype]):,} records)", + marker={ + "size": 4, + "symbol": symb, + "opacity": 0.15, + "color": colors[attype] + }, + hovertemplate=f"{attype}
Packet Length: %{{x}} bytes" + ), + ) - ) - i = i + 1 +fig.update_layout( + title="Packet Length Distribution by Attack Type", + title_font_size=16, + xaxis_title="Packet Length (bytes)", + yaxis=dict( + tickmode='array', + tickvals=[0, 1, 2], + ticktext=attypes, + title="Attack Type" + ), + height=400, + showlegend=True, + legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="center", x=0.5) +) fig.show() -# Anomaly Scores x Attack Types +# ============================================================================= +# ANOMALY SCORE DISTRIBUTION BY ATTACK TYPE +# ============================================================================= +# Strip plot showing anomaly score distribution for each attack type +# Higher anomaly scores indicate more suspicious/unusual traffic patterns + +print("\n" + "=" * 60) +print("ANOMALY SCORES BY ATTACK TYPE") +print("=" * 60) fig = go.Figure() -for i , ( attype , symb ) in enumerate( zip( attypes , [ "diamond" , "diamond" , "diamond" ])) : +for i, (attype, symb) in enumerate(zip(attypes, ["diamond", "diamond", "diamond"])): fig.add_trace( go.Scatter( - x = df_attype[ attype ][ "Anomaly Scores" ] , - y = [ i ] * df_attype[ attype ].shape[ 0 ] , - mode = "markers" , - name = attype , - marker = { - "size" : 4 , - "symbol" : symb , - "opacity" : 0.1 - } - ) , + x=df_attype[attype]["Anomaly Scores"], + y=[i] * df_attype[attype].shape[0], + mode="markers", + name=f"{attype} ({len(df_attype[attype]):,} records)", + marker={ + "size": 4, + "symbol": symb, + "opacity": 0.15, + "color": colors[attype] + }, + hovertemplate=f"{attype}
Anomaly Score: %{{x:.2f}}" + ), + ) - ) - i = i + 1 +fig.update_layout( + title="Anomaly Score Distribution by Attack Type", + title_font_size=16, + xaxis_title="Anomaly Score (higher = more suspicious)", + yaxis=dict( + tickmode='array', + tickvals=[0, 1, 2], + ticktext=attypes, + title="Attack Type" + ), + height=400, + showlegend=True, + legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="center", x=0.5) +) fig.show() -#%% general crosstable - -def sankey_diag( cols_bully = [ - True , # "Source IP country" - True , # "Destination IP country" - True , # "Source Port ephemeral" - True , # "Destination Port ephemeral" - True , # "Protocol" - True , # "Packet Type Control" - True , # "Traffic Type" - True , # "Malware Indicators" - True , # "Alert Trigger" - True , # "Attack Signature patA" - True , # "Action Taken" - True , # "Severity Level" - True , # "Network Segment" - True , # "Firewall Logs" - True , # "IDS/IPS Alerts" - True , # "Log Source Firewall" - ] , ntop = 10 ) : - cols = np.array([ - "Source IP country" , - "Destination IP country" , - "Source Port ephemeral" , - "Destination Port ephemeral" , - "Protocol" , - "Packet Type Control" , - "Traffic Type" , - "Malware Indicators" , - "Alert Trigger" , - "Attack Signature patA" , - "Action Taken" , - "Severity Level" , - "Network Segment" , - "Firewall Logs" , - "IDS/IPS Alerts" , - "Log Source Firewall" - ]) - cols = cols[ np.array( cols_bully )] - - idx_ct = [] +# %% [markdown] +# ## Multi-Variable Sankey Diagram +# Visualize the flow of traffic characteristics leading to different attack types +# This helps identify which combinations of features are associated with each attack + +# %% General Cross-Table Sankey Diagram +# ============================================================================= +# MULTI-VARIABLE SANKEY DIAGRAM GENERATOR +# ============================================================================= +# Creates a Sankey diagram showing how categorical variable values +# flow toward different attack types. Useful for understanding +# which feature combinations characterize each attack type. + + +def sankey_diag( + cols_bully=[ + True, # "Source IP country" + True, # "Destination IP country" + True, # "Source Port ephemeral" + True, # "Destination Port ephemeral" + True, # "Protocol" + True, # "Packet Type Control" + True, # "Traffic Type" + True, # "Malware Indicators" + True, # "Alert Trigger" + True, # "Attack Signature patA" + True, # "Action Taken" + True, # "Severity Level" + True, # "Network Segment" + True, # "Firewall Logs" + True, # "IDS/IPS Alerts" + True, # "Log Source Firewall" + ], + ntop=10, +): + """ + Generate a Sankey diagram showing feature value flows to attack types. + + Parameters: + ----------- + cols_bully : list of bool + Boolean flags indicating which columns to include in the diagram + ntop : int + Number of top countries to show (others grouped as "other") + + Returns: + -------- + DataFrame + Cross-tabulation percentages used to build the diagram + """ + cols = np.array( + [ + "Source IP country", + "Destination IP country", + "Source Port ephemeral", + "Destination Port ephemeral", + "Protocol", + "Packet Type Control", + "Traffic Type", + "Malware Indicators", + "Alert Trigger", + "Attack Signature patA", + "Action Taken", + "Severity Level", + "Network Segment", + "Firewall Logs", + "IDS/IPS Alerts", + "Log Source Firewall", + ] + ) + cols = cols[np.array(cols_bully)] + + idx_ct = [] labels = [] - if "Source IP country" in cols : - SIP = df[ "Source IP country" ].copy( deep = True ) + if "Source IP country" in cols: + SIP = df["Source IP country"].copy(deep=True) SIP.name = "SIP" - SIPlabs = pd.Series( SIP.value_counts().index[ : ntop ]) - bully = ( SIP.isin( SIPlabs ) | SIP.isna()) - SIP.loc[ ~ bully ] = "other" - SIPlabs = "SIP " + pd.concat([ SIPlabs , pd.Series([ "other" ])]) - labels.extend( SIPlabs.to_list()) - idx_ct = idx_ct + [ SIP ] - cols = cols[ cols != "Source IP country" ] - if "Destination IP country" in cols : - DIP = df[ "Destination IP country" ].copy( deep = True ) + SIPlabs = pd.Series(SIP.value_counts().index[:ntop]) + bully = SIP.isin(SIPlabs) | SIP.isna() + SIP.loc[~bully] = "other" + SIPlabs = "SIP " + pd.concat([SIPlabs, pd.Series(["other"])]) + labels.extend(SIPlabs.to_list()) + idx_ct = idx_ct + [SIP] + cols = cols[cols != "Source IP country"] + if "Destination IP country" in cols: + DIP = df["Destination IP country"].copy(deep=True) DIP.name = "DIP" - DIPlabs = pd.Series( DIP.value_counts().index[ : ntop ]) - bully = ( DIP.isin( DIPlabs ) | DIP.isna()) - DIP.loc[ ~ bully ] = "other" - DIPlabs = "DIP " + pd.concat([ DIPlabs , pd.Series([ "other" ])]) - labels.extend( DIPlabs.to_list()) - idx_ct = idx_ct + [ DIP ] - cols = cols[ cols != "Destination IP country" ] - + DIPlabs = pd.Series(DIP.value_counts().index[:ntop]) + bully = DIP.isin(DIPlabs) | DIP.isna() + DIP.loc[~bully] = "other" + DIPlabs = "DIP " + pd.concat([DIPlabs, pd.Series(["other"])]) + labels.extend(DIPlabs.to_list()) + idx_ct = idx_ct + [DIP] + cols = cols[cols != "Destination IP country"] + # build cross table with Attack Type in columns and multi-index of variables in index - idx_ct = idx_ct + [ df[ col ] for col in cols ] - print( idx_ct ) - crosstabs = pd.crosstab( - index = idx_ct , - columns = df[ "Attack Type" ] - ) - + idx_ct = idx_ct + [df[col] for col in cols] + print(idx_ct) + crosstabs = pd.crosstab(index=idx_ct, columns=df["Attack Type"]) + # compute labels - for c in np.append( cols , "Attack Type" ) : - vals = df[ c ].unique() - for v in vals : - labels.append( f"{ c } { v }" ) + for c in np.append(cols, "Attack Type"): + vals = df[c].unique() + for v in vals: + labels.append(f"{c} {v}") # computation of source , target , value source = [] target = [] value = [] nlvl = crosstabs.index.nlevels - for idx , row in crosstabs.iterrows() : + for idx, row in crosstabs.iterrows(): row_labs = [] - if ( nlvl == 1 ) : - row_labs.append( f"{ crosstabs.index.name } { idx }" ) - else : - for i , val in enumerate( idx ) : - row_labs.append( f"{ crosstabs.index.names[ i ] } { val }" ) - for attype in crosstabs.columns : - val = row[ attype ] - for i in range( 0 , nlvl - 1 ) : - source.append( labels.index( row_labs[ i ])) - target.append( labels.index( row_labs[ i + 1 ])) - value.append( val ) - source.append( labels.index( row_labs[ - 1 ])) - target.append( labels.index( f"Attack Type { attype }" )) - value.append( val ) - - # plot the sankey diagram - n = len( labels ) + if nlvl == 1: + row_labs.append(f"{crosstabs.index.name} {idx}") + else: + for i, val in enumerate(idx): + row_labs.append(f"{crosstabs.index.names[i]} {val}") + for attype in crosstabs.columns: + val = row[attype] + for i in range(0, nlvl - 1): + source.append(labels.index(row_labs[i])) + target.append(labels.index(row_labs[i + 1])) + value.append(val) + source.append(labels.index(row_labs[-1])) + target.append(labels.index(f"Attack Type {attype}")) + value.append(val) + + # Plot the Sankey diagram with Inferno color scale + n = len(labels) colors = px.colors.sample_colorscale( - px.colors.sequential.Inferno , - [ i / ( n - 1 ) for i in range( n )] - ) - fig = go.Figure( data = [ go.Sankey( - node = dict( - pad = 15 , - thickness = 20 , - line = dict( - color = "rgba( 0 , 0 , 0 , 0.1 )" , - width = 0.5 - ) , - label = labels , - color = colors , - ) , - link = dict( - source = source , - target = target , - value = value - ))]) + px.colors.sequential.Inferno, [i / (n - 1) for i in range(n)] + ) + fig = go.Figure( + data=[ + go.Sankey( + node=dict( + pad=15, + thickness=20, + line=dict(color="rgba(0, 0, 0, 0.1)", width=0.5), + label=labels, + color=colors, + hovertemplate="%{label}
Total: %{value}" + ), + link=dict( + source=source, + target=target, + value=value, + hovertemplate="Flow from %{source.label} to %{target.label}
Count: %{value}" + ), + ) + ] + ) fig.update_layout( - title_text = "Sankey Diagram" , - # font_family = "Courier New" , - # font_color = "blue" , - font_size = 20 , - title_font_family = "Avenir" , - title_font_color = "black", - ) + title_text="Feature Value Flow to Attack Types", + title_font_size=18, + font_size=14, + title_font_family="Avenir", + title_font_color="black", + ) fig.show() - + + # Return normalized cross-tabulation (percentages) crosstabs = crosstabs / crosstabs.sum().sum() * 100 - + return crosstabs -crosstabs = sankey_diag([ - False , # "Source IP country" - False , # "Destination IP country" - False , # "Source Port ephemeral" - False , # "Destination Port ephemeral" - True , # "Protocol" - False , # "Packet Type Control" - True , # "Traffic Type" - True , # "Malware Indicators" - False , # "Alert Trigger" - False , # "Attack Signature patA" - False , # "Action Taken" - False , # "Severity Level" - False , # "Network Segment" - False , # "Firewall Logs" - True , # "IDS/IPS Alerts" - False , # "Log Source Firewall" - ]) - - -#%% - - -def paracat_diag( cols_bully = [ - True , # "Source IP country" - True , # "Destination IP country" - True , # "Source Port ephemeral" - True , # "Destination Port ephemeral" - True , # "Protocol" - True , # "Packet Type Control" - True , # "Traffic Type" - True , # "Malware Indicators" - True , # "Alert Trigger" - True , # "Attack Signature patA" - True , # "Action Taken" - True , # "Severity Level" - True , # "Network Segment" - True , # "Firewall Logs" - True , # "IDS/IPS Alerts" - True , # "Log Source Firewall" - ] , - colorvar = "Attack Type" , - ntop = 10 , - ) : - - cols = np.array([ - "Source IP country" , - "Destination IP country" , - "Source Port ephemeral" , - "Destination Port ephemeral" , - "Protocol" , - "Packet Type Control" , - "Traffic Type" , - "Malware Indicators" , - "Alert Trigger" , - "Attack Signature patA" , - "Action Taken" , - "Severity Level" , - "Network Segment" , - "Firewall Logs" , - "IDS/IPS Alerts" , - "Log Source Firewall" - ]) - cols = cols[ np.array( cols_bully )] - + +# Generate Sankey diagram with selected features +# Selected: Protocol, Traffic Type, Malware Indicators, IDS/IPS Alerts +print("\n" + "=" * 60) +print("MULTI-VARIABLE SANKEY ANALYSIS") +print("=" * 60) +print("Features included: Protocol, Traffic Type, Malware Indicators, IDS/IPS Alerts") + +crosstabs = sankey_diag( + [ + False, # "Source IP country" + False, # "Destination IP country" + False, # "Source Port ephemeral" + False, # "Destination Port ephemeral" + True, # "Protocol" - INCLUDED + False, # "Packet Type Control" + True, # "Traffic Type" - INCLUDED + True, # "Malware Indicators" - INCLUDED + False, # "Alert Trigger" + False, # "Attack Signature patA" + False, # "Action Taken" + False, # "Severity Level" + False, # "Network Segment" + False, # "Firewall Logs" + True, # "IDS/IPS Alerts" - INCLUDED + False, # "Log Source Firewall" + ] +) + + +# %% [markdown] +# ## Parallel Categories Diagram +# Interactive visualization showing relationships between categorical +# variables and attack types. Lines connect category values, with +# color indicating the selected variable's values. + +# %% Parallel Categories Diagram +# ============================================================================= +# PARALLEL CATEGORIES DIAGRAM +# ============================================================================= +# Creates an interactive parallel categories plot showing how +# different categorical feature values relate to attack types. +# The diagram allows exploration of multi-dimensional categorical relationships. + + +def paracat_diag( + cols_bully=[ + True, # "Source IP country" + True, # "Destination IP country" + True, # "Source Port ephemeral" + True, # "Destination Port ephemeral" + True, # "Protocol" + True, # "Packet Type Control" + True, # "Traffic Type" + True, # "Malware Indicators" + True, # "Alert Trigger" + True, # "Attack Signature patA" + True, # "Action Taken" + True, # "Severity Level" + True, # "Network Segment" + True, # "Firewall Logs" + True, # "IDS/IPS Alerts" + True, # "Log Source Firewall" + ], + colorvar="Attack Type", + ntop=10, +): + cols = np.array( + [ + "Source IP country", + "Destination IP country", + "Source Port ephemeral", + "Destination Port ephemeral", + "Protocol", + "Packet Type Control", + "Traffic Type", + "Malware Indicators", + "Alert Trigger", + "Attack Signature patA", + "Action Taken", + "Severity Level", + "Network Segment", + "Firewall Logs", + "IDS/IPS Alerts", + "Log Source Firewall", + ] + ) + cols = cols[np.array(cols_bully)] + dims_var = {} - if "Source IP country" in cols : - SIP = df[ "Source IP country" ].copy( deep = True ) + if "Source IP country" in cols: + SIP = df["Source IP country"].copy(deep=True) SIP.name = "SIP" - SIPlabs = pd.Series( SIP.value_counts().index[ : ntop ]) - bully = ( SIP.isin( SIPlabs ) | SIP.isna()) - SIP.loc[ ~ bully ] = "other" - SIPlabs = "SIP " + pd.concat([ SIPlabs , pd.Series([ "other" ])]) - cols = cols[ cols != "Source IP country" ] - dims_var[ "SIP" ] = go.parcats.Dimension( - values = SIP , + SIPlabs = pd.Series(SIP.value_counts().index[:ntop]) + bully = SIP.isin(SIPlabs) | SIP.isna() + SIP.loc[~bully] = "other" + SIPlabs = "SIP " + pd.concat([SIPlabs, pd.Series(["other"])]) + cols = cols[cols != "Source IP country"] + dims_var["SIP"] = go.parcats.Dimension( + values=SIP, # categoryorder = "category ascending" , - label = "Source IP country" - ) - cols = np.append( cols , "SIP" ) - if "Destination IP country" in cols : - DIP = df[ "Destination IP country" ].copy( deep = True ) + label="Source IP country", + ) + cols = np.append(cols, "SIP") + if "Destination IP country" in cols: + DIP = df["Destination IP country"].copy(deep=True) DIP.name = "DIP" - DIPlabs = pd.Series( DIP.value_counts().index[ : ntop ]) - bully = ( DIP.isin( DIPlabs ) | DIP.isna()) - DIP.loc[ ~ bully ] = "other" - DIPlabs = "DIP " + pd.concat([ DIPlabs , pd.Series([ "other" ])]) - cols = cols[ cols != "Destination IP country" ] - dims_var[ "DIP" ] = go.parcats.Dimension( - values = DIP , + DIPlabs = pd.Series(DIP.value_counts().index[:ntop]) + bully = DIP.isin(DIPlabs) | DIP.isna() + DIP.loc[~bully] = "other" + DIPlabs = "DIP " + pd.concat([DIPlabs, pd.Series(["other"])]) + cols = cols[cols != "Destination IP country"] + dims_var["DIP"] = go.parcats.Dimension( + values=DIP, # categoryorder = "category ascending" , - label = "Destination IP country" - ) - cols = np.append( cols , "DIP" ) - for col in cols[( cols != "SIP" ) & ( cols != "DIP" )] : - print( col ) - dims_var[ col ] = go.parcats.Dimension( - values = df[ col ] , + label="Destination IP country", + ) + cols = np.append(cols, "DIP") + for col in cols[(cols != "SIP") & (cols != "DIP")]: + print(col) + dims_var[col] = go.parcats.Dimension( + values=df[col], # categoryorder = "category ascending" , - label = col - ) - + label=col, + ) + dim_attypes = go.parcats.Dimension( - values = df[ "Attack Type" ], - label = "Attack Type", + values=df["Attack Type"], + label="Attack Type", # categoryarray = [ "Malware" , "Intrusion" , "DDoS" ] , - ticktext = [ "Malware" , "Intrusion" , "DDoS" ] - ) - - dims = [ dims_var[ col ] for col in cols ] - dims.append( dim_attypes ) - - if colorvar == "SIP" : + ticktext=["Malware", "Intrusion", "DDoS"], + ) + + dims = [dims_var[col] for col in cols] + dims.append(dim_attypes) + + if colorvar == "SIP": colorvar = SIP - elif colorvar == "DIP" : + elif colorvar == "DIP": colorvar = DIP - elif ( colorvar in cols ) or ( colorvar == "Attack Type" ) : - colorvar = df[ colorvar ] - else : - ValueError( "colorvar must be in cols" ) + elif (colorvar in cols) or (colorvar == "Attack Type"): + colorvar = df[colorvar] + else: + ValueError("colorvar must be in cols") catcolor = colorvar.unique() - catcolor_n = catcolor.shape[ 0 ] - color = colorvar.map({ cat : i for i , cat in enumerate( catcolor )}) - positions = [ i / ( catcolor_n - 1 ) if ( catcolor_n > 1 ) else 0 for i in range( 0 , catcolor_n )] + catcolor_n = catcolor.shape[0] + color = colorvar.map({cat: i for i, cat in enumerate(catcolor)}) + positions = [ + i / (catcolor_n - 1) if (catcolor_n > 1) else 0 for i in range(0, catcolor_n) + ] palette = px.colors.sequential.Viridis - colors = [ px.colors.sample_colorscale( palette , p )[ 0 ] for p in positions ] - colorscale = [[ positions[ i ] , colors[ i ]] for i in range( 0 , catcolor_n )] - - fig = go.Figure( data = [ go.Parcats( - dimensions = dims , - line = { - "color" : color , - "colorscale" : colorscale , - "shape" : "hspline" , - } , - hoveron = "color" , - hoverinfo = "count+probability" , - labelfont = { "size" : 18 , "family" : "Times" } , - tickfont = { "size" : 16 , "family" : "Times" } , - arrangement = "freeform" , - )]) + colors = [px.colors.sample_colorscale(palette, p)[0] for p in positions] + colorscale = [[positions[i], colors[i]] for i in range(0, catcolor_n)] + + fig = go.Figure( + data=[ + go.Parcats( + dimensions=dims, + line={ + "color": color, + "colorscale": colorscale, + "shape": "hspline", + }, + hoveron="color", + hoverinfo="count+probability", + labelfont={"size": 18, "family": "Times"}, + tickfont={"size": 16, "family": "Times"}, + arrangement="freeform", + ) + ] + ) fig.show() -paracat_diag([ - False , # "Source IP country" - False , # "Destination IP country" - False , # "Source Port ephemeral" - False , # "Destination Port ephemeral" - True , # "Protocol" - False , # "Packet Type Control" - True , # "Traffic Type" - False , # "Malware Indicators" - False , # "Alert Trigger" - True , # "Attack Signature patA" - False , # "Action Taken" - True , # "Severity Level" - True , # "Network Segment" - False , # "Firewall Logs" - False , # "IDS/IPS Alerts" - False , # "Log Source Firewall" - ] , - colorvar = "Attack Signature patA" , - ) +# Generate parallel categories diagram +# Selected features: Protocol, Traffic Type, Attack Signature, Severity Level, Network Segment +# Color: Attack Signature Pattern A (to see how signature types flow through other features) +print("\n" + "=" * 60) +print("PARALLEL CATEGORIES DIAGRAM") +print("=" * 60) +print("Features: Protocol, Traffic Type, Attack Signature, Severity Level, Network Segment") +print("Color coding: Attack Signature Pattern (A vs B)") + +paracat_diag( + [ + False, # "Source IP country" + False, # "Destination IP country" + False, # "Source Port ephemeral" + False, # "Destination Port ephemeral" + True, # "Protocol" - INCLUDED + False, # "Packet Type Control" + True, # "Traffic Type" - INCLUDED + False, # "Malware Indicators" + False, # "Alert Trigger" + True, # "Attack Signature patA" - INCLUDED + False, # "Action Taken" + True, # "Severity Level" - INCLUDED + True, # "Network Segment" - INCLUDED + False, # "Firewall Logs" + False, # "IDS/IPS Alerts" + False, # "Log Source Firewall" + ], + colorvar="Attack Signature patA", +) + + +# %% [markdown] +# ## Statistical Analysis: Correlation and Chi-Square Tests +# Measure the strength of association between categorical variables +# and the target variable (Attack Type) + +# %% Matthews Correlation Coefficients +# ============================================================================= +# MATTHEWS CORRELATION COEFFICIENT (MCC) ANALYSIS +# ============================================================================= +# The Matthews Correlation Coefficient (MCC) measures the quality of +# binary classifications. Values range from -1 to +1: +# - +1: Perfect prediction +# - 0: No better than random +# - -1: Total disagreement +# +# For multi-class, this generalizes to the Phi coefficient. + +print("\n" + "=" * 60) +print("MATTHEWS CORRELATION COEFFICIENTS") +print("=" * 60) +print("Measuring correlation between each feature and Attack Type") +print("(Values close to 0 indicate no linear correlation)\n") + + +def catvar_corr(col, target="Attack Type"): + """Calculate Matthews correlation coefficient between a feature and target.""" + corr = matthews_corrcoef(df[target], df[col].astype(str)) + print(f" {col:35} : {corr:+.4f}") + + +catvars = np.array( + [ + "Source IP country", + "Destination IP country", + "Source Port ephemeral", + "Destination Port ephemeral", + "Protocol", + "Packet Type Control", + "Traffic Type", + "Malware Indicators", + "Alert Trigger", + "Attack Signature patA", + "Action Taken", + "Severity Level", + "Network Segment", + "Firewall Logs", + "IDS/IPS Alerts", + "Log Source Firewall", + ] +) +for c in catvars: + catvar_corr(c) + + +# %% [markdown] +# ## Chi-Square Test of Independence +# Test whether categorical variables are independent of Attack Type -#%% coefficients computation - -# matthews corrcoef - -def catvar_corr( col , target = "Attack Type") : - corr = matthews_corrcoef( df[ target ], df[ col ].astype( str )) - print( f"phi corr between { target } and { col } = { corr }" ) -catvars = np.array([ - "Source IP country" , - "Destination IP country" , - "Source Port ephemeral" , - "Destination Port ephemeral" , - "Protocol" , - "Packet Type Control" , - "Traffic Type" , - "Malware Indicators" , - "Alert Trigger" , - "Attack Signature patA" , - "Action Taken" , - "Severity Level" , - "Network Segment" , - "Firewall Logs" , - "IDS/IPS Alerts" , - "Log Source Firewall" - ]) -for c in catvars : - catvar_corr( c ) - -#%% chi 2 +# %% Chi-Square Independence Test +# ============================================================================= +# CHI-SQUARE TEST OF INDEPENDENCE +# ============================================================================= +# Tests whether there is a significant association between Protocol and Attack Type +# - H0: Variables are independent (no association) +# - H1: Variables are not independent (association exists) +# +# If p-value < 0.05, we reject H0 and conclude significant association + +print("\n" + "=" * 60) +print("CHI-SQUARE TEST: Protocol vs Attack Type") +print("=" * 60) from scipy.stats import chi2_contingency -# obs = np.array([[10, 10, 20], [20, 20, 20]]) -df_catvar = df[[ - "Attack Type", - "Source Port ephemeral" , - "Destination Port ephemeral" , - "Protocol" , - "Packet Type Control" , - "Traffic Type" , - "Malware Indicators" , - "Alert Trigger" , - "Attack Signature patA" , - "Action Taken" , - "Severity Level" , - "Network Segment" , - "Firewall Logs" , - "IDS/IPS Alerts" , - "Log Source Firewall" - ]] -res = chi2_contingency( df_catvar.values.T[ 1 : ].astype( str )) -print( res.statistic ) -print( res.pvalue ) -print( res.dof ) -print( res.expected_freq ) - -#%% mca +# Prepare categorical variables for analysis +df_catvar = df[ + [ + "Attack Type", + "Source Port ephemeral", + "Destination Port ephemeral", + "Protocol", + "Packet Type Control", + "Traffic Type", + "Malware Indicators", + "Alert Trigger", + "Attack Signature patA", + "Action Taken", + "Severity Level", + "Network Segment", + "Firewall Logs", + "IDS/IPS Alerts", + "Log Source Firewall", + ] +] + +# Encode categorical columns as integers for contingency table +df_catvar_encoded = df_catvar.copy() +for col in df_catvar_encoded.columns: + if df_catvar_encoded[col].dtype == 'object': + df_catvar_encoded[col] = pd.Categorical(df_catvar_encoded[col]).codes + +# Perform chi-square test +res = chi2_contingency(pd.crosstab(df_catvar_encoded['Attack Type'], df_catvar_encoded['Protocol'])) +print(f"Chi-square statistic: {res.statistic:.4f}") +print(f"P-value: {res.pvalue:.6f}") +print(f"Degrees of freedom: {res.dof}") +print(f"\nExpected frequencies:") +print(res.expected_freq) + +if res.pvalue < 0.05: + print("\n=> Significant association detected (p < 0.05)") +else: + print("\n=> No significant association (p >= 0.05)") + + +# %% [markdown] +# ## Multiple Correspondence Analysis (MCA) +# Dimensionality reduction technique for categorical variables +# Similar to PCA but for categorical data + +# %% Multiple Correspondence Analysis +# ============================================================================= +# MULTIPLE CORRESPONDENCE ANALYSIS (MCA) +# ============================================================================= +# MCA is a data analysis technique for nominal categorical data, +# used to detect and represent underlying structures in a data set. +# It's the categorical equivalent of Principal Component Analysis (PCA). +# +# Key outputs: +# - Eigenvalues: Amount of variance explained by each component +# - Component coordinates: Position of category levels in reduced space + +print("\n" + "=" * 60) +print("MULTIPLE CORRESPONDENCE ANALYSIS (MCA)") +print("=" * 60) + +# Initialize MCA with 3 components mca = prince.MCA( n_components=3, n_iter=3, copy=True, check_input=True, - engine='sklearn', - random_state=42 + engine="sklearn", + random_state=42, ) -df_catvar = df[[ - "Attack Type", - "Source Port ephemeral" , - "Destination Port ephemeral" , - "Protocol" , - "Packet Type Control" , - "Traffic Type" , - "Malware Indicators" , - "Alert Trigger" , - "Attack Signature patA" , - "Action Taken" , - "Severity Level" , - "Network Segment" , - "Firewall Logs" , - "IDS/IPS Alerts" , - "Log Source Firewall" - ]] +# Select categorical variables for MCA +df_catvar = df[ + [ + "Attack Type", + "Source Port ephemeral", + "Destination Port ephemeral", + "Protocol", + "Packet Type Control", + "Traffic Type", + "Malware Indicators", + "Alert Trigger", + "Attack Signature patA", + "Action Taken", + "Severity Level", + "Network Segment", + "Firewall Logs", + "IDS/IPS Alerts", + "Log Source Firewall", + ] +] + +# Fit MCA model mca = mca.fit(df_catvar) +# Alternative MCA approaches for comparison one_hot = pd.get_dummies(df_catvar) -mca_no_one_hot = prince.MCA(one_hot=False) -mca_no_one_hot = mca_no_one_hot.fit(one_hot) -mca_without_correction = prince.MCA(correction=None) - -mca_with_benzecri_correction = prince.MCA(correction='benzecri') -mca_with_greenacre_correction = prince.MCA(correction='greenacre') +# MCA with one_hot=False requires positive values (add 1 to avoid zeros) +one_hot_positive = one_hot + 1 -mca.eigenvalues_summary +mca_no_one_hot = prince.MCA(one_hot=False) +mca_no_one_hot = mca_no_one_hot.fit(one_hot_positive) -#%% SARIMA analysis on Attack type +# Different correction methods for eigenvalue adjustment +mca_without_correction = prince.MCA(correction=None) +mca_with_benzecri_correction = prince.MCA(correction="benzecri") +mca_with_greenacre_correction = prince.MCA(correction="greenacre") + +# Display MCA results +print("\nMCA Eigenvalues Summary:") +print("(Shows variance explained by each component)") +print(mca.eigenvalues_summary) + + +# %% [markdown] +# ## Time Series Analysis: Attack Patterns Over Time +# Analyze temporal patterns in attack occurrences using: +# - Daily attack counts by type +# - Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) +# - Rolling averages for trend detection + +# %% Time Series Analysis - Daily Attack Counts +# ============================================================================= +# TIME SERIES ANALYSIS: DAILY ATTACK PATTERNS +# ============================================================================= +# Aggregate attacks by day and analyze temporal patterns +# This helps identify: +# - Seasonal patterns (weekly, monthly cycles) +# - Trend changes over time +# - Anomalous periods with unusual attack volumes + +print("\n" + "=" * 60) +print("TIME SERIES ANALYSIS: DAILY ATTACK COUNTS") +print("=" * 60) + +# Aggregate attacks by day +Attacks_pday = df.copy(deep=True) +Attacks_pday["date_dd"] = Attacks_pday["date"].dt.floor("d") +Attacks_pday = ( + Attacks_pday.groupby(["date_dd", "Attack Type"]).size().unstack().iloc[1:-1,] +) -Attacks_pday = df.copy( deep = True ) -Attacks_pday[ "date_dd" ] = Attacks_pday[ "date" ].dt.floor( "d" ) -Attacks_pday = Attacks_pday.groupby([ "date_dd" , "Attack Type" ]).size().unstack().iloc[ 1 : - 1 , ] +print(f"Time series length: {len(Attacks_pday)} days") +print(f"Date range: {Attacks_pday.index.min()} to {Attacks_pday.index.max()}") -# plot n attacks per day +# ----------------------------------------------------------------------------- +# Daily Attack Count Time Series Plot +# Shows raw daily counts for each attack type +# ----------------------------------------------------------------------------- fig = subp( - rows = 3 , - cols = 1 , - subplot_titles = ( - "Malware" , - "Intrusion" , - "DDos" , - ) - ) + rows=3, + cols=1, + subplot_titles=( + "Malware Attacks per Day", + "Intrusion Attempts per Day", + "DDoS Attacks per Day", + ), + vertical_spacing=0.08 +) + +# Malware time series fig.add_trace( go.Scatter( - x = Attacks_pday.index , - y = Attacks_pday[ "Malware" ] , - ) , - row = 1 , - col = 1 , - ) + x=Attacks_pday.index, + y=Attacks_pday["Malware"], + mode="lines", + name="Malware", + line=dict(color="#636EFA"), + hovertemplate="Malware
Date: %{x}
Count: %{y}" + ), + row=1, + col=1, +) + +# Intrusion time series fig.add_trace( go.Scatter( - x = Attacks_pday.index , - y = Attacks_pday[ "Intrusion" ] , - ) , - row = 2 , - col = 1 , - ) + x=Attacks_pday.index, + y=Attacks_pday["Intrusion"], + mode="lines", + name="Intrusion", + line=dict(color="#EF553B"), + hovertemplate="Intrusion
Date: %{x}
Count: %{y}" + ), + row=2, + col=1, +) + +# DDoS time series fig.add_trace( go.Scatter( - x = Attacks_pday.index , - y = Attacks_pday[ "DDoS" ] , - ) , - row = 3 , - col = 1 , - ) + x=Attacks_pday.index, + y=Attacks_pday["DDoS"], + mode="lines", + name="DDoS", + line=dict(color="#00CC96"), + hovertemplate="DDoS
Date: %{x}
Count: %{y}" + ), + row=3, + col=1, +) + +fig.update_layout( + height=800, + title_text="Daily Attack Counts by Type", + title_font_size=18, + showlegend=True, + legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="center", x=0.5) +) +fig.update_xaxes(title_text="Date", row=3, col=1) +fig.update_yaxes(title_text="Count") +fig.show() -# plot ACF & PACF +# ----------------------------------------------------------------------------- +# ACF and PACF Analysis +# Autocorrelation helps identify time series patterns: +# - ACF: Correlation between observations at different lags +# - PACF: Direct correlation at each lag, removing intermediate effects +# These help determine ARIMA model parameters (p, d, q) +# ----------------------------------------------------------------------------- +print("\n--- Autocorrelation Analysis ---") fig = subp( - rows = 3 , - cols = 2 , - subplot_titles = ( - "Malware ACF" , - "Malware PACF" , - "Intrusion ACF" , - "Intrusion PACF" , - "DDoS ACF" , - "DDoS PACF" , - ) - ) + rows=3, + cols=2, + subplot_titles=( + "Malware - Autocorrelation (ACF)", + "Malware - Partial Autocorrelation (PACF)", + "Intrusion - Autocorrelation (ACF)", + "Intrusion - Partial Autocorrelation (PACF)", + "DDoS - Autocorrelation (ACF)", + "DDoS - Partial Autocorrelation (PACF)", + ), + vertical_spacing=0.1, + horizontal_spacing=0.08 +) + from statsmodels.tsa.stattools import pacf from statsmodels.tsa.stattools import acf -import plotly.graph_objects as go Attacktype_TSanalysis = {} nlags = 100 -for i , attacktype in enumerate([ "Malware" , "Intrustion" , "DDoS" ]) : - Attacktype_TSanalysis[ f"{ attacktype }_ACF" ] = acf( Attacks_pday[ "Malware" ] , nlags = nlags ) - Attacktype_TSanalysis[ f"{ attacktype }_PACF" ] = pacf( Attacks_pday[ "Malware" ] , nlags = nlags ) - fig.add_trace( - go.Scatter( - x = list( range( 0 , nlags + 1 )) , - y = Attacktype_TSanalysis[ f"{ attacktype }_ACF" ] , - mode = "lines" , - name = "ACF" , - ) , - row = i + 1 , - col = 1 , - ) - fig.add_trace( - go.Scatter( - x = list( range( 0 , nlags + 1 )) , - y = Attacktype_TSanalysis[ f"{ attacktype }_PACF" ] , - mode = "lines" , - name = "PACF" , - ) , - row = i + 1, - col = 2 , - ) -fig.show() - -#%% - -df.to_csv( "data/df.csv" , sep = "|" ) - - - - - - - - - - - - +# Color scheme for attack types +ts_colors = {"Malware": "#636EFA", "Intrusion": "#EF553B", "DDoS": "#00CC96"} +for i, attacktype in enumerate(["Malware", "Intrusion", "DDoS"]): + # Calculate ACF and PACF + Attacktype_TSanalysis[f"{attacktype}_ACF"] = acf( + Attacks_pday[attacktype], nlags=nlags + ) + Attacktype_TSanalysis[f"{attacktype}_PACF"] = pacf( + Attacks_pday[attacktype], nlags=nlags + ) + # Plot ACF + fig.add_trace( + go.Scatter( + x=list(range(0, nlags + 1)), + y=Attacktype_TSanalysis[f"{attacktype}_ACF"], + mode="lines", + name=f"{attacktype} ACF", + line=dict(color=ts_colors[attacktype]), + hovertemplate=f"{attacktype} ACF
Lag: %{{x}}
Correlation: %{{y:.3f}}" + ), + row=i + 1, + col=1, + ) + # Plot PACF + fig.add_trace( + go.Scatter( + x=list(range(0, nlags + 1)), + y=Attacktype_TSanalysis[f"{attacktype}_PACF"], + mode="lines", + name=f"{attacktype} PACF", + line=dict(color=ts_colors[attacktype]), + hovertemplate=f"{attacktype} PACF
Lag: %{{x}}
Correlation: %{{y:.3f}}" + ), + row=i + 1, + col=2, + ) +fig.update_layout( + height=900, + title_text="Autocorrelation Analysis for Attack Time Series", + title_font_size=18, + showlegend=False +) +fig.update_xaxes(title_text="Lag (days)") +fig.update_yaxes(title_text="Correlation") +fig.show() +# %% Save Processed Dataset +# ============================================================================= +# SAVE PROCESSED DATASET +# ============================================================================= +# Export the processed DataFrame with all engineered features +print("\n" + "=" * 60) +print("SAVING PROCESSED DATASET") +print("=" * 60) +df.to_csv("data/df.csv", sep="|") +print("Dataset saved to data/df.csv") +print(f"Total records: {len(df):,}") +print(f"Total columns: {len(df.columns)}") +# %% [markdown] +# ## Rolling Average Trend Analysis +# Smooth the daily time series using rolling averages to identify trends +# %% Rolling Average Analysis +# ============================================================================= +# ROLLING AVERAGE TREND ANALYSIS +# ============================================================================= +# Apply a 30-day rolling average to smooth out daily fluctuations +# and reveal underlying trends in attack patterns -#%% +print("\n" + "=" * 60) +print("ROLLING AVERAGE TREND ANALYSIS") +print("=" * 60) -rw = 30 +rw = 30 # 30-day rolling window +print(f"Using {rw}-day rolling average window") tr1 = go.Scatter( - x = Attacks_pday.index , - y = Attacks_pday[ "Malware" ].rolling( rw ).mean() , - line_color = "blue" , + x=Attacks_pday.index, + y=Attacks_pday["Malware"].rolling(rw).mean(), + name=f"Malware ({rw}-day MA)", + line=dict(color="#636EFA", width=2), + hovertemplate="Malware
Date: %{x}
30-day Avg: %{y:.1f}" ) tr2 = go.Scatter( - x = Attacks_pday.index , - y = Attacks_pday[ "Intrusion" ].rolling( rw ).mean() , - line_color = "red" , - # yaxis = "y2" + x=Attacks_pday.index, + y=Attacks_pday["Intrusion"].rolling(rw).mean(), + name=f"Intrusion ({rw}-day MA)", + line=dict(color="#EF553B", width=2), + hovertemplate="Intrusion
Date: %{x}
30-day Avg: %{y:.1f}" ) tr3 = go.Scatter( - x = Attacks_pday.index , - y = Attacks_pday[ "DDoS" ].rolling( rw ).mean() , - line_color = "#000000" , - # yaxis = "y2" + x=Attacks_pday.index, + y=Attacks_pday["DDoS"].rolling(rw).mean(), + name=f"DDoS ({rw}-day MA)", + line=dict(color="#00CC96", width=2), + hovertemplate="DDoS
Date: %{x}
30-day Avg: %{y:.1f}" ) +# Create combined rolling average plot fig = subp() fig.add_trace(tr1) fig.add_trace(tr2) fig.add_trace(tr3) +fig.update_layout( + title_text=f"Attack Trends: {rw}-Day Rolling Average by Attack Type", + title_font_size=18, + xaxis_title="Date", + yaxis_title="Average Daily Attacks", + legend=dict( + orientation="h", + yanchor="bottom", + y=1.02, + xanchor="center", + x=0.5, + title="Attack Type" + ), + hovermode="x unified" +) fig.show() -#%% -px.line( - Attacks_pday , - x = Attacks_pday.index , - y = Attacks_pday[ "DDoS" ].rolling( 15 ).mean() , - mode = "line" , - title = "Number of DDoS attacks MA per day" -) +# %% DDoS Short-Term Trend (15-day MA) +# ============================================================================= +# DDoS SHORT-TERM TREND ANALYSIS +# ============================================================================= +# 15-day rolling average for more responsive trend detection + +print("\n--- DDoS 15-Day Moving Average ---") -#%% -Attacks_pmonth = df.copy( deep = True ) -Attacks_pmonth[ "date_mm" ] = Attacks_pmonth[ "date" ].dt.ceil( "d" ) -Attacks_pmonth = Attacks_pmonth.groupby([ "date_mm" , "Attack Type" ]).size().unstack().iloc[ 1 : - 1 , ] -px.line( - Attacks_pmonth , - x = Attacks_pmonth.index , - y = "DDoS" , - title = "Number of DDoS attacks per month" +fig = px.line( + Attacks_pday, + x=Attacks_pday.index, + y=Attacks_pday["DDoS"].rolling(15).mean(), + title="DDoS Attack Trend: 15-Day Rolling Average", + labels={"y": "15-Day Average Attacks", "x": "Date"} +) +fig.update_traces( + line=dict(color="#00CC96", width=2), + hovertemplate="DDoS
Date: %{x}
15-day Avg: %{y:.1f}" +) +fig.update_layout( + xaxis_title="Date", + yaxis_title="Average Daily DDoS Attacks", + showlegend=False ) +fig.show() + + +# %% Monthly Attack Aggregation +# ============================================================================= +# MONTHLY ATTACK AGGREGATION +# ============================================================================= +# Aggregate attacks by month for longer-term pattern analysis +print("\n" + "=" * 60) +print("MONTHLY ATTACK ANALYSIS") +print("=" * 60) +Attacks_pmonth = df.copy(deep=True) +Attacks_pmonth["date_mm"] = Attacks_pmonth["date"].dt.ceil("d") +Attacks_pmonth = ( + Attacks_pmonth.groupby(["date_mm", "Attack Type"]).size().unstack().iloc[1:-1,] +) + +fig = px.line( + Attacks_pmonth, + x=Attacks_pmonth.index, + y="DDoS", + title="Monthly DDoS Attack Volume", + labels={"y": "Number of Attacks", "date_mm": "Date"} +) +fig.update_traces( + line=dict(color="#00CC96", width=2), + hovertemplate="DDoS
Date: %{x}
Count: %{y}" +) +fig.update_layout( + xaxis_title="Date", + yaxis_title="Number of DDoS Attacks", + showlegend=False +) +fig.show() +print("\n" + "=" * 60) +print("ANALYSIS COMPLETE") +print("=" * 60) +# %%