From 5defe8aa25523e79197a29e8c1db22ac8f365fb2 Mon Sep 17 00:00:00 2001 From: Adrian Manikowski Date: Wed, 9 Oct 2024 11:20:15 +0000 Subject: [PATCH 1/2] Docker - Airflow - BUMP to 2.10.2 & debian12 --- docker/airflow/2/debian12/2.10/Dockerfile | 311 ++++ docker/airflow/2/debian12/2.10/components.csv | 1594 +++++++++++++++++ .../2.10/scripts/docker/install_airflow.sh | 27 + .../2.10/scripts/docker/install_mssql.sh | 24 + .../2.10/scripts/docker/install_mysql.sh | 54 + .../scripts/docker/install_pip_version.sh | 13 + .../debian12/2.10/scripts/prod/clean-logs.sh | 40 + .../2.10/scripts/prod/entrypoint_prod.sh | 326 ++++ .../airflow/2/debian12/2.10/source_code.txt | 17 + docker/airflow/2/debian12/2.6/Dockerfile | 311 ++++ docker/airflow/2/debian12/2.6/components.csv | 1594 +++++++++++++++++ .../2.6/scripts/docker/install_airflow.sh | 27 + .../2.6/scripts/docker/install_mssql.sh | 24 + .../2.6/scripts/docker/install_mysql.sh | 54 + .../2.6/scripts/docker/install_pip_version.sh | 13 + .../2/debian12/2.6/scripts/prod/clean-logs.sh | 40 + .../2.6/scripts/prod/entrypoint_prod.sh | 326 ++++ docker/airflow/2/debian12/2.6/source_code.txt | 17 + docker/airflow/templates/Dockerfile.template | 65 +- .../templates/scripts/docker/install_mysql.sh | 2 +- .../scripts/docker/install_pip_version.sh | 6 +- docker/airflow/versions.yaml | 28 +- 22 files changed, 4875 insertions(+), 38 deletions(-) create mode 100644 docker/airflow/2/debian12/2.10/Dockerfile create mode 100644 docker/airflow/2/debian12/2.10/components.csv create mode 100755 docker/airflow/2/debian12/2.10/scripts/docker/install_airflow.sh create mode 100755 docker/airflow/2/debian12/2.10/scripts/docker/install_mssql.sh create mode 100755 docker/airflow/2/debian12/2.10/scripts/docker/install_mysql.sh create mode 100755 docker/airflow/2/debian12/2.10/scripts/docker/install_pip_version.sh create mode 100755 docker/airflow/2/debian12/2.10/scripts/prod/clean-logs.sh create mode 100755 docker/airflow/2/debian12/2.10/scripts/prod/entrypoint_prod.sh create mode 100644 docker/airflow/2/debian12/2.10/source_code.txt create mode 100644 docker/airflow/2/debian12/2.6/Dockerfile create mode 100644 docker/airflow/2/debian12/2.6/components.csv create mode 100755 docker/airflow/2/debian12/2.6/scripts/docker/install_airflow.sh create mode 100755 docker/airflow/2/debian12/2.6/scripts/docker/install_mssql.sh create mode 100755 docker/airflow/2/debian12/2.6/scripts/docker/install_mysql.sh create mode 100755 docker/airflow/2/debian12/2.6/scripts/docker/install_pip_version.sh create mode 100755 docker/airflow/2/debian12/2.6/scripts/prod/clean-logs.sh create mode 100755 docker/airflow/2/debian12/2.6/scripts/prod/entrypoint_prod.sh create mode 100644 docker/airflow/2/debian12/2.6/source_code.txt diff --git a/docker/airflow/2/debian12/2.10/Dockerfile b/docker/airflow/2/debian12/2.10/Dockerfile new file mode 100644 index 0000000000..613ae499c6 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/Dockerfile @@ -0,0 +1,311 @@ +ARG AIRFLOW_VERSION="2.10.2" +ARG AIRFLOW_EXTRAS="amazon,async,celery,cncf.kubernetes,dask,docker,elasticsearch,ftp,google,google_auth,grpc,hashicorp,http,ldap,microsoft.azure,mysql,odbc,pandas,postgres,redis,sendgrid,sftp,slack,ssh,statsd,virtualenv,apache-airflow-providers-cncf-kubernetes" + +ARG AIRFLOW_HOME=/opt/airflow +ARG AIRFLOW_UID="50000" +ARG AIRFLOW_USER_HOME_DIR=/home/airflow +ARG AIRFLOW_PIP_VERSION="24.2" + + +FROM marketplace.gcr.io/google/debian12 as ospo + +# Download Licenses and restricted source-code +COPY components.csv /components.csv +COPY source_code.txt /source_code.txt + +RUN apt update && apt -y install ca-certificates curl + +RUN curl -o /download-licenses.sh -L https://raw.githubusercontent.com/GoogleCloudPlatform/click-to-deploy/master/scripts/download-licenses.sh \ + && curl -o /download-ref-repos.sh -L https://raw.githubusercontent.com/GoogleCloudPlatform/click-to-deploy/master/scripts/download-ref-repos.sh \ + && chmod +x /download-licenses.sh \ + && chmod +x /download-ref-repos.sh + +RUN mkdir -p /usr/src/licenses \ + && /download-licenses.sh /components.csv /usr/src/licenses \ + && /download-ref-repos.sh /source_code.txt /usr/src + + +FROM marketplace.gcr.io/google/debian12 as airflow-build-image + +SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "nounset", "-o", "nolog", "-c"] +ENV DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \ + LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends python3 python3-venv python3-pip + +# Create and activate virtual environment +RUN python3 -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Additional development dependencies +ENV DEV_APT_DEPS="\ + apt-transport-https \ + apt-utils \ + build-essential \ + ca-certificates \ + dirmngr \ + freetds-bin \ + freetds-dev \ + gosu \ + krb5-user \ + ldap-utils \ + libffi-dev \ + libkrb5-dev \ + libldap2-dev \ + libpq-dev \ + libsasl2-2 \ + libsasl2-dev \ + libsasl2-modules \ + libssl-dev \ + locales \ + lsb-release \ + nodejs \ + openssh-client \ + pkg-config \ + postgresql-client \ + python3 \ + python3-pip \ + python3-dev \ + sasl2-bin \ + software-properties-common \ + sqlite3 \ + sudo \ + unixodbc \ + unixodbc-dev \ + yarn" + +ENV DEV_APT_COMMAND="\ + curl --silent --fail --location https://deb.nodesource.com/setup_18.x | \ + bash -o pipefail -o errexit -o nolog - \ + && curl --silent https://dl.yarnpkg.com/debian/pubkey.gpg | \ + apt-key add - >/dev/null 2>&1\ + && echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list" + +RUN apt-get update \ + && apt-get install --no-install-recommends -yqq apt-utils >/dev/null 2>&1 \ + && apt-get install -y --no-install-recommends curl ca-certificates gnupg2 \ + && mkdir -pv /usr/share/man/man1 \ + && mkdir -pv /usr/share/man/man7 \ + && bash -o pipefail -o errexit -o nounset -o nolog -c "${DEV_APT_COMMAND}" \ + && apt-get update \ + && apt-get install -y --no-install-recommends ${DEV_APT_DEPS} \ + && apt-get autoremove -yqq --purge \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ARG AIRFLOW_EXTRAS +ARG AIRFLOW_VERSION +ARG AIRFLOW_PIP_VERSION +ARG AIRFLOW_HOME +ARG AIRFLOW_USER_HOME_DIR +ARG AIRFLOW_UID + +# Set additional environment variables +ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \ + AIRFLOW_VERSION=${AIRFLOW_VERSION} \ + AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS} \ + AIRFLOW_PRE_CACHED_PIP_PACKAGES="false" \ + INSTALL_PROVIDERS_FROM_SOURCES="false" \ + AIRFLOW_INSTALLATION_METHOD="apache-airflow" \ + PATH=${PATH}:${AIRFLOW_USER_HOME_DIR}/.local/bin \ + AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \ + AIRFLOW_USER_HOME_DIR=${AIRFLOW_USER_HOME_DIR} \ + AIRFLOW_HOME=${AIRFLOW_HOME} \ + AIRFLOW_UID=${AIRFLOW_UID} \ + INSTALL_MYSQL_CLIENT="true" \ + INSTALL_MSSQL_CLIENT="true" \ + PIP_USER="false" + +# Install required tools +COPY scripts/docker/install_mysql.sh scripts/docker/install_mssql.sh /scripts/docker/ +RUN /scripts/docker/install_mysql.sh dev && /scripts/docker/install_mssql.sh +ENV PATH=${PATH}:/opt/mssql-tools/bin + +# Add airflow user +RUN adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password \ + --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" && \ + mkdir -p ${AIRFLOW_HOME} && mkdir -p ${AIRFLOW_USER_HOME_DIR}/.local && \ + chown -R "airflow:0" "${AIRFLOW_USER_HOME_DIR}" ${AIRFLOW_HOME} + +# Change user to root then run pip install script and revert back to airflow user +USER root +COPY --chown=airflow:0 scripts/docker/install_pip_version.sh /scripts/docker/ +RUN /scripts/docker/install_pip_version.sh +USER airflow + +# Final environment settings and running installations +ENV INSTALL_FROM_PYPI="true" \ + EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3 certifi<2021.0.0 google-ads<14.0.1" + +WORKDIR /opt/airflow +COPY --chown=airflow:0 scripts/docker/install_airflow.sh /scripts/docker/ + +RUN /scripts/docker/install_airflow.sh \ + && find "${AIRFLOW_USER_HOME_DIR}/.local/" -name '*.pyc' -print0 | xargs -0 rm -f || true \ + && find "${AIRFLOW_USER_HOME_DIR}/.local/" -type d -name '__pycache__' -print0 | xargs -0 rm -rf || true \ + && find "${AIRFLOW_USER_HOME_DIR}/.local" -executable -print0 | xargs --null chmod g+x \ + && find "${AIRFLOW_USER_HOME_DIR}/.local" -print0 | xargs --null chmod g+rw + +FROM marketplace.gcr.io/google/debian12 as main + +# Copy necessary binaries and settings from build stage +COPY --from=ospo /usr/src /usr/src + +SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "nounset", "-o", "nolog", "-c"] + +# Set up necessary privileges +ARG AIRFLOW_USER_HOME_DIR +ARG AIRFLOW_HOME +ARG AIRFLOW_UID +ARG AIRFLOW_PIP_VERSION +ARG AIRFLOW_VERSION + +ENV AIRFLOW_VERSION=${AIRFLOW_VERSION} \ + DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \ + LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 \ + AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} + +# Runtime dependencies +ENV RUNTIME_APT_DEPS="\ + apt-transport-https \ + apt-utils \ + ca-certificates \ + curl \ + dumb-init \ + freetds-bin \ + krb5-user \ + ldap-utils \ + libffi8 \ + libldap-common \ + libsasl2-2 \ + libsasl2-modules \ + libssl-dev \ + locales \ + lsb-release \ + netcat-traditional \ + openssh-client \ + pkg-config \ + postgresql-client \ + dh-python \ + python3 \ + python3-pip \ + python3-venv \ + pkg-config \ + rsync \ + sasl2-bin \ + sqlite3 \ + sudo \ + unixodbc" + +ENV RUNTIME_APT_COMMAND="echo" \ + INSTALL_MYSQL_CLIENT="true" \ + INSTALL_MSSQL_CLIENT="true" \ + AIRFLOW_INSTALLATION_METHOD="apache-airflow" \ + AIRFLOW_UID=${AIRFLOW_UID} \ + AIRFLOW__CORE__LOAD_EXAMPLES="false" \ + AIRFLOW_USER_HOME_DIR=${AIRFLOW_USER_HOME_DIR} \ + AIRFLOW_HOME=${AIRFLOW_HOME} \ + PATH="${AIRFLOW_USER_HOME_DIR}/.local/bin:${PATH}" \ + GUNICORN_CMD_ARGS="--worker-tmp-dir /dev/shm" \ + PIP_USER="false" + +# Install and configure runtime environment +RUN apt-get update \ + && apt-get install --no-install-recommends -yqq apt-utils >/dev/null 2>&1 \ + && apt-get install -y --no-install-recommends curl ca-certificates gnupg2 \ + && mkdir -pv /usr/share/man/man1 \ + && mkdir -pv /usr/share/man/man7 \ + && bash -o pipefail -o errexit -o nounset -o nolog -c "${RUNTIME_APT_COMMAND}" \ + && apt-get update \ + && apt-get install -y --no-install-recommends ${RUNTIME_APT_DEPS} \ + && apt-get autoremove -yqq --purge \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/log/* \ + && ln -s /usr/bin/python3 /usr/bin/python + +# Install Gosu +# /usr/sbin/gosu +ENV GOSU_VERSION 1.17 +RUN set -eux; \ + apt-get update; \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + gpg \ + gpgv \ + libjemalloc2 \ + pwgen \ + tzdata \ + xz-utils \ + zstd ; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get install -y --no-install-recommends \ + dirmngr \ + gpg-agent \ + wget; \ + rm -rf /var/lib/apt/lists/*; \ + dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ + wget -q -O /usr/sbin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \ + wget -q -O /usr/sbin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \ + GNUPGHOME="$(mktemp -d)"; \ + export GNUPGHOME; \ + gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \ + gpg --batch --verify /usr/sbin/gosu.asc /usr/sbin/gosu; \ + gpgconf --kill all; \ + rm -rf "$GNUPGHOME" /usr/sbin/gosu.asc; \ + apt-mark auto '.*' > /dev/null; \ + [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark >/dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + chmod +x /usr/sbin/gosu; \ + gosu --version; \ + gosu nobody true + + +# Continue installation and set up user permissions +COPY scripts/docker/install_mysql.sh /scripts/docker/install_mssql.sh /scripts/docker/ +RUN chmod a+x /scripts/docker/install_mysql.sh /scripts/docker/install_mssql.sh \ + && sync \ + && /scripts/docker/install_mysql.sh prod \ + && /scripts/docker/install_mssql.sh \ + && adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" \ + && mkdir -pv "${AIRFLOW_HOME}" \ + && mkdir -pv "${AIRFLOW_HOME}/dags" \ + && mkdir -pv "${AIRFLOW_HOME}/logs" \ + && chown -R airflow:0 "${AIRFLOW_USER_HOME_DIR}" "${AIRFLOW_HOME}" \ + && chmod -R g+rw "${AIRFLOW_USER_HOME_DIR}" "${AIRFLOW_HOME}" \ + && find "${AIRFLOW_HOME}" -executable -print0 | xargs -0 chmod g+x \ + && find "${AIRFLOW_USER_HOME_DIR}" -executable -print0 | xargs -0 chmod g+x + +# Copy pre-built local environment for Airflow and set up entry points +COPY --chown=airflow:0 --from=airflow-build-image \ + "${AIRFLOW_USER_HOME_DIR}/.local" "${AIRFLOW_USER_HOME_DIR}/.local" +COPY --chown=airflow:0 scripts/prod/entrypoint_prod.sh /entrypoint +COPY --chown=airflow:0 scripts/prod/clean-logs.sh /clean-logs + +# Ensure scripts are executable and adjust file permissions appropriately +RUN chmod a+x /entrypoint /clean-logs \ + && chmod g=u /etc/passwd \ + && chmod g+w "${AIRFLOW_USER_HOME_DIR}/.local" + +# Modify secure path to include virtual environment +RUN sed --in-place=.bak "s/secure_path=\"/secure_path=\"\/.venv\/bin:/" /etc/sudoers + +# Environment settings for runtime +ENV DUMB_INIT_SETSID="1" \ + PS1="(airflow)" \ + LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libstdc++.so.6" + +# Set work directory and expose port for webserver +WORKDIR ${AIRFLOW_HOME} +EXPOSE 8080 + +# Run as airflow user +USER ${AIRFLOW_UID} + +# Define Airflow release version +ENV C2D_RELEASE 2.10.2 + +# Set default entrypoint and command for the container +ENTRYPOINT ["/usr/bin/dumb-init", "--", "/entrypoint"] +CMD [""] diff --git a/docker/airflow/2/debian12/2.10/components.csv b/docker/airflow/2/debian12/2.10/components.csv new file mode 100644 index 0000000000..972c4783d9 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/components.csv @@ -0,0 +1,1594 @@ +ampproject_remapping;https://github.com/ampproject/remapping +babel_code-frame;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_compat-data;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_core;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_eslint-parser;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_generator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-annotate-as-pure;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-builder-binary-assignment-operator-visitor;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-compilation-targets;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-create-class-features-plugin;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-create-regexp-features-plugin;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-define-polyfill-provider;https://github.com/babel/babel-polyfills +babel_helper-environment-visitor;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-explode-assignable-expression;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-function-name;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-get-function-arity;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-hoist-variables;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-member-expression-to-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-module-imports;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-module-transforms;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-optimise-call-expression;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-plugin-utils;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-remap-async-to-generator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-replace-supers;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-simple-access;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-skip-transparent-expression-wrappers;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-split-export-declaration;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-string-parser;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-validator-identifier;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-validator-option;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-wrap-function;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helpers;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_highlight;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_parser;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-bugfix-safari-id-destructuring-collision-in-function-expression;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-bugfix-v8-spread-parameters-in-optional-chaining;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-async-generator-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-class-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-class-static-block;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-dynamic-import;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-export-namespace-from;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-json-strings;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-logical-assignment-operators;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-nullish-coalescing-operator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-numeric-separator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-object-rest-spread;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-optional-catch-binding;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-optional-chaining;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-private-methods;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-private-property-in-object;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-unicode-property-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-async-generators;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-bigint;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-class-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-class-static-block;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-dynamic-import;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-export-namespace-from;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-import-meta;https://github.com/babel/babel +babel_plugin-syntax-json-strings;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-jsx;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-logical-assignment-operators;https://github.com/babel/babel +babel_plugin-syntax-nullish-coalescing-operator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-numeric-separator;https://github.com/babel/babel +babel_plugin-syntax-object-rest-spread;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-optional-catch-binding;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-optional-chaining;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-private-property-in-object;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-top-level-await;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-typescript;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-arrow-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-async-to-generator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-block-scoped-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-block-scoping;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-classes;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-computed-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-destructuring;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-dotall-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-duplicate-keys;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-exponentiation-operator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-for-of;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-function-name;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-member-expression-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-amd;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-commonjs;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-systemjs;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-umd;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-named-capturing-groups-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-new-target;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-object-super;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-parameters;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-property-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-display-name;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-jsx;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-jsx-development;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-pure-annotations;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-regenerator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-reserved-words;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-runtime;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-shorthand-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-spread;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-sticky-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-template-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-typeof-symbol;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-typescript;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-unicode-escapes;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-unicode-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_preset-env;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_preset-modules;https://github.com/babel/preset-modules +babel_preset-react;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_preset-typescript;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_runtime;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_runtime-corejs3;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_template;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_traverse;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_types;https://raw.githubusercontent.com/babel/babel/master/LICENSE +bcoe_v8-coverage;https://github.com/demurgos/v8-coverage +chakra-ui_accordion;https://github.com/chakra-ui/chakra-ui +chakra-ui_alert;https://github.com/chakra-ui/chakra-ui +chakra-ui_anatomy;https://github.com/chakra-ui/chakra-ui +chakra-ui_avatar;https://github.com/chakra-ui/chakra-ui +chakra-ui_breadcrumb;https://github.com/chakra-ui/chakra-ui +chakra-ui_breakpoint-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_button;https://github.com/chakra-ui/chakra-ui +chakra-ui_card;https://github.com/chakra-ui/chakra-ui +chakra-ui_checkbox;https://github.com/chakra-ui/chakra-ui +chakra-ui_clickable;https://github.com/chakra-ui/chakra-ui +chakra-ui_close-button;https://github.com/chakra-ui/chakra-ui +chakra-ui_color-mode;https://github.com/chakra-ui/chakra-ui +chakra-ui_control-box;https://github.com/chakra-ui/chakra-ui +chakra-ui_counter;https://github.com/chakra-ui/chakra-ui +chakra-ui_css-reset;https://github.com/chakra-ui/chakra-ui +chakra-ui_descendant;https://github.com/chakra-ui/chakra-ui +chakra-ui_dom-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_editable;https://github.com/chakra-ui/chakra-ui +chakra-ui_event-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_focus-lock;https://github.com/chakra-ui/chakra-ui +chakra-ui_form-control;https://github.com/chakra-ui/chakra-ui +chakra-ui_hooks;https://github.com/chakra-ui/chakra-ui +chakra-ui_icon;https://github.com/chakra-ui/chakra-ui +chakra-ui_image;https://github.com/chakra-ui/chakra-ui +chakra-ui_input;https://github.com/chakra-ui/chakra-ui +chakra-ui_layout;https://github.com/chakra-ui/chakra-ui +chakra-ui_lazy-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_live-region;https://github.com/chakra-ui/chakra-ui +chakra-ui_media-query;https://github.com/chakra-ui/chakra-ui +chakra-ui_menu;https://github.com/chakra-ui/chakra-ui +chakra-ui_modal;https://github.com/chakra-ui/chakra-ui +chakra-ui_number-input;https://github.com/chakra-ui/chakra-ui +chakra-ui_number-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_object-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_pin-input;https://github.com/chakra-ui/chakra-ui +chakra-ui_popover;https://github.com/chakra-ui/chakra-ui +chakra-ui_popper;https://github.com/chakra-ui/chakra-ui +chakra-ui_portal;https://github.com/chakra-ui/chakra-ui +chakra-ui_progress;https://github.com/chakra-ui/chakra-ui +chakra-ui_provider;https://github.com/chakra-ui/chakra-ui +chakra-ui_radio;https://github.com/chakra-ui/chakra-ui +chakra-ui_react;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-children-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-context;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-env;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-types;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-animation-state;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-callback-ref;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-controllable-state;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-disclosure;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-event-listener;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-focus-effect;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-focus-on-pointer-down;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-interval;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-latest-ref;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-merge-refs;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-outside-click;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-pan-event;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-previous;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-safe-layout-effect;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-size;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-timeout;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-update-effect;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_select;https://github.com/chakra-ui/chakra-ui +chakra-ui_shared-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_skeleton;https://github.com/chakra-ui/chakra-ui +chakra-ui_slider;https://github.com/chakra-ui/chakra-ui +chakra-ui_spinner;https://github.com/chakra-ui/chakra-ui +chakra-ui_stat;https://github.com/chakra-ui/chakra-ui +chakra-ui_styled-system;https://github.com/chakra-ui/chakra-ui +chakra-ui_switch;https://github.com/chakra-ui/chakra-ui +chakra-ui_system;https://github.com/chakra-ui/chakra-ui +chakra-ui_table;https://github.com/chakra-ui/chakra-ui +chakra-ui_tabs;https://github.com/chakra-ui/chakra-ui +chakra-ui_tag;https://github.com/chakra-ui/chakra-ui +chakra-ui_textarea;https://github.com/chakra-ui/chakra-ui +chakra-ui_theme;https://github.com/chakra-ui/chakra-ui +chakra-ui_theme-tools;https://github.com/chakra-ui/chakra-ui +chakra-ui_theme-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_toast;https://github.com/chakra-ui/chakra-ui +chakra-ui_tooltip;https://github.com/chakra-ui/chakra-ui +chakra-ui_transition;https://github.com/chakra-ui/chakra-ui +chakra-ui_utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_visually-hidden;https://github.com/chakra-ui/chakra-ui +csstools_css-parser-algorithms;https://github.com/csstools/postcss-plugins +csstools_css-tokenizer;https://github.com/csstools/postcss-plugins +csstools_media-query-list-parser;https://github.com/csstools/postcss-plugins +csstools_selector-specificity;https://github.com/csstools/postcss-plugins +discoveryjs_json-ext;https://github.com/discoveryjs/json-ext +emotion_babel-plugin;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_cache;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_hash;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_is-prop-valid;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_memoize;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_react;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_serialize;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_sheet;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_styled;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_unitless;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_utils;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_weak-memoize;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +eslint_eslintrc;https://github.com/eslint/eslintrc +exodus_schemasafe;https://github.com/ExodusMovement/schemasafe +fastify_busboy;https://github.com/fastify/busboy +humanwhocodes_config-array;https://github.com/humanwhocodes/config-array +humanwhocodes_object-schema;https://github.com/humanwhocodes/object-schema +istanbuljs_load-nyc-config;https://github.com/istanbuljs/load-nyc-config +istanbuljs_schema;https://github.com/istanbuljs/schema +jest_console;https://github.com/facebook/jest +jest_core;https://github.com/facebook/jest +jest_environment;https://github.com/facebook/jest +jest_fake-timers;https://github.com/facebook/jest +jest_globals;https://github.com/facebook/jest +jest_reporters;https://github.com/facebook/jest +jest_source-map;https://github.com/facebook/jest +jest_test-result;https://github.com/facebook/jest +jest_test-sequencer;https://github.com/facebook/jest +jest_transform;https://github.com/facebook/jest +jest_types;https://github.com/facebook/jest +jridgewell_gen-mapping;https://github.com/jridgewell/gen-mapping +jridgewell_resolve-uri;https://github.com/jridgewell/resolve-uri +jridgewell_set-array;https://github.com/jridgewell/set-array +jridgewell_source-map;https://github.com/jridgewell/source-map +jridgewell_sourcemap-codec;https://github.com/jridgewell/sourcemap-codec +jridgewell_trace-mapping;https://github.com/jridgewell/trace-mapping +nodelib_fs.scandir;https://raw.githubusercontent.com/nodelib/nodelib/master/LICENSE +nodelib_fs.stat;https://raw.githubusercontent.com/nodelib/nodelib/master/LICENSE +nodelib_fs.walk;https://raw.githubusercontent.com/nodelib/nodelib/master/LICENSE +npmcli_move-file;https://github.com/npm/move-file +popperjs_core;https://raw.githubusercontent.com/popperjs/popper-core/master/LICENSE +reactflow_background;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_controls;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_core;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_minimap;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_node-resizer;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_node-toolbar;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +redocly_ajv;https://github.com/ajv-validator/ajv +redocly_openapi-core;https://github.com/Redocly/redocly-cli +sinonjs_commons;https://github.com/sinonjs/commons +sinonjs_fake-timers;https://github.com/sinonjs/fake-timers +testing-library_dom;https://github.com/testing-library/dom-testing-library +testing-library_jest-dom;https://github.com/testing-library/jest-dom +testing-library_react;https://github.com/testing-library/react-testing-library +tootallnate_once;https://github.com/TooTallNate/once +trysound_sax;https://github.com/svg/sax +types_aria-query;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__core;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__generator;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__template;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__traverse;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_color;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_color-convert;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_color-name;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-array;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-axis;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-brush;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-chord;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-color;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-contour;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-delaunay;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-dispatch;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-drag;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-dsv;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-ease;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-fetch;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-force;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-format;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-geo;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-hierarchy;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-interpolate;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-path;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-polygon;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-quadtree;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-random;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-scale;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-scale-chromatic;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-selection;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-shape;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-time;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-time-format;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-timer;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-transition;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-zoom;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_debug;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_eslint;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_eslint-scope;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_estree;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_geojson;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_glob;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_graceful-fs;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_hast;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_istanbul-lib-coverage;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_istanbul-lib-report;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_istanbul-reports;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_jest;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_json-schema;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_json5;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_lodash;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_lodash.mergewith;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_mdast;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_minimatch;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_minimist;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_ms;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_node;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_normalize-package-data;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_parse-json;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_prettier;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_prop-types;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-dom;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-syntax-highlighter;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-table;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-transition-group;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_scheduler;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_source-list-map;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_stack-utils;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_tapable;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_testing-library__jest-dom;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_uglify-js;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_unist;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_webpack;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_webpack-sources;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_yargs;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_yargs-parser;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +typescript-eslint_eslint-plugin;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_parser;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_scope-manager;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_type-utils;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_types;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_typescript-estree;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_utils;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_visitor-keys;https://github.com/typescript-eslint/typescript-eslint +visx_curve;https://github.com/airbnb/visx +visx_group;https://github.com/airbnb/visx +visx_scale;https://github.com/airbnb/visx +visx_shape;https://github.com/airbnb/visx +webassemblyjs_ast;https://github.com/xtuc/webassemblyjs +webassemblyjs_floating-point-hex-parser;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-api-error;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-buffer;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-numbers;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-wasm-bytecode;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-wasm-section;https://github.com/xtuc/webassemblyjs +webassemblyjs_ieee754;https://github.com/xtuc/webassemblyjs +webassemblyjs_leb128;https://github.com/xtuc/webassemblyjs +webassemblyjs_utf8;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-edit;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-gen;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-opt;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-parser;https://github.com/xtuc/webassemblyjs +webassemblyjs_wast-printer;https://github.com/xtuc/webassemblyjs +webpack-cli_configtest;https://github.com/webpack/webpack-cli +webpack-cli_info;https://github.com/webpack/webpack-cli +webpack-cli_serve;https://github.com/webpack/webpack-cli +xtuc_ieee754;https://github.com/feross/ieee754 +xtuc_long;https://github.com/dcodeIO/long.js +zag-js_element-size;https://github.com/chakra-ui/zag.git#main +zag-js_focus-visible;https://github.com/chakra-ui/zag.git#main +Babel;https://raw.githubusercontent.com/python-babel/babel/master/LICENSE +ConfigUpdater;https://github.com/pyscaffold/configupdater +Deprecated;https://raw.githubusercontent.com/tantale/deprecated/master/LICENSE.rst +Flask;https://raw.githubusercontent.com/pallets/flask/master/LICENSE.rst +Flask-AppBuilder;https://raw.githubusercontent.com/dpgaspar/flask-appbuilder/master/LICENSE +Flask-Babel;https://raw.githubusercontent.com/python-babel/flask-babel/master/LICENSE +Flask-Caching;https://raw.githubusercontent.com/pallets-eco/flask-caching/master/LICENSE +Flask-JWT-Extended;https://raw.githubusercontent.com/vimalloc/flask-jwt-extended/master/LICENSE +Flask-Limiter;https://github.com/alisaifee/flask-limiter +Flask-Login;https://raw.githubusercontent.com/maxcountryman/flask-login/master/LICENSE +Flask-SQLAlchemy;https://raw.githubusercontent.com/pallets/flask-sqlalchemy/master/LICENSE.rst +Flask-Session;https://raw.githubusercontent.com/pallets-eco/flask-session/master/LICENSE.rst +Flask-WTF;https://raw.githubusercontent.com/wtforms/flask-wtf/master/LICENSE.rst +Jinja2;https://raw.githubusercontent.com/pallets/jinja/master/LICENSE.rst +Mako;https://raw.githubusercontent.com/sqlalchemy/mako/master/LICENSE +MarkupSafe;https://raw.githubusercontent.com/pallets/markupsafe/master/LICENSE.rst +PyAthena;https://github.com/laughingman7743/PyAthena +PyJWT;https://raw.githubusercontent.com/jpadilla/pyjwt/master/LICENSE +PyNaCl;https://raw.githubusercontent.com/pyca/pynacl/master/LICENSE +PyYAML;https://raw.githubusercontent.com/yaml/pyyaml/master/LICENSE +Pygments;https://raw.githubusercontent.com/pygments/pygments/master/LICENSE +SQLAlchemy;https://raw.githubusercontent.com/sqlalchemy/sqlalchemy/master/LICENSE +SQLAlchemy-JSONField;https://raw.githubusercontent.com/penguinolog/sqlalchemy_jsonfield/master/LICENSE +SQLAlchemy-Utils;https://raw.githubusercontent.com/kvesteri/sqlalchemy-utils/master/LICENSE +WTForms;https://raw.githubusercontent.com/wtforms/wtforms/master/LICENSE.rst +Werkzeug;https://raw.githubusercontent.com/pallets/werkzeug/master/LICENSE.rst +abab;https://github.com/jsdom/abab +acorn;https://github.com/acornjs/acorn +acorn-globals;https://raw.githubusercontent.com/ForbesLindesay/acorn-globals/master/LICENSE +acorn-import-assertions;https://github.com/xtuc/acorn-import-assertions +acorn-jsx;https://github.com/acornjs/acorn-jsx +acorn-walk;https://github.com/acornjs/acorn +agent-base;https://github.com/TooTallNate/node-agent-base +aggregate-error;https://github.com/sindresorhus/aggregate-error +aiofiles;https://raw.githubusercontent.com/Tinche/aiofiles/master/LICENSE +aiohttp;https://github.com/aio-libs/aiohttp +aiosignal;https://raw.githubusercontent.com/aio-libs/aiosignal/master/LICENSE +airflow-exporter;https://raw.githubusercontent.com/epoch8/airflow-exporter/master/LICENSE +airflow-www;https://airflow.apache.org/ +ajv;https://github.com/ajv-validator/ajv +ajv-formats;https://github.com/ajv-validator/ajv-formats +ajv-keywords;https://github.com/epoberezkin/ajv-keywords +alembic;https://raw.githubusercontent.com/sqlalchemy/alembic/master/LICENSE +amqp;https://raw.githubusercontent.com/celery/py-amqp/main/LICENSE +ansi-escapes;https://github.com/sindresorhus/ansi-escapes +ansi-regex;https://github.com/chalk/ansi-regex +ansi-styles;https://github.com/chalk/ansi-styles +anyio;https://raw.githubusercontent.com/agronholm/anyio/master/LICENSE +anymatch;https://github.com/micromatch/anymatch +apache-airflow;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-amazon;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-celery;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-common-io;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-common-sql;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-docker;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-elasticsearch;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-ftp;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-google;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-grpc;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-hashicorp;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-http;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-imap;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-mysql;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-odbc;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-postgres;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-redis;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-sendgrid;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-sftp;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-slack;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-sqlite;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-ssh;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apispec;https://raw.githubusercontent.com/marshmallow-code/apispec/master/LICENSE +argcomplete;https://raw.githubusercontent.com/kislyuk/argcomplete/master/LICENSE.rst +argparse;https://github.com/nodeca/argparse +aria-hidden;https://github.com/theKashey/aria-hidden +aria-query;https://github.com/A11yance/aria-query +array-buffer-byte-length;https://github.com/inspect-js/array-buffer-byte-length +array-includes;https://github.com/es-shims/array-includes +array-union;https://github.com/sindresorhus/array-union +array-uniq;https://github.com/sindresorhus/array-uniq +array.prototype.flat;https://github.com/es-shims/Array.prototype.flat +array.prototype.flatmap;https://github.com/es-shims/Array.prototype.flatMap +arrify;https://github.com/sindresorhus/arrify +asap;https://github.com/kriskowal/asap +asgiref;https://raw.githubusercontent.com/django/asgiref/master/LICENSE +asn1crypto;https://github.com/wbond/asn1crypto +ast-types-flow;https://github.com/kyldvs/ast-types-flow +astral-regex;https://github.com/kevva/astral-regex +async-timeout;https://raw.githubusercontent.com/aio-libs/async-timeout/master/LICENSE +asynckit;https://github.com/alexindigo/asynckit +asyncssh;https://raw.githubusercontent.com/ronf/asyncssh/master/LICENSE +atob;https://git.coolaj86.com/coolaj86/atob.js/raw/branch/master/LICENSE +attrs;https://raw.githubusercontent.com/python-attrs/attrs/master/LICENSE +available-typed-arrays;https://github.com/inspect-js/available-typed-arrays +axe-core;https://github.com/dequelabs/axe-core +axios;https://github.com/axios/axios +axobject-query;https://github.com/A11yance/axobject-query +babel-jest;https://github.com/facebook/jest +babel-loader;https://raw.githubusercontent.com/babel/babel-loader/master/LICENSE +babel-plugin-dynamic-import-node;https://github.com/airbnb/babel-plugin-dynamic-import-node +babel-plugin-istanbul;https://github.com/istanbuljs/babel-plugin-istanbul +babel-plugin-jest-hoist;https://github.com/facebook/jest +babel-plugin-macros;https://github.com/kentcdodds/babel-plugin-macros +babel-plugin-polyfill-corejs2;https://github.com/babel/babel-polyfills +babel-plugin-polyfill-corejs3;https://github.com/babel/babel-polyfills +babel-plugin-polyfill-regenerator;https://github.com/babel/babel-polyfills +babel-preset-current-node-syntax;https://raw.githubusercontent.com/nicolo-ribaudo/babel-preset-current-node-syntax/master/LICENSE +babel-preset-jest;https://github.com/facebook/jest +backoff;https://raw.githubusercontent.com/litl/backoff/master/LICENSE +bail;https://github.com/wooorm/bail +balanced-match;https://github.com/juliangruber/balanced-match +base16;https://github.com/gaearon/base16-js +bcrypt;https://raw.githubusercontent.com/pyca/bcrypt/master/LICENSE +beautifulsoup4;https://www.crummy.com/software/BeautifulSoup/bs4/ +big-integer;ssh://git@github.com/peterolson/BigInteger.js +big.js;https://github.com/MikeMcl/big.js +billiard;https://raw.githubusercontent.com/celery/billiard/main/LICENSE.txt +blinker;https://raw.githubusercontent.com/pallets-eco/blinker/master/LICENSE.rst +boolbase;https://github.com/fb55/boolbase +bootstrap;https://github.com/twbs/bootstrap +bootstrap-3-typeahead;https://github.com/bassjobsen/Bootstrap-3-Typeahead +boto3;https://raw.githubusercontent.com/boto/boto/master/LICENSE +botocore;https://github.com/boto/botocore +brace-expansion;https://github.com/juliangruber/brace-expansion +braces;https://github.com/micromatch/braces +broadcast-channel;https://github.com/pubkey/broadcast-channel +browser-process-hrtime;https://github.com/kumavis/browser-process-hrtime +browserslist;https://github.com/browserslist/browserslist +bser;https://raw.githubusercontent.com/facebook/watchman/master/LICENSE +buffer-from;https://github.com/LinusU/buffer-from +cacache;https://github.com/npm/cacache +cachelib;https://raw.githubusercontent.com/pallets/cachelib/master/LICENSE.rst +cachetools;https://raw.githubusercontent.com/tkem/cachetools/master/LICENSE +call-bind;https://github.com/ljharb/call-bind +call-me-maybe;https://github.com/limulus/call-me-maybe +callsites;https://github.com/sindresorhus/callsites +camelcase;https://github.com/sindresorhus/camelcase +camelcase-keys;https://github.com/sindresorhus/camelcase-keys +caniuse-api;https://github.com/nyalab/caniuse-api +caniuse-lite;https://github.com/browserslist/caniuse-lite +cattrs;https://raw.githubusercontent.com/python-attrs/cattrs/master/LICENSE +ccount;https://github.com/wooorm/ccount +celery;https://raw.githubusercontent.com/celery/celery/master/LICENSE +certifi;https://raw.githubusercontent.com/certifi/python-certifi/master/LICENSE +cffi;https://raw.githubusercontent.com/python-cffi/cffi/master/LICENSE +chakra-react-select;https://github.com/csandman/chakra-react-select +chalk;https://github.com/chalk/chalk +char-regex;https://github.com/Richienb/char-regex +character-entities;https://github.com/wooorm/character-entities +character-entities-legacy;https://github.com/wooorm/character-entities-legacy +character-reference-invalid;https://github.com/wooorm/character-reference-invalid +chardet;https://raw.githubusercontent.com/chardet/chardet/master/LICENSE +charset-normalizer;https://raw.githubusercontent.com/Ousret/charset_normalizer/master/LICENSE +chownr;https://github.com/isaacs/chownr +chrome-trace-event;https://github.com/samccone/chrome-trace-event +ci-info;https://github.com/watson/ci-info +cjs-module-lexer;https://github.com/guybedford/cjs-module-lexer +classcat;https://github.com/jorgebucaran/classcat +classnames;https://github.com/JedWatson/classnames +clean-stack;https://github.com/sindresorhus/clean-stack +clean-webpack-plugin;https://github.com/johnagan/clean-webpack-plugin +cli;ssh://git@github.com/node-js-libs/cli +click;https://raw.githubusercontent.com/pallets/click/master/LICENSE.rst +click-didyoumean;https://raw.githubusercontent.com/click-contrib/click-didyoumean/master/LICENSE +click-plugins;https://github.com/click-contrib/click-plugins/blob/main/LICENSE.txt +click-repl;https://raw.githubusercontent.com/untitaker/click-repl/master/LICENSE +clickclick;https://raw.githubusercontent.com/hjacobs/python-clickclick/master/LICENSE +cliui;https://github.com/yargs/cliui +clone-deep;https://github.com/jonschlinkert/clone-deep +clsx;https://github.com/lukeed/clsx +co;https://github.com/tj/co +codemirror;https://github.com/codemirror/CodeMirror +collect-v8-coverage;https://github.com/SimenB/collect-v8-coverage +color;https://github.com/Qix-/color +color-convert;https://github.com/Qix-/color-convert +color-name;ssh://git@github.com/dfcreative/color-name +color-name;ssh://git@github.com/colorjs/color-name +color-string;https://github.com/Qix-/color-string +color2k;https://github.com/ricokahler/color2k +colorama;https://raw.githubusercontent.com/tartley/colorama/master/LICENSE.txt +colord;https://github.com/omgovich/colord +colorette;https://github.com/jorgebucaran/colorette +colorlog;https://raw.githubusercontent.com/borntyping/python-colorlog/master/LICENSE +combined-stream;https://github.com/felixge/node-combined-stream +comma-separated-tokens;https://github.com/wooorm/comma-separated-tokens +commander;https://github.com/tj/commander.js +commondir;http://github.com/substack/node-commondir +compute-scroll-into-view;https://github.com/stipsan/compute-scroll-into-view +concat-map;https://github.com/substack/node-concat-map +confusing-browser-globals;https://github.com/facebook/create-react-app +connexion;https://raw.githubusercontent.com/zalando/connexion/main/LICENSE +console-browserify;https://raw.githubusercontent.com/browserify/console-browserify/master/LICENCE +convert-source-map;https://github.com/thlorenz/convert-source-map +copy-to-clipboard;https://github.com/sudodoki/copy-to-clipboard +copy-webpack-plugin;https://github.com/webpack-contrib/copy-webpack-plugin +core-js-compat;https://github.com/zloirock/core-js +core-js-pure;https://github.com/zloirock/core-js +core-util-is;https://github.com/isaacs/core-util-is +cosmiconfig;https://github.com/davidtheclark/cosmiconfig +cosmiconfig;https://github.com/cosmiconfig/cosmiconfig +cron-descriptor;https://raw.githubusercontent.com/Salamek/cron-descriptor/master/LICENSE +croniter;http://github.com/kiorky/croniter +cross-fetch;https://github.com/lquixada/cross-fetch +cross-spawn;ssh://git@github.com/moxystudio/node-cross-spawn +cryptography;https://raw.githubusercontent.com/pyca/cryptography/master/LICENSE.APACHE +css;https://github.com/reworkcss/css +css-box-model;https://github.com/alexreardon/css-box-model +css-declaration-sorter;https://github.com/Siilwyn/css-declaration-sorter +css-functions-list;https://github.com/niksy/css-functions-list +css-loader;https://github.com/webpack-contrib/css-loader +css-minimizer-webpack-plugin;https://github.com/webpack-contrib/css-minimizer-webpack-plugin +css-select;https://github.com/fb55/css-select +css-tree;https://github.com/csstree/csstree +css-what;https://github.com/fb55/css-what +css.escape;https://github.com/mathiasbynens/CSS.escape +cssesc;https://github.com/mathiasbynens/cssesc +cssfontparser;https://github.com/tmpvar/cssfontparser +cssnano;https://github.com/cssnano/cssnano +cssnano-preset-default;https://github.com/cssnano/cssnano +cssnano-utils;cssnano/cssnano +csso;https://github.com/css/csso +cssom;https://github.com/NV/CSSOM +cssstyle;https://github.com/jsdom/cssstyle +csstype;https://github.com/frenic/csstype +d3;https://github.com/mbostock/d3 +d3;https://github.com/d3/d3 +d3-array;https://github.com/d3/d3-array +d3-axis;https://github.com/d3/d3-axis +d3-brush;https://github.com/d3/d3-brush +d3-chord;https://github.com/d3/d3-chord +d3-collection;https://github.com/d3/d3-collection +d3-color;https://github.com/d3/d3-color +d3-contour;https://github.com/d3/d3-contour +d3-dispatch;https://github.com/d3/d3-dispatch +d3-drag;https://github.com/d3/d3-drag +d3-dsv;https://github.com/d3/d3-dsv +d3-ease;https://github.com/d3/d3-ease +d3-fetch;https://github.com/d3/d3-fetch +d3-force;https://github.com/d3/d3-force +d3-format;https://github.com/d3/d3-format +d3-geo;https://github.com/d3/d3-geo +d3-hierarchy;https://github.com/d3/d3-hierarchy +d3-interpolate;https://github.com/d3/d3-interpolate +d3-path;https://github.com/d3/d3-path +d3-polygon;https://github.com/d3/d3-polygon +d3-quadtree;https://github.com/d3/d3-quadtree +d3-random;https://github.com/d3/d3-random +d3-scale;https://github.com/d3/d3-scale +d3-scale-chromatic;https://github.com/d3/d3-scale-chromatic +d3-selection;https://github.com/d3/d3-selection +d3-shape;https://github.com/d3/d3-shape +d3-time;https://github.com/d3/d3-time +d3-time-format;https://github.com/d3/d3-time-format +d3-timer;https://github.com/d3/d3-timer +d3-tip;https://github.com/Caged/d3-tip +d3-transition;https://github.com/d3/d3-transition +d3-voronoi;https://github.com/d3/d3-voronoi +d3-zoom;https://github.com/d3/d3-zoom +dagre;https://github.com/dagrejs/dagre +dagre-d3;https://github.com/dagrejs/dagre-d3 +damerau-levenshtein;https://github.com/tad-lispy/node-damerau-levenshtein +data-urls;https://github.com/jsdom/data-urls +datatables.net;https://github.com/DataTables/Dist-DataTables +datatables.net-bs;https://github.com/DataTables/Dist-DataTables-Bootstrap +date-now;https://raw.githubusercontent.com/Colingo/date-now/master/LICENCE +db-dtypes;https://raw.githubusercontent.com/googleapis/python-db-dtypes-pandas/master/LICENSE +debug;https://github.com/visionmedia/debug +debug;https://github.com/debug-js/debug +decamelize;https://github.com/sindresorhus/decamelize +decamelize-keys;https://github.com/dsblv/decamelize-keys +decimal.js;https://github.com/MikeMcl/decimal.js +decko;https://raw.githubusercontent.com/developit/decko/master/LICENSE +decode-named-character-reference;https://github.com/wooorm/decode-named-character-reference +decode-uri-component;https://github.com/SamVerschueren/decode-uri-component +decorator;https://raw.githubusercontent.com/micheles/decorator/master/LICENSE.txt +dedent;https://github.com/dmnd/dedent +deep-is;ssh://git@github.com/thlorenz/deep-is +deepmerge;https://github.com/TehShrike/deepmerge +define-properties;https://github.com/ljharb/define-properties +del;https://github.com/sindresorhus/del +delayed-stream;https://github.com/felixge/node-delayed-stream +dequal;https://github.com/lukeed/dequal +detect-newline;https://github.com/sindresorhus/detect-newline +detect-node;https://github.com/iliakan/detect-node +detect-node-es;https://github.com/thekashey/detect-node +diff;https://github.com/kpdecker/jsdiff +diff-sequences;https://github.com/facebook/jest +dill;https://raw.githubusercontent.com/uqfoundation/dill/master/LICENSE +dir-glob;https://github.com/kevva/dir-glob +distlib;https://github.com/pypa/distlib +dnspython;https://raw.githubusercontent.com/rthalley/dnspython/master/LICENSE +docker;https://raw.githubusercontent.com/docker/docker-py/master/LICENSE +doctrine;https://github.com/eslint/doctrine +docutils;https://raw.githubusercontent.com/docutils/docutils/master/docutils/licenses/BSD-2-Clause.txt +dom-accessibility-api;https://github.com/eps1lon/dom-accessibility-api +dom-helpers;https://github.com/react-bootstrap/dom-helpers +dom-serializer;https://github.com/cheeriojs/dom-renderer +domelementtype;https://github.com/fb55/domelementtype +domexception;https://github.com/jsdom/domexception +domhandler;https://github.com/fb55/DomHandler +domhandler;https://github.com/fb55/domhandler +dompurify;https://raw.githubusercontent.com/cure53/DOMPurify/main/LICENSE +domutils;https://github.com/FB55/domutils +domutils;https://github.com/fb55/domutils +echarts;https://github.com/apache/echarts +elastic-transport;https://raw.githubusercontent.com/elastic/elastic-transport-python/master/LICENSE +elasticsearch;https://raw.githubusercontent.com/elastic/elasticsearch-py/master/LICENSE +electron-to-chromium;https://github.com/kilian/electron-to-chromium +elkjs;https://github.com/kieler/elkjs +email-validator;https://raw.githubusercontent.com/JoshData/python-email-validator/master/LICENSE +emittery;https://github.com/sindresorhus/emittery +emoji-regex;https://github.com/mathiasbynens/emoji-regex +emojis-list;https://github.com/kikobeats/emojis-list +enhanced-resolve;https://github.com/webpack/enhanced-resolve +entities;https://raw.githubusercontent.com/fb55/entities/master/LICENSE +entities;https://github.com/fb55/entities +envinfo;https://github.com/tabrindle/envinfo +eonasdan-bootstrap-datetimepicker;https://github.com/eonasdan/bootstrap-datetimepicker +error-ex;https://github.com/qix-/node-error-ex +es-abstract;https://github.com/ljharb/es-abstract +es-module-lexer;https://github.com/guybedford/es-module-lexer +es-set-tostringtag;https://github.com/es-shims/es-set-tostringtag +es-shim-unscopables;https://github.com/ljharb/es-shim-unscopables +es-to-primitive;https://github.com/ljharb/es-to-primitive +es6-promise;https://github.com/stefanpenner/es6-promise +escalade;https://github.com/lukeed/escalade +escape-string-regexp;https://github.com/sindresorhus/escape-string-regexp +escodegen;ssh://git@github.com/estools/escodegen +eslint;https://github.com/eslint/eslint +eslint-config-airbnb;https://github.com/airbnb/javascript +eslint-config-airbnb-base;https://github.com/airbnb/javascript +eslint-config-airbnb-typescript;https://github.com/iamturns/eslint-config-airbnb-typescript +eslint-config-prettier;https://github.com/prettier/eslint-config-prettier +eslint-import-resolver-node;https://github.com/import-js/eslint-plugin-import +eslint-module-utils;https://github.com/import-js/eslint-plugin-import +eslint-plugin-es;https://github.com/mysticatea/eslint-plugin-es +eslint-plugin-html;https://github.com/BenoitZugmeyer/eslint-plugin-html +eslint-plugin-import;https://github.com/import-js/eslint-plugin-import +eslint-plugin-jsx-a11y;https://github.com/jsx-eslint/eslint-plugin-jsx-a11y +eslint-plugin-node;https://github.com/mysticatea/eslint-plugin-node +eslint-plugin-promise;https://github.com/xjamundx/eslint-plugin-promise +eslint-plugin-react;https://github.com/jsx-eslint/eslint-plugin-react +eslint-plugin-react-hooks;https://github.com/facebook/react +eslint-plugin-standard;https://github.com/standard/eslint-plugin-standard +eslint-scope;https://github.com/eslint/eslint-scope +eslint-utils;https://github.com/mysticatea/eslint-utils +eslint-visitor-keys;https://github.com/eslint/eslint-visitor-keys +espree;https://github.com/eslint/espree +esprima;https://github.com/jquery/esprima +esquery;https://github.com/estools/esquery +esrecurse;https://github.com/estools/esrecurse +estraverse;ssh://git@github.com/estools/estraverse +esutils;ssh://git@github.com/estools/esutils +eventemitter3;https://github.com/primus/eventemitter3 +eventlet;https://raw.githubusercontent.com/eventlet/eventlet/master/LICENSE +events;https://github.com/Gozala/events +exceptiongroup;https://raw.githubusercontent.com/agronholm/exceptiongroup/master/LICENSE +execa;https://github.com/sindresorhus/execa +exit;https://raw.githubusercontent.com/cowboy/node-exit/master/LICENSE-MIT +expect;https://github.com/facebook/jest +extend;https://github.com/justmoon/node-extend +fast-deep-equal;https://github.com/epoberezkin/fast-deep-equal +fast-glob;https://github.com/mrmlnc/fast-glob +fast-json-stable-stringify;https://github.com/epoberezkin/fast-json-stable-stringify +fast-levenshtein;https://github.com/hiddentao/fast-levenshtein +fast-safe-stringify;https://github.com/davidmarkclements/fast-safe-stringify +fastest-levenshtein;https://github.com/ka-weihe/fastest-levenshtein +fastq;https://github.com/mcollina/fastq +fault;https://github.com/wooorm/fault +fb-watchman;git@github.com:facebook/watchman +fbemitter;https://github.com/facebook/emitter +fbjs;https://raw.githubusercontent.com/facebook/fbjs/master/LICENSE +fbjs-css-vars;https://github.com/facebook/fbjs +file-entry-cache;https://github.com/royriojas/file-entry-cache +file-loader;https://github.com/webpack-contrib/file-loader +filelock;https://raw.githubusercontent.com/tox-dev/py-filelock/master/LICENSE +fill-range;https://github.com/jonschlinkert/fill-range +find-cache-dir;https://github.com/avajs/find-cache-dir +find-root;ssh://git@github.com/js-n/find-root +find-up;https://github.com/sindresorhus/find-up +flat-cache;https://github.com/royriojas/flat-cache +flatted;https://github.com/WebReflection/flatted +flower;https://raw.githubusercontent.com/mher/flower/master/LICENSE +flux;https://raw.githubusercontent.com/facebook/flux/master/LICENSE +focus-lock;https://github.com/theKashey/focus-lock +follow-redirects;ssh://git@github.com/follow-redirects/follow-redirects +for-each;https://github.com/Raynos/for-each +foreach;https://github.com/manuelstofer/foreach +form-data;https://github.com/form-data/form-data +format;https://raw.githubusercontent.com/samsonjs/format/main/License.md +framer-motion;https://github.com/framer/motion +framesync;https://github.com/Popmotion/popmotion +frozenlist;https://raw.githubusercontent.com/aio-libs/frozenlist/master/LICENSE +fs-minipass;https://github.com/npm/fs-minipass +fs.realpath;https://github.com/isaacs/fs.realpath +fsevents;https://github.com/fsevents/fsevents +fsspec;https://raw.githubusercontent.com/fsspec/filesystem_spec/master/LICENSE +function-bind;https://github.com/Raynos/function-bind +function.prototype.name;https://github.com/es-shims/Function.prototype.name +functional-red-black-tree;https://github.com/mikolalysenko/functional-red-black-tree +functions-have-names;https://github.com/inspect-js/functions-have-names +gcloud-aio-auth;https://github.com/talkiq/gcloud-aio +gcloud-aio-bigquery;https://github.com/talkiq/gcloud-aio +gcloud-aio-storage;https://github.com/talkiq/gcloud-aio +gcsfs;https://raw.githubusercontent.com/fsspec/gcsfs/main/LICENSE.txt +gensync;https://github.com/loganfsmyth/gensync +get-caller-file;https://github.com/stefanpenner/get-caller-file +get-intrinsic;https://github.com/ljharb/get-intrinsic +get-nonce;ssh://git@github.com/theKashey/get-nonce +get-npm-tarball-url;https://github.com/pnpm/get-npm-tarball-url +get-package-type;https://github.com/cfware/get-package-type +get-stream;https://github.com/sindresorhus/get-stream +get-symbol-description;https://github.com/inspect-js/get-symbol-description +gevent;https://raw.githubusercontent.com/gevent/gevent/master/LICENSE +github.com_moby_sys_user;https://raw.githubusercontent.com/moby/sys/master/LICENSE +github.com_tianon_gosu;https://raw.githubusercontent.com/tianon/gosu/master/LICENSE +glob;https://github.com/isaacs/node-glob +glob-parent;https://github.com/gulpjs/glob-parent +glob-to-regexp;https://github.com/fitzgen/glob-to-regexp +global-modules;https://github.com/jonschlinkert/global-modules +global-prefix;https://github.com/jonschlinkert/global-prefix +globals;https://github.com/sindresorhus/globals +globalthis;https://github.com/ljharb/System.global +globalyzer;https://github.com/terkelg/globalyzer +globby;https://github.com/sindresorhus/globby +globjoin;https://github.com/amobiz/globjoin +globrex;https://github.com/terkelg/globrex +golang.org_x_sys;https://go.googlesource.com/sys +google-ads;https://raw.githubusercontent.com/googleads/google-ads-python/master/LICENSE +google-analytics-admin;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-api-core;https://raw.githubusercontent.com/googleapis/python-api-core/master/LICENSE +google-api-python-client;https://raw.githubusercontent.com/googleapis/google-api-python-client/master/LICENSE +google-auth;https://raw.githubusercontent.com/googleapis/google-auth-library-python/master/LICENSE +google-auth-httplib2;https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2 +google-auth-oauthlib;https://raw.githubusercontent.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/master/LICENSE +google-cloud-aiplatform;https://raw.githubusercontent.com/googleapis/python-aiplatform/master/LICENSE +google-cloud-appengine-logging;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-audit-log;https://raw.githubusercontent.com/googleapis/python-audit-log/master/LICENSE +google-cloud-automl;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-batch;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-bigquery;https://raw.githubusercontent.com/googleapis/python-bigquery/master/LICENSE +google-cloud-bigquery-datatransfer;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-bigquery-storage;https://raw.githubusercontent.com/googleapis/python-bigquery-storage/master/LICENSE +google-cloud-bigtable;https://raw.githubusercontent.com/googleapis/python-bigtable/master/LICENSE +google-cloud-build;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-compute;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-container;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-core;https://raw.githubusercontent.com/googleapis/python-cloud-core/master/LICENSE +google-cloud-datacatalog;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataflow-client;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataform;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataplex;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataproc;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataproc-metastore;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dlp;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-kms;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-language;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-logging;https://raw.githubusercontent.com/googleapis/python-logging/master/LICENSE +google-cloud-memcache;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-monitoring;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-orchestration-airflow;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-os-login;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-pubsub;https://raw.githubusercontent.com/googleapis/python-pubsub/master/LICENSE +google-cloud-redis;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-resource-manager;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-run;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-secret-manager;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-spanner;https://raw.githubusercontent.com/googleapis/python-spanner/master/LICENSE +google-cloud-speech;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-storage;https://raw.githubusercontent.com/googleapis/python-storage/master/LICENSE +google-cloud-storage-transfer;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-tasks;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-texttospeech;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-translate;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-videointelligence;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-vision;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-workflows;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-crc32c;https://github.com/googleapis/python-crc32c +google-re2;https://raw.githubusercontent.com/google/re2/main/LICENSE +google-resumable-media;https://raw.githubusercontent.com/googleapis/google-resumable-media-python/master/LICENSE +googleapis-common-protos;https://raw.githubusercontent.com/googleapis/python-api-common-protos/master/LICENSE +gopd;https://github.com/ljharb/gopd +graceful-fs;https://github.com/isaacs/node-graceful-fs +graphlib;https://github.com/dagrejs/graphlib +greenlet;https://raw.githubusercontent.com/python-greenlet/greenlet/master/LICENSE +grpc-google-iam-v1;https://github.com/googleapis/python-grpc-google-iam-v1 +grpc-interceptor;https://github.com/d5h-foss/grpc-interceptor +grpcio;https://raw.githubusercontent.com/grpc/grpc/master/LICENSE +grpcio-gcp;https://raw.githubusercontent.com/GoogleCloudPlatform/grpc-gcp-python/master/LICENSE +grpcio-status;https://pypi.org/project/grpcio-status/ +gunicorn;https://raw.githubusercontent.com/benoitc/gunicorn/master/LICENSE +h11;https://github.com/python-hyper/h11 +hard-rejection;https://github.com/sindresorhus/hard-rejection +has;https://github.com/tarruda/has +has-bigints;https://github.com/ljharb/has-bigints +has-flag;https://github.com/sindresorhus/has-flag +has-property-descriptors;https://github.com/inspect-js/has-property-descriptors +has-proto;https://github.com/inspect-js/has-proto +has-symbols;https://github.com/inspect-js/has-symbols +has-tostringtag;https://github.com/inspect-js/has-tostringtag +hast-util-parse-selector;https://github.com/syntax-tree/hast-util-parse-selector +hast-util-whitespace;https://github.com/syntax-tree/hast-util-whitespace +hastscript;https://github.com/syntax-tree/hastscript +hey-listen;https://github.com/Popmotion/hey-listen +highlight.js;https://github.com/highlightjs/highlight.js +history;https://github.com/remix-run/history +hoist-non-react-statics;https://github.com/mridgway/hoist-non-react-statics +hosted-git-info;https://github.com/npm/hosted-git-info +html-encoding-sniffer;https://github.com/jsdom/html-encoding-sniffer +html-escaper;https://github.com/WebReflection/html-escaper +html-tags;https://github.com/sindresorhus/html-tags +htmlparser2;https://github.com/fb55/htmlparser2 +http-proxy-agent;https://github.com/TooTallNate/node-http-proxy-agent +http2-client;https://github.com/hisco/http2-client +httpcore;https://raw.githubusercontent.com/encode/httpcore/master/LICENSE.md +httplib2;https://github.com/httplib2/httplib2 +https-proxy-agent;https://github.com/TooTallNate/node-https-proxy-agent +httpx;https://raw.githubusercontent.com/encode/httpx/master/LICENSE.md +human-signals;https://github.com/ehmicky/human-signals +humanize;https://github.com/python-humanize/humanize +hvac;https://github.com/hvac/hvac +iconv-lite;https://github.com/ashtuchkin/iconv-lite +icss-utils;https://github.com/css-modules/icss-utils +idna;https://raw.githubusercontent.com/kjd/idna/master/LICENSE.md +ignore;ssh://git@github.com/kaelzhang/node-ignore +import-fresh;https://github.com/sindresorhus/import-fresh +import-lazy;https://github.com/sindresorhus/import-lazy +import-local;https://github.com/sindresorhus/import-local +importlib-metadata;https://raw.githubusercontent.com/python/importlib_metadata/master/LICENSE +importlib-resources;https://raw.githubusercontent.com/python/importlib_resources/master/LICENSE +imports-loader;https://github.com/webpack-contrib/imports-loader +imurmurhash;https://raw.githubusercontent.com/jensyt/imurmurhash-js/master/LICENSE +indent-string;https://github.com/sindresorhus/indent-string +infer-owner;https://github.com/npm/infer-owner +inflection;https://raw.githubusercontent.com/jpvanhal/inflection/master/LICENSE +inflight;https://github.com/npm/inflight +inherits;https://github.com/isaacs/inherits +ini;https://github.com/isaacs/ini +inline-style-parser;https://github.com/remarkablemark/inline-style-parser +internal-slot;https://github.com/ljharb/internal-slot +internmap;https://github.com/mbostock/internmap +interpret;https://github.com/gulpjs/interpret +invariant;https://github.com/zertosh/invariant +is-alphabetical;https://github.com/wooorm/is-alphabetical +is-alphanumerical;https://github.com/wooorm/is-alphanumerical +is-array-buffer;https://github.com/inspect-js/is-array-buffer +is-arrayish;https://github.com/qix-/node-is-arrayish +is-bigint;https://github.com/inspect-js/is-bigint +is-boolean-object;https://github.com/inspect-js/is-boolean-object +is-buffer;https://github.com/feross/is-buffer +is-callable;https://github.com/ljharb/is-callable +is-callable;https://github.com/inspect-js/is-callable +is-core-module;https://github.com/inspect-js/is-core-module +is-date-object;https://github.com/inspect-js/is-date-object +is-decimal;https://github.com/wooorm/is-decimal +is-extglob;https://github.com/jonschlinkert/is-extglob +is-fullwidth-code-point;https://github.com/sindresorhus/is-fullwidth-code-point +is-generator-fn;https://github.com/sindresorhus/is-generator-fn +is-glob;https://github.com/micromatch/is-glob +is-hexadecimal;https://github.com/wooorm/is-hexadecimal +is-negative-zero;https://github.com/inspect-js/is-negative-zero +is-number;https://github.com/jonschlinkert/is-number +is-number-object;https://github.com/inspect-js/is-number-object +is-path-cwd;https://github.com/sindresorhus/is-path-cwd +is-path-in-cwd;https://github.com/sindresorhus/is-path-in-cwd +is-path-inside;https://github.com/sindresorhus/is-path-inside +is-plain-obj;https://github.com/sindresorhus/is-plain-obj +is-plain-object;https://github.com/jonschlinkert/is-plain-object +is-plain-object;https://raw.githubusercontent.com/jonschlinkert/is-plain-object/master/LICENSE +is-potential-custom-element-name;https://github.com/mathiasbynens/is-potential-custom-element-name +is-regex;https://github.com/inspect-js/is-regex +is-shared-array-buffer;https://github.com/inspect-js/is-shared-array-buffer +is-stream;https://github.com/sindresorhus/is-stream +is-string;https://github.com/ljharb/is-string +is-symbol;https://github.com/inspect-js/is-symbol +is-typed-array;https://github.com/inspect-js/is-typed-array +is-typedarray;https://github.com/hughsk/is-typedarray +is-weakref;https://github.com/inspect-js/is-weakref +isarray;https://github.com/juliangruber/isarray +isexe;https://github.com/isaacs/isexe +isobject;https://github.com/jonschlinkert/isobject +istanbul-lib-coverage;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-lib-instrument;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-lib-report;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-lib-source-maps;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-reports;ssh://git@github.com/istanbuljs/istanbuljs +itsdangerous;https://raw.githubusercontent.com/pallets/itsdangerous/master/LICENSE.rst +jest;https://github.com/facebook/jest +jest-canvas-mock;https://github.com/hustcc/jest-canvas-mock +jest-changed-files;https://github.com/facebook/jest +jest-circus;https://github.com/facebook/jest +jest-cli;https://github.com/facebook/jest +jest-config;https://github.com/facebook/jest +jest-diff;https://github.com/facebook/jest +jest-docblock;https://github.com/facebook/jest +jest-each;https://github.com/facebook/jest +jest-environment-jsdom;https://github.com/facebook/jest +jest-environment-node;https://github.com/facebook/jest +jest-get-type;https://github.com/facebook/jest +jest-haste-map;https://github.com/facebook/jest +jest-jasmine2;https://github.com/facebook/jest +jest-leak-detector;https://github.com/facebook/jest +jest-matcher-utils;https://github.com/facebook/jest +jest-message-util;https://github.com/facebook/jest +jest-mock;https://github.com/facebook/jest +jest-pnp-resolver;https://github.com/arcanis/jest-pnp-resolver +jest-regex-util;https://github.com/facebook/jest +jest-resolve;https://github.com/facebook/jest +jest-resolve-dependencies;https://github.com/facebook/jest +jest-runner;https://github.com/facebook/jest +jest-runtime;https://github.com/facebook/jest +jest-serializer;https://github.com/facebook/jest +jest-snapshot;https://github.com/facebook/jest +jest-util;https://github.com/facebook/jest +jest-validate;https://github.com/facebook/jest +jest-watcher;https://github.com/facebook/jest +jest-worker;https://github.com/facebook/jest +jmespath;https://github.com/jmespath/jmespath.py +jquery;https://github.com/jquery/jquery +js-levenshtein;https://github.com/gustf/js-levenshtein +js-sha3;https://github.com/emn178/js-sha3 +js-tokens;https://github.com/lydell/js-tokens +js-yaml;https://github.com/nodeca/js-yaml +jsdom;https://github.com/jsdom/jsdom +jsesc;https://github.com/mathiasbynens/jsesc +jshint;https://github.com/jshint/jshint +json-merge-patch;https://raw.githubusercontent.com/open-contracting/json-merge-patch/master/LICENSE +json-parse-even-better-errors;https://github.com/npm/json-parse-even-better-errors +json-pointer;https://github.com/manuelstofer/json-pointer +json-schema-traverse;https://github.com/epoberezkin/json-schema-traverse +json-stable-stringify-without-jsonify;https://github.com/samn/json-stable-stringify +json-stringify-safe;https://github.com/isaacs/json-stringify-safe +json5;https://github.com/json5/json5 +jsonpath-ng;https://github.com/h2non/jsonpath-ng +jsonschema;https://github.com/python-jsonschema/jsonschema +jsonschema-specifications;https://github.com/python-jsonschema/jsonschema-specifications +jsx-ast-utils;https://github.com/jsx-eslint/jsx-ast-utils +kind-of;https://github.com/jonschlinkert/kind-of +kleur;https://github.com/lukeed/kleur +known-css-properties;https://github.com/known-css/known-css-properties +kombu;https://raw.githubusercontent.com/celery/kombu/master/LICENSE +language-subtag-registry;https://raw.githubusercontent.com/mattcg/language-subtag-registry/master/README.md +language-tags;https://github.com/mattcg/language-tags +lazy-object-proxy;https://raw.githubusercontent.com/ionelmc/python-lazy-object-proxy/master/LICENSE +ldap3;https://github.com/cannatag/ldap3 +leven;https://github.com/sindresorhus/leven +levn;https://github.com/gkz/levn +lilconfig;https://github.com/antonk52/lilconfig +limits;https://github.com/alisaifee/limits +lines-and-columns;https://github.com/eventualbuddha/lines-and-columns +linkify-it-py;https://github.com/tsutsu3/linkify-it-py +loader-runner;https://github.com/webpack/loader-runner +loader-utils;https://github.com/webpack/loader-utils +locate-path;https://github.com/sindresorhus/locate-path +lodash;https://github.com/lodash/lodash +lodash.curry;https://github.com/lodash/lodash +lodash.debounce;https://github.com/lodash/lodash +lodash.difference;https://github.com/lodash/lodash +lodash.flow;https://github.com/lodash/lodash +lodash.isequal;https://github.com/lodash/lodash +lodash.memoize;https://github.com/lodash/lodash +lodash.merge;https://github.com/lodash/lodash +lodash.mergewith;https://github.com/lodash/lodash +lodash.set;https://github.com/lodash/lodash +lodash.truncate;https://github.com/lodash/lodash +lodash.uniq;https://github.com/lodash/lodash +longest-streak;https://github.com/wooorm/longest-streak +looker-sdk;https://raw.githubusercontent.com/looker-open-source/sdk-codegen/main/LICENSE +loose-envify;https://github.com/zertosh/loose-envify +lowlight;https://github.com/wooorm/lowlight +lru-cache;https://github.com/isaacs/node-lru-cache +lunr;https://github.com/olivernn/lunr.js +lxml;https://github.com/lxml/lxml +lz-string;https://raw.githubusercontent.com/pieroxy/lz-string/master/LICENSE.md +make-dir;https://github.com/sindresorhus/make-dir +makeerror;https://github.com/daaku/nodejs-makeerror +map-obj;https://github.com/sindresorhus/map-obj +mark.js;https://github.com/julmot/mark.js +markdown-it-py;https://raw.githubusercontent.com/executablebooks/markdown-it-py/master/LICENSE +markdown-table;https://github.com/wooorm/markdown-table +marked;https://github.com/markedjs/marked +marshmallow;https://raw.githubusercontent.com/marshmallow-code/marshmallow/master/LICENSE +marshmallow-oneofschema;https://raw.githubusercontent.com/marshmallow-code/marshmallow-oneofschema/master/LICENSE +marshmallow-sqlalchemy;https://raw.githubusercontent.com/marshmallow-code/marshmallow-sqlalchemy/master/LICENSE +match-sorter;https://github.com/kentcdodds/match-sorter +mathml-tag-names;https://github.com/wooorm/mathml-tag-names +mdast-util-definitions;https://github.com/syntax-tree/mdast-util-definitions +mdast-util-find-and-replace;https://github.com/syntax-tree/mdast-util-find-and-replace +mdast-util-from-markdown;https://github.com/syntax-tree/mdast-util-from-markdown +mdast-util-gfm;https://github.com/syntax-tree/mdast-util-gfm +mdast-util-gfm-autolink-literal;https://github.com/syntax-tree/mdast-util-gfm-autolink-literal +mdast-util-gfm-footnote;https://github.com/syntax-tree/mdast-util-gfm-footnote +mdast-util-gfm-strikethrough;https://github.com/syntax-tree/mdast-util-gfm-strikethrough +mdast-util-gfm-table;https://github.com/syntax-tree/mdast-util-gfm-table +mdast-util-gfm-task-list-item;https://github.com/syntax-tree/mdast-util-gfm-task-list-item +mdast-util-to-hast;https://github.com/syntax-tree/mdast-util-to-hast +mdast-util-to-markdown;https://github.com/syntax-tree/mdast-util-to-markdown +mdast-util-to-string;https://github.com/syntax-tree/mdast-util-to-string +mdit-py-plugins;https://raw.githubusercontent.com/executablebooks/mdit-py-plugins/master/LICENSE +mdn-data;https://github.com/mdn/data +mdurl;https://raw.githubusercontent.com/executablebooks/mdurl/master/LICENSE +memoize-one;https://github.com/alexreardon/memoize-one +meow;https://github.com/sindresorhus/meow +merge-stream;https://github.com/grncdr/merge-stream +merge2;ssh://git@github.com/teambition/merge2 +micromark;https://github.com/micromark/micromark.git#main +micromark-core-commonmark;https://github.com/micromark/micromark.git#main +micromark-extension-gfm;https://github.com/micromark/micromark-extension-gfm +micromark-extension-gfm-autolink-literal;https://github.com/micromark/micromark-extension-gfm-autolink-literal +micromark-extension-gfm-footnote;https://github.com/micromark/micromark-extension-gfm-footnote +micromark-extension-gfm-strikethrough;https://github.com/micromark/micromark-extension-gfm-strikethrough +micromark-extension-gfm-table;https://github.com/micromark/micromark-extension-gfm-table +micromark-extension-gfm-tagfilter;https://github.com/micromark/micromark-extension-gfm-tagfilter +micromark-extension-gfm-task-list-item;https://github.com/micromark/micromark-extension-gfm-task-list-item +micromark-factory-destination;https://github.com/micromark/micromark.git#main +micromark-factory-label;https://github.com/micromark/micromark.git#main +micromark-factory-space;https://github.com/micromark/micromark.git#main +micromark-factory-title;https://github.com/micromark/micromark.git#main +micromark-factory-whitespace;https://github.com/micromark/micromark.git#main +micromark-util-character;https://github.com/micromark/micromark.git#main +micromark-util-chunked;https://github.com/micromark/micromark.git#main +micromark-util-classify-character;https://github.com/micromark/micromark.git#main +micromark-util-combine-extensions;https://github.com/micromark/micromark.git#main +micromark-util-decode-numeric-character-reference;https://github.com/micromark/micromark.git#main +micromark-util-decode-string;https://github.com/micromark/micromark.git#main +micromark-util-encode;https://github.com/micromark/micromark.git#main +micromark-util-html-tag-name;https://github.com/micromark/micromark.git#main +micromark-util-normalize-identifier;https://github.com/micromark/micromark.git#main +micromark-util-resolve-all;https://github.com/micromark/micromark.git#main +micromark-util-sanitize-uri;https://github.com/micromark/micromark.git#main +micromark-util-subtokenize;https://github.com/micromark/micromark.git#main +micromark-util-symbol;https://github.com/micromark/micromark.git#main +micromark-util-types;https://github.com/micromark/micromark.git#main +micromatch;https://github.com/micromatch/micromatch +microseconds;https://raw.githubusercontent.com/kamicane/microseconds/master/LICENSE +mime;https://github.com/broofa/mime +mime-db;https://github.com/jshttp/mime-db +mime-types;https://github.com/jshttp/mime-types +mimic-fn;https://github.com/sindresorhus/mimic-fn +min-indent;https://github.com/thejameskyle/min-indent +mini-css-extract-plugin;https://github.com/webpack-contrib/mini-css-extract-plugin +minimatch;https://github.com/isaacs/minimatch +minimist;https://github.com/minimistjs/minimist +minimist-options;https://github.com/vadimdemedes/minimist-options +minipass;https://github.com/isaacs/minipass +minipass-collect;https://github.com/isaacs/minipass-collect +minipass-flush;https://github.com/isaacs/minipass-flush +minipass-pipeline;https://registry.npmjs.org/minipass-pipeline/1.2.4 +minizlib;https://github.com/isaacs/minizlib +mkdirp;https://github.com/isaacs/node-mkdirp +mobx-react;https://github.com/mobxjs/mobx +mobx-react-lite;https://github.com/mobxjs/mobx +moment;https://github.com/moment/moment +moment-locales-webpack-plugin;https://github.com/iamakulov/moment-locales-webpack-plugin +moment-timezone;https://raw.githubusercontent.com/moment/moment-timezone/master/LICENSE +moment-timezone;https://github.com/moment/moment-timezone +moo-color;https://github.com/archco/moo-color +more-itertools;https://raw.githubusercontent.com/more-itertools/more-itertools/master/LICENSE +mri;https://github.com/lukeed/mri +ms;https://github.com/zeit/ms +ms;https://github.com/vercel/ms +multidict;https://raw.githubusercontent.com/aio-libs/multidict/master/LICENSE +mysqlclient;https://raw.githubusercontent.com/PyMySQL/mysqlclient/master/LICENSE +nano-time;https://github.com/sazze/node-nanotime +nanoid;https://github.com/ai/nanoid +natural-compare;https://github.com/litejs/natural-compare-lite +needle;https://github.com/tomas/needle +neo-async;ssh://git@github.com/suguru03/neo-async +nock;https://github.com/nock/nock +node-fetch;https://github.com/bitinn/node-fetch +node-fetch-h2;https://github.com/mikeralphson/node-fetch-h2 +node-int64;https://github.com/broofa/node-int64 +node-modules-regexp;https://github.com/jamestalmage/node-modules-regexp +node-readfiles;https://github.com/guatedude2/node-readfiles +node-releases;https://github.com/chicoxyzzy/node-releases +normalize-package-data;https://github.com/npm/normalize-package-data +normalize-path;https://github.com/jonschlinkert/normalize-path +normalize-registry-url;https://github.com/pnpm/normalize-registry-url +normalize-url;https://github.com/sindresorhus/normalize-url +npm-run-path;https://github.com/sindresorhus/npm-run-path +nth-check;https://github.com/fb55/nth-check +numpy;https://github.com/numpy/numpy +nvd3;https://github.com/novus/nvd3 +nwsapi;https://github.com/dperini/nwsapi +oas-kit-common;https://github.com/Mermade/oas-kit +oas-linter;https://github.com/Mermade/oas-kit +oas-resolver;https://github.com/Mermade/oas-kit +oas-schema-walker;https://github.com/Mermade/oas-kit +oas-validator;https://github.com/Mermade/oas-kit +oauthlib;https://raw.githubusercontent.com/oauthlib/oauthlib/master/LICENSE +object-assign;https://github.com/sindresorhus/object-assign +object-inspect;https://github.com/inspect-js/object-inspect +object-keys;https://github.com/ljharb/object-keys +object.assign;https://github.com/ljharb/object.assign +object.entries;https://github.com/es-shims/Object.entries +object.fromentries;https://github.com/es-shims/Object.fromEntries +object.hasown;https://github.com/es-shims/Object.hasOwn +object.values;https://github.com/es-shims/Object.values +oblivious-set;https://github.com/pubkey/oblivious-set +once;https://github.com/isaacs/once +onetime;https://github.com/sindresorhus/onetime +openapi-sampler;https://github.com/APIs-guru/openapi-sampler +openapi-typescript;https://github.com/drwpow/openapi-typescript +opentelemetry-api;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp-proto-common;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp-proto-grpc;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp-proto-http;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-proto;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-sdk;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-semantic-conventions;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +optionator;https://github.com/gkz/optionator +ordered-set;https://github.com/rspeer/ordered-set +p-limit;https://github.com/sindresorhus/p-limit +p-locate;https://github.com/sindresorhus/p-locate +p-map;https://github.com/sindresorhus/p-map +p-try;https://github.com/sindresorhus/p-try +packaging;https://raw.githubusercontent.com/pypa/packaging/master/LICENSE.APACHE +pandas;https://raw.githubusercontent.com/pandas-dev/pandas/master/LICENSE +pandas-gbq;https://github.com/googleapis/python-bigquery-pandas +paramiko;https://raw.githubusercontent.com/paramiko/paramiko/master/LICENSE +parent-module;https://github.com/sindresorhus/parent-module +parse-entities;https://github.com/wooorm/parse-entities +parse-json;https://github.com/sindresorhus/parse-json +parse5;https://github.com/inikulin/parse5 +path-browserify;https://github.com/browserify/path-browserify +path-exists;https://github.com/sindresorhus/path-exists +path-is-absolute;https://github.com/sindresorhus/path-is-absolute +path-is-inside;https://raw.githubusercontent.com/domenic/path-is-inside/master/LICENSE.txt +path-key;https://github.com/sindresorhus/path-key +path-parse;https://github.com/jbgutierrez/path-parse +path-type;https://github.com/sindresorhus/path-type +pathspec;https://raw.githubusercontent.com/cpburnz/python-pathspec/master/LICENSE +pendulum;https://raw.githubusercontent.com/sdispater/pendulum/master/LICENSE +perfect-scrollbar;https://github.com/mdbootstrap/perfect-scrollbar +picocolors;https://github.com/alexeyraspopov/picocolors +picomatch;https://github.com/micromatch/picomatch +pify;https://github.com/sindresorhus/pify +pinkie;floatdrop/pinkie +pinkie-promise;https://github.com/floatdrop/pinkie-promise +pip;https://github.com/pypa/pip +pirates;https://github.com/ariporad/pirates +pirates;https://github.com/danez/pirates +pkg-dir;https://github.com/sindresorhus/pkg-dir +platformdirs;https://raw.githubusercontent.com/platformdirs/platformdirs/master/LICENSE +pluggy;https://raw.githubusercontent.com/pytest-dev/pluggy/master/LICENSE +pluralize;https://github.com/blakeembrey/pluralize +ply;https://www.dabeaz.com/ply/index.html +polished;https://github.com/styled-components/polished +popmotion;https://github.com/Popmotion/popmotion.git#master +postcss;https://github.com/postcss/postcss +postcss-calc;https://raw.githubusercontent.com/postcss/postcss-calc/master/LICENSE +postcss-colormin;cssnano/cssnano +postcss-convert-values;https://github.com/cssnano/cssnano +postcss-discard-comments;https://github.com/cssnano/cssnano +postcss-discard-duplicates;cssnano/cssnano +postcss-discard-empty;cssnano/cssnano +postcss-discard-overridden;cssnano/cssnano +postcss-merge-longhand;https://github.com/cssnano/cssnano +postcss-merge-rules;https://github.com/cssnano/cssnano +postcss-minify-font-values;cssnano/cssnano +postcss-minify-gradients;cssnano/cssnano +postcss-minify-params;https://github.com/cssnano/cssnano +postcss-minify-selectors;https://github.com/cssnano/cssnano +postcss-modules-extract-imports;https://github.com/css-modules/postcss-modules-extract-imports +postcss-modules-local-by-default;https://github.com/css-modules/postcss-modules-local-by-default +postcss-modules-scope;https://github.com/css-modules/postcss-modules-scope +postcss-modules-values;https://github.com/css-modules/postcss-modules-values +postcss-normalize-charset;cssnano/cssnano +postcss-normalize-display-values;cssnano/cssnano +postcss-normalize-positions;cssnano/cssnano +postcss-normalize-repeat-style;cssnano/cssnano +postcss-normalize-string;cssnano/cssnano +postcss-normalize-timing-functions;cssnano/cssnano +postcss-normalize-unicode;cssnano/cssnano +postcss-normalize-url;cssnano/cssnano +postcss-normalize-whitespace;cssnano/cssnano +postcss-ordered-values;https://github.com/cssnano/cssnano +postcss-reduce-initial;cssnano/cssnano +postcss-reduce-transforms;cssnano/cssnano +postcss-resolve-nested-selector;https://registry.npmjs.org/postcss-resolve-nested-selector/0.1.1 +postcss-safe-parser;https://github.com/postcss/postcss-safe-parser +postcss-selector-parser;https://github.com/postcss/postcss-selector-parser +postcss-svgo;cssnano/cssnano +postcss-unique-selectors;cssnano/cssnano +postcss-value-parser;https://github.com/TrySound/postcss-value-parser +prelude-ls;https://github.com/gkz/prelude-ls +prettier;https://github.com/prettier/prettier +pretty-format;https://github.com/facebook/jest +prismjs;https://github.com/PrismJS/prism +prison;https://raw.githubusercontent.com/betodealmeida/python-rison/master/LICENSE +prometheus_client;https://raw.githubusercontent.com/prometheus/client_python/master/LICENSE +promise;https://github.com/then/promise +promise-inflight;https://github.com/iarna/promise-inflight +prompt-toolkit;https://raw.githubusercontent.com/prompt-toolkit/python-prompt-toolkit/master/LICENSE +prompts;https://github.com/terkelg/prompts +prop-types;https://raw.githubusercontent.com/facebook/prop-types/master/LICENSE +prop-types;https://github.com/facebook/prop-types +propagate;https://github.com/nock/propagate +property-information;https://github.com/wooorm/property-information +proto-plus;https://raw.githubusercontent.com/googleapis/proto-plus-python/master/LICENSE +protobuf;https://raw.githubusercontent.com/protocolbuffers/protobuf/main/LICENSE +proxy-from-env;https://github.com/Rob--W/proxy-from-env +psl;ssh://git@github.com/lupomontero/psl +psutil;https://raw.githubusercontent.com/giampaolo/psutil/master/LICENSE +psycopg2-binary;https://raw.githubusercontent.com/psycopg/psycopg2/master/LICENSE +punycode;https://github.com/bestiejs/punycode.js +pure-color;ssh://git@github.com/WickyNilliams/pure-color +pyOpenSSL;https://raw.githubusercontent.com/pyca/pyopenssl/master/LICENSE +pyarrow;https://github.com/apache/arrow +pyasn1;https://github.com/pyasn1/pyasn1 +pyasn1-modules;https://raw.githubusercontent.com/pyasn1/pyasn1-modules/main/LICENSE.txt +pycparser;https://raw.githubusercontent.com/eliben/pycparser/master/LICENSE +pydata-google-auth;https://raw.githubusercontent.com/pydata/pydata-google-auth/main/LICENSE.txt +pyodbc;https://github.com/mkleehammer/pyodbc +pyparsing;https://raw.githubusercontent.com/pyparsing/pyparsing/master/LICENSE +python-daemon;https://pagure.io/python-daemon/issues +python-dateutil;https://raw.githubusercontent.com/dateutil/dateutil/master/LICENSE +python-dotenv;https://raw.githubusercontent.com/theskumar/python-dotenv/master/LICENSE +python-http-client;https://raw.githubusercontent.com/sendgrid/python-http-client/master/LICENSE +python-ldap;https://raw.githubusercontent.com/python-ldap/python-ldap/main/LICENCE +python-nvd3;https://raw.githubusercontent.com/areski/python-nvd3/develop/LICENSE +python-slugify;https://github.com/un33k/python-slugify +pytz;https://raw.githubusercontent.com/stub42/pytz/master/LICENSE.txt +querystringify;https://github.com/unshiftio/querystringify +queue-microtask;https://github.com/feross/queue-microtask +quick-lru;https://github.com/sindresorhus/quick-lru +randombytes;ssh://git@github.com/crypto-browserify/randombytes +react;https://github.com/facebook/react +react-base16-styling;https://github.com/alexkuz/react-base16-styling +react-clientside-effect;https://github.com/thekashey/react-clientside-effect +react-dom;https://github.com/facebook/react +react-fast-compare;https://github.com/FormidableLabs/react-fast-compare +react-focus-lock;https://github.com/theKashey/react-focus-lock +react-icons;ssh://git@github.com/react-icons/react-icons +react-is;https://github.com/facebook/react +react-json-view;https://github.com/mac-s-g/react-json-view +react-lifecycles-compat;https://github.com/reactjs/react-lifecycles-compat +react-markdown;https://github.com/remarkjs/react-markdown +react-query;https://github.com/tannerlinsley/react-query +react-remove-scroll;https://github.com/theKashey/react-remove-scroll +react-remove-scroll-bar;https://github.com/theKashey/react-remove-scroll-bar +react-router;https://github.com/remix-run/react-router +react-router-dom;https://github.com/remix-run/react-router +react-select;https://raw.githubusercontent.com/JedWatson/react-select/master/LICENSE +react-style-singleton;https://github.com/theKashey/react-style-singleton#readme +react-syntax-highlighter;https://github.com/react-syntax-highlighter/react-syntax-highlighter +react-table;https://raw.githubusercontent.com/tannerlinsley/react-table/master/LICENSE +react-tabs;https://github.com/reactjs/react-tabs +react-textarea-autosize;https://github.com/Andarist/react-textarea-autosize +react-transition-group;https://github.com/reactjs/react-transition-group +reactflow;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +read-pkg;https://github.com/sindresorhus/read-pkg +read-pkg-up;https://github.com/sindresorhus/read-pkg-up +readable-stream;https://github.com/isaacs/readable-stream +rechoir;https://github.com/gulpjs/rechoir +redent;https://github.com/sindresorhus/redent +redis;https://raw.githubusercontent.com/redis/redis-py/master/LICENSE +redoc;https://github.com/Redocly/redoc +redshift-connector;https://raw.githubusercontent.com/aws/amazon-redshift-python-driver/master/LICENSE +referencing;https://github.com/python-jsonschema/referencing +refractor;https://github.com/wooorm/refractor +reftools;https://github.com/Mermade/oas-kit +regenerate;https://github.com/mathiasbynens/regenerate +regenerate-unicode-properties;https://github.com/mathiasbynens/regenerate-unicode-properties +regenerator-runtime;https://github.com/facebook/regenerator.git#main +regenerator-runtime;https://raw.githubusercontent.com/facebook/regenerator/master/LICENSE +regenerator-transform;https://raw.githubusercontent.com/facebook/regenerator/master/LICENSE +regexp.prototype.flags;https://github.com/es-shims/RegExp.prototype.flags +regexpp;https://github.com/mysticatea/regexpp +regexpu-core;https://github.com/mathiasbynens/regexpu-core +regjsgen;https://github.com/bnjmnt4n/regjsgen +regjsparser;ssh://git@github.com/jviereck/regjsparser +remark-gfm;https://github.com/remarkjs/remark-gfm +remark-parse;https://github.com/remarkjs/remark.git#main +remark-rehype;https://github.com/remarkjs/remark-rehype +remove-accents;https://github.com/tyxla/remove-accents +requests;https://raw.githubusercontent.com/psf/requests/master/LICENSE +requests-oauthlib;https://raw.githubusercontent.com/requests/requests-oauthlib/master/LICENSE +requests-toolbelt;https://raw.githubusercontent.com/requests/toolbelt/master/LICENSE +require-directory;https://github.com/troygoode/node-require-directory +require-from-string;https://github.com/floatdrop/require-from-string +requires-port;https://github.com/unshiftio/requires-port +resolve;https://github.com/browserify/resolve +resolve-cwd;https://github.com/sindresorhus/resolve-cwd +resolve-from;https://github.com/sindresorhus/resolve-from +resolve.exports;https://github.com/lukeed/resolve.exports +reusify;https://github.com/mcollina/reusify +rfc3339-validator;https://github.com/naimetti/rfc3339-validator +rfc3986;https://raw.githubusercontent.com/python-hyper/rfc3986/main/LICENSE +rich;https://raw.githubusercontent.com/Textualize/rich/master/LICENSE +rich-argparse;https://raw.githubusercontent.com/hamdanal/rich-argparse/master/LICENSE +rimraf;https://github.com/isaacs/rimraf +rpds-py;https://raw.githubusercontent.com/crate-py/rpds/master/LICENSE +rsa;https://raw.githubusercontent.com/sybrenstuvel/python-rsa/master/LICENSE +run-parallel;https://github.com/feross/run-parallel +rw;ssh://git@github.com/mbostock/rw +s3transfer;https://github.com/boto/s3transfer +sade;https://github.com/lukeed/sade +safe-buffer;https://github.com/feross/safe-buffer +safe-regex-test;https://github.com/ljharb/safe-regex-test +safer-buffer;https://github.com/ChALkeR/safer-buffer +sax;https://github.com/isaacs/sax-js +saxes;https://github.com/lddubeau/saxes +scheduler;https://github.com/facebook/react +schema-utils;https://github.com/webpack/schema-utils +scramp;https://raw.githubusercontent.com/tlocke/scramp/master/LICENSE +semver;https://github.com/npm/node-semver +sendgrid;https://raw.githubusercontent.com/sendgrid/sendgrid-python/master/LICENSE +serialize-javascript;https://github.com/yahoo/serialize-javascript +setimmediate;https://github.com/yuzujs/setImmediate +setproctitle;https://github.com/dvarrazzo/py-setproctitle +setuptools;https://raw.githubusercontent.com/pypa/setuptools/master/LICENSE +shallow-clone;https://github.com/jonschlinkert/shallow-clone +shapely;https://github.com/shapely/shapely +shebang-command;https://github.com/kevva/shebang-command +shebang-regex;https://github.com/sindresorhus/shebang-regex +should;https://github.com/shouldjs/should.js +should-equal;https://github.com/shouldjs/equal +should-format;https://github.com/shouldjs/format +should-type;https://github.com/shouldjs/type +should-type-adaptors;https://github.com/shouldjs/type-adaptors +should-util;https://github.com/shouldjs/util +side-channel;https://github.com/ljharb/side-channel +signal-exit;https://github.com/tapjs/signal-exit +simple-swizzle;https://github.com/qix-/node-simple-swizzle +sisteransi;https://github.com/terkelg/sisteransi +six;https://raw.githubusercontent.com/benjaminp/six/master/LICENSE +slack_sdk;https://raw.githubusercontent.com/slackapi/python-slack-sdk/master/LICENSE +slash;https://github.com/sindresorhus/slash +slice-ansi;https://github.com/chalk/slice-ansi +slugify;https://github.com/simov/slugify +sniffio;https://raw.githubusercontent.com/python-trio/sniffio/master/LICENSE.APACHE2 +soupsieve;https://raw.githubusercontent.com/facelessuser/soupsieve/master/LICENSE.md +source-list-map;https://github.com/webpack/source-list-map +source-map;ssh://git@github.com/mozilla/source-map +source-map-js;https://github.com/7rulnik/source-map-js +source-map-resolve;https://github.com/lydell/source-map-resolve +source-map-support;https://github.com/evanw/node-source-map-support +space-separated-tokens;https://github.com/wooorm/space-separated-tokens +spdx-correct;https://github.com/jslicense/spdx-correct.js +spdx-exceptions;https://github.com/kemitchell/spdx-exceptions.json +spdx-expression-parse;https://github.com/jslicense/spdx-expression-parse.js +spdx-expression-validate;https://raw.githubusercontent.com/jslicense/spdx-expression-validate.js/master/LICENSE +spdx-license-ids;https://github.com/jslicense/spdx-license-ids +sprintf-js;https://github.com/alexei/sprintf.js +sqlalchemy-bigquery;https://raw.githubusercontent.com/googleapis/python-bigquery-sqlalchemy/master/LICENSE +sqlalchemy-redshift;https://raw.githubusercontent.com/sqlalchemy-redshift/sqlalchemy-redshift/master/LICENSE +sqlalchemy-spanner;https://raw.githubusercontent.com/cloudspannerecosystem/python-spanner-sqlalchemy/master/LICENSE +sqlparse;https://raw.githubusercontent.com/andialbrecht/sqlparse/master/LICENSE +sshtunnel;https://raw.githubusercontent.com/pahaz/sshtunnel/master/LICENSE +ssri;https://github.com/npm/ssri +stable;https://github.com/Two-Screen/stable +stack-utils;https://github.com/tapjs/stack-utils +starkbank-ecdsa;https://raw.githubusercontent.com/starkbank/ecdsa-python/master/LICENSE +statsd;https://raw.githubusercontent.com/jsocol/pystatsd/master/LICENSE +stickyfill;https://raw.githubusercontent.com/webmodules/stickyfill/master/LICENSE +string-length;https://github.com/sindresorhus/string-length +string-width;https://github.com/sindresorhus/string-width +string.prototype.matchall;https://github.com/es-shims/String.prototype.matchAll +string.prototype.trim;https://github.com/es-shims/String.prototype.trim +string.prototype.trimend;https://github.com/es-shims/String.prototype.trimEnd +string.prototype.trimstart;https://github.com/es-shims/String.prototype.trimStart +string_decoder;https://github.com/rvagg/string_decoder +strip-ansi;https://github.com/chalk/strip-ansi +strip-bom;https://github.com/sindresorhus/strip-bom +strip-comments;https://github.com/jonschlinkert/strip-comments +strip-final-newline;https://github.com/sindresorhus/strip-final-newline +strip-indent;https://github.com/sindresorhus/strip-indent +strip-json-comments;https://github.com/sindresorhus/strip-json-comments +style-loader;https://github.com/webpack-contrib/style-loader +style-search;https://github.com/davidtheclark/style-search +style-to-object;https://github.com/remarkablemark/style-to-object +style-value-types;https://github.com/Popmotion/popmotion.git#master +stylehacks;cssnano/cssnano +stylelint;https://github.com/stylelint/stylelint +stylelint-config-prettier;https://github.com/prettier/stylelint-config-prettier +stylelint-config-recommended;https://github.com/stylelint/stylelint-config-recommended +stylelint-config-standard;https://github.com/stylelint/stylelint-config-standard +stylis;https://github.com/thysultan/stylis.js +supports-color;https://github.com/chalk/supports-color +supports-hyperlinks;https://github.com/jamestalmage/supports-hyperlinks +supports-preserve-symlinks-flag;https://github.com/inspect-js/node-supports-preserve-symlinks-flag +svg-tags;https://raw.githubusercontent.com/element-io/svg-tags/master/LICENSE +svgo;https://github.com/svg/svgo +swagger-ui-dist;ssh://git@github.com/swagger-api/swagger-ui +swagger2openapi;https://github.com/Mermade/oas-kit +symbol-tree;https://github.com/jsdom/js-symbol-tree +table;https://github.com/gajus/table +tabulate;https://raw.githubusercontent.com/astanin/python-tabulate/master/LICENSE +tapable;ssh://git@github.com/webpack/tapable +tar;https://github.com/npm/node-tar +tenacity;https://raw.githubusercontent.com/jd/tenacity/master/LICENSE +termcolor;https://github.com/termcolor/termcolor +terminal-link;https://github.com/sindresorhus/terminal-link +terser;https://github.com/terser/terser +terser-webpack-plugin;https://github.com/webpack-contrib/terser-webpack-plugin +test-exclude;https://github.com/istanbuljs/test-exclude +text-table;https://github.com/substack/text-table +text-unidecode;https://raw.githubusercontent.com/kmike/text-unidecode/master/LICENSE +throat;https://github.com/ForbesLindesay/throat +time-machine;https://raw.githubusercontent.com/adamchainz/time-machine/master/LICENSE +tiny-glob;https://github.com/terkelg/tiny-glob +tiny-invariant;https://github.com/alexreardon/tiny-invariant +tmpl;https://github.com/daaku/nodejs-tmpl +to-fast-properties;https://github.com/sindresorhus/to-fast-properties +to-regex-range;https://github.com/micromatch/to-regex-range +toggle-selection;https://github.com/sudodoki/toggle-selection +tornado;https://raw.githubusercontent.com/tornadoweb/tornado/master/LICENSE +tough-cookie;https://github.com/salesforce/tough-cookie +tr46;https://github.com/Sebmaster/tr46.js +tr46;https://github.com/jsdom/tr46 +trim-lines;https://github.com/wooorm/trim-lines +trim-newlines;https://github.com/sindresorhus/trim-newlines +trough;https://github.com/wooorm/trough +tsconfig-paths;https://raw.githubusercontent.com/dividab/tsconfig-paths/master/LICENSE +tslib;https://github.com/Microsoft/tslib +tsutils;https://github.com/ajafff/tsutils +type-check;https://github.com/gkz/type-check +type-detect;ssh://git@github.com/chaijs/type-detect +type-fest;https://raw.githubusercontent.com/sindresorhus/type-fest/main/license-mit +typed-array-length;https://github.com/inspect-js/typed-array-length +typedarray-to-buffer;https://github.com/feross/typedarray-to-buffer +typescript;https://github.com/Microsoft/TypeScript +typing_extensions;https://raw.githubusercontent.com/python/typing_extensions/master/LICENSE +tzdata;https://raw.githubusercontent.com/python/tzdata/master/LICENSE +ua-parser-js;https://github.com/faisalman/ua-parser-js +uc-micro-py;https://github.com/tsutsu3/uc.micro-py +unbox-primitive;https://github.com/ljharb/unbox-primitive +undici;https://github.com/nodejs/undici +unicode-canonical-property-names-ecmascript;https://github.com/mathiasbynens/unicode-canonical-property-names-ecmascript +unicode-match-property-ecmascript;https://github.com/mathiasbynens/unicode-match-property-ecmascript +unicode-match-property-value-ecmascript;https://github.com/mathiasbynens/unicode-match-property-value-ecmascript +unicode-property-aliases-ecmascript;https://github.com/mathiasbynens/unicode-property-aliases-ecmascript +unicodecsv;https://raw.githubusercontent.com/jdunck/python-unicodecsv/master/LICENSE +unified;https://github.com/unifiedjs/unified +unique-filename;https://github.com/iarna/unique-filename +unique-slug;https://github.com/iarna/unique-slug +unist-builder;https://github.com/syntax-tree/unist-builder +unist-util-generated;https://github.com/syntax-tree/unist-util-generated +unist-util-is;https://github.com/syntax-tree/unist-util-is +unist-util-position;https://github.com/syntax-tree/unist-util-position +unist-util-stringify-position;https://github.com/syntax-tree/unist-util-stringify-position +unist-util-visit;https://github.com/syntax-tree/unist-util-visit +unist-util-visit-parents;https://github.com/syntax-tree/unist-util-visit-parents +universal-pathlib;https://raw.githubusercontent.com/fsspec/universal_pathlib/master/LICENSE +universalify;https://github.com/RyanZim/universalify +unload;https://github.com/pubkey/unload +uri-js;ssh://git@github.com/garycourt/uri-js +uritemplate;https://raw.githubusercontent.com/python-hyper/uritemplate/main/LICENSE.APACHE +url-loader;https://github.com/webpack-contrib/url-loader +url-parse;https://github.com/unshiftio/url-parse +url-search-params-polyfill;https://github.com/jerrybendy/url-search-params-polyfill +url-template;https://raw.githubusercontent.com/bramstein/url-template/main/LICENSE +urllib3;https://github.com/urllib3/urllib3 +use-callback-ref;https://github.com/theKashey/use-callback-ref +use-composed-ref;https://github.com/Andarist/use-composed-ref +use-isomorphic-layout-effect;https://github.com/Andarist/use-isomorphic-layout-effect +use-latest;https://github.com/Andarist/use-latest +use-sidecar;https://github.com/theKashey/use-sidecar +use-sync-external-store;https://github.com/facebook/react +util-deprecate;https://github.com/TooTallNate/util-deprecate +uvu;https://github.com/lukeed/uvu +v8-compile-cache;https://github.com/zertosh/v8-compile-cache +v8-to-istanbul;https://github.com/istanbuljs/v8-to-istanbul +validate-npm-package-license;https://github.com/kemitchell/validate-npm-package-license.js +validator;https://github.com/validatorjs/validator.js +vfile;https://github.com/vfile/vfile +vfile-message;https://github.com/vfile/vfile-message +vine;https://raw.githubusercontent.com/celery/vine/master/LICENSE +virtualenv;https://raw.githubusercontent.com/pypa/virtualenv/master/LICENSE +w3c-hr-time;https://github.com/jsdom/w3c-hr-time +w3c-xmlserializer;https://github.com/jsdom/w3c-xmlserializer +walker;https://github.com/daaku/nodejs-walker +watchpack;https://github.com/webpack/watchpack +watchtower;https://raw.githubusercontent.com/kislyuk/watchtower/master/LICENSE +wcwidth;https://raw.githubusercontent.com/jquast/wcwidth/master/LICENSE +web-worker;https://github.com/developit/web-worker +webidl-conversions;https://github.com/jsdom/webidl-conversions +webpack;https://github.com/webpack/webpack +webpack-cli;https://github.com/webpack/webpack-cli +webpack-license-plugin;https://github.com/codepunkt/webpack-license-plugin +webpack-manifest-plugin;https://github.com/shellscape/webpack-manifest-plugin +webpack-merge;https://github.com/survivejs/webpack-merge +webpack-sources;https://github.com/webpack/webpack-sources +whatwg-encoding;https://github.com/jsdom/whatwg-encoding +whatwg-mimetype;https://github.com/jsdom/whatwg-mimetype +whatwg-url;https://github.com/jsdom/whatwg-url +wheel;https://github.com/pypa/wheel +which;https://github.com/isaacs/node-which +which-boxed-primitive;https://github.com/inspect-js/which-boxed-primitive +which-typed-array;https://github.com/inspect-js/which-typed-array +wildcard;https://github.com/DamonOehlman/wildcard +word-wrap;https://github.com/jonschlinkert/word-wrap +wrap-ansi;https://github.com/chalk/wrap-ansi +wrappy;https://github.com/npm/wrappy +wrapt;https://raw.githubusercontent.com/GrahamDumpleton/wrapt/master/LICENSE +write-file-atomic;https://github.com/npm/write-file-atomic +ws;https://github.com/websockets/ws +wsgiref;https://raw.githubusercontent.com/Xowap/wsgiref/b24196886e77a71f17afef164f3644bce06c5382/setup.py +xml-name-validator;https://github.com/jsdom/xml-name-validator +xmlchars;https://github.com/lddubeau/xmlchars +xtend;https://github.com/Raynos/xtend +y18n;https://github.com/yargs/y18n +yallist;https://github.com/isaacs/yallist +yaml;https://github.com/eemeli/yaml +yaml-ast-parser;https://github.com/mulesoft-labs/yaml-ast-parser +yargs;https://github.com/yargs/yargs +yargs-parser;https://github.com/yargs/yargs-parser +yarl;https://raw.githubusercontent.com/aio-libs/yarl/master/LICENSE +yocto-queue;https://github.com/sindresorhus/yocto-queue +zipp;https://raw.githubusercontent.com/jaraco/zipp/master/LICENSE +zope.event;https://github.com/zopefoundation/zope.event +zope.interface;https://github.com/zopefoundation/zope.interface +zrender;https://github.com/ecomfe/zrender +zustand;https://github.com/pmndrs/zustand +zwitch;https://github.com/wooorm/zwitch diff --git a/docker/airflow/2/debian12/2.10/scripts/docker/install_airflow.sh b/docker/airflow/2/debian12/2.10/scripts/docker/install_airflow.sh new file mode 100755 index 0000000000..8a5a909060 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/scripts/docker/install_airflow.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +: "${AIRFLOW_PIP_VERSION:?Should be set}" + +function install_airflow() { + # Remove mysql from extras if client is not going to be installed + if [[ ${INSTALL_MYSQL_CLIENT} != "true" ]]; then + AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/mysql,} + fi + echo + echo "Installing all packages and upgrade if needed" + echo + + # https://airflow.apache.org/docs/apache-airflow/stable/installation/installing-from-pypi.html + # https://github.com/apache/airflow/issues/36883 + set -x + PY_MAJOR_VERSION="$(python3 -V | grep -o -P "\d+\.\d+")" + CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}-fix/constraints-${PY_MAJOR_VERSION}.txt" + + pip install \ + --constraint "${CONSTRAINT_URL}" \ + --upgrade \ + --upgrade-strategy only-if-needed "${AIRFLOW_INSTALLATION_METHOD}[${AIRFLOW_EXTRAS}]==${AIRFLOW_VERSION}" airflow-exporter + pip install apache-airflow-providers-cncf-kubernetes +} + +install_airflow diff --git a/docker/airflow/2/debian12/2.10/scripts/docker/install_mssql.sh b/docker/airflow/2/debian12/2.10/scripts/docker/install_mssql.sh new file mode 100755 index 0000000000..0f378c22e8 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/scripts/docker/install_mssql.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -euo pipefail + +: "${INSTALL_MSSQL_CLIENT:?Should be true or false}" + +function install_mssql_client() { + echo + echo "Installing mssql client" + echo + curl --silent https://packages.microsoft.com/keys/microsoft.asc | apt-key add - >/dev/null 2>&1 + curl --silent https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list + apt-get update -yqq + apt-get upgrade -yqq + ACCEPT_EULA=Y apt-get -yqq install -y --no-install-recommends msodbcsql17 mssql-tools + rm -rf /var/lib/apt/lists/* + apt-get autoremove -yqq --purge + apt-get clean && rm -rf /var/lib/apt/lists/* +} + +# Install MsSQL client from Microsoft repositories +if [[ ${INSTALL_MSSQL_CLIENT:="true"} == "true" ]]; then + install_mssql_client "${@}" +fi diff --git a/docker/airflow/2/debian12/2.10/scripts/docker/install_mysql.sh b/docker/airflow/2/debian12/2.10/scripts/docker/install_mysql.sh new file mode 100755 index 0000000000..9581a6e63a --- /dev/null +++ b/docker/airflow/2/debian12/2.10/scripts/docker/install_mysql.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +set -euo pipefail +declare -a packages + +MYSQL_VERSION="8.0" +readonly MYSQL_VERSION + +: "${INSTALL_MYSQL_CLIENT:?Should be true or false}" + +install_mysql_client() { + echo + echo "Installing mysql client version ${MYSQL_VERSION}" + echo + + if [[ "${1}" == "dev" ]]; then + packages=("libmysqlclient-dev" "mysql-client") + elif [[ "${1}" == "prod" ]]; then + packages=("libmysqlclient21" "mysql-client") + else + echo + echo "Specify either prod or dev" + echo + exit 1 + fi + + local key="B7B3B788A8D3785C" + readonly key + + GNUPGHOME="$(mktemp -d)" + export GNUPGHOME + set +e + for keyserver in $(shuf -e ha.pool.sks-keyservers.net hkp://p80.pool.sks-keyservers.net:80 \ + keyserver.ubuntu.com hkp://keyserver.ubuntu.com:80) + do + gpg --keyserver "${keyserver}" --recv-keys "${key}" 2>&1 && break + done + set -e + gpg --export "${key}" > /etc/apt/trusted.gpg.d/mysql.gpg + gpgconf --kill all + rm -rf "${GNUPGHOME}" + unset GNUPGHOME + echo "deb http://repo.mysql.com/apt/debian/ bookworm mysql-${MYSQL_VERSION}" | tee -a /etc/apt/sources.list.d/mysql.list + apt-get update + apt-get install --no-install-recommends -y "${packages[@]}" + apt-get autoremove -yqq --purge + apt-get clean && rm -rf /var/lib/apt/lists/* +} + +# Install MySQL client from Oracle repositories (Debian installs mariadb) +# But only if it is not disabled +if [[ ${INSTALL_MYSQL_CLIENT:="true"} == "true" ]]; then + install_mysql_client "${@}" +fi diff --git a/docker/airflow/2/debian12/2.10/scripts/docker/install_pip_version.sh b/docker/airflow/2/debian12/2.10/scripts/docker/install_pip_version.sh new file mode 100755 index 0000000000..a254e7f8d6 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/scripts/docker/install_pip_version.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +: "${AIRFLOW_PIP_VERSION:?Should be set}" + +function install_pip_version() { + echo + echo "Installing pip version ${AIRFLOW_PIP_VERSION}" + echo + pip install --disable-pip-version-check --no-cache-dir --upgrade "pip==${AIRFLOW_PIP_VERSION}" + # Usunięto linię tworzącą folder .local/bin, ponieważ może to być zbędne w środowisku wirtualnym +} + +install_pip_version \ No newline at end of file diff --git a/docker/airflow/2/debian12/2.10/scripts/prod/clean-logs.sh b/docker/airflow/2/debian12/2.10/scripts/prod/clean-logs.sh new file mode 100755 index 0000000000..57b6e8b605 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/scripts/prod/clean-logs.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -euo pipefail + +readonly DIRECTORY="${AIRFLOW_HOME:-/usr/local/airflow}" +readonly RETENTION="${AIRFLOW__LOG_RETENTION_DAYS:-15}" + +trap "exit" INT TERM + +readonly EVERY=$((15*60)) + +echo "Cleaning logs every $EVERY seconds" + +while true; do + echo "Trimming airflow logs to ${RETENTION} days." + find "${DIRECTORY}"/logs \ + -type d -name 'lost+found' -prune -o \ + -type f -mtime +"${RETENTION}" -name '*.log' -print0 | \ + xargs -0 rm -f + + seconds=$(( $(date -u +%s) % EVERY)) + (( seconds < 1 )) || sleep $((EVERY - seconds)) +done diff --git a/docker/airflow/2/debian12/2.10/scripts/prod/entrypoint_prod.sh b/docker/airflow/2/debian12/2.10/scripts/prod/entrypoint_prod.sh new file mode 100755 index 0000000000..c4a32075b6 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/scripts/prod/entrypoint_prod.sh @@ -0,0 +1,326 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# Might be empty +AIRFLOW_COMMAND="${1:-}" + +set -euo pipefail + +function run_check_with_retries { + local cmd + cmd="${1}" + local countdown + countdown="${CONNECTION_CHECK_MAX_COUNT}" + + while true + do + set +e + local last_check_result + local res + last_check_result=$(eval "${cmd} 2>&1") + res=$? + set -e + if [[ ${res} == 0 ]]; then + echo + break + else + echo -n "." + countdown=$((countdown-1)) + fi + if [[ ${countdown} == 0 ]]; then + echo + echo "ERROR! Maximum number of retries (${CONNECTION_CHECK_MAX_COUNT}) reached." + echo + echo "Last check result:" + echo "$ ${cmd}" + echo "${last_check_result}" + echo + exit 1 + else + sleep "${CONNECTION_CHECK_SLEEP_TIME}" + fi + done +} + +function run_nc() { + # Checks if it is possible to connect to the host using netcat. + # + # We want to avoid misleading messages and perform only forward lookup of the service IP address. + # Netcat when run without -n performs both forward and reverse lookup and fails if the reverse + # lookup name does not match the original name even if the host is reachable via IP. This happens + # randomly with docker-compose in GitHub Actions. + # Since we are not using reverse lookup elsewhere, we can perform forward lookup in python + # And use the IP in NC and add '-n' switch to disable any DNS use. + # Even if this message might be harmless, it might hide the real reason for the problem + # Which is the long time needed to start some services, seeing this message might be totally misleading + # when you try to analyse the problem, that's why it's best to avoid it, + local host="${1}" + local port="${2}" + local ip + ip=$(python -c "import socket; print(socket.gethostbyname('${host}'))") + nc -zvvn "${ip}" "${port}" +} + + +function wait_for_connection { + # Waits for Connection to the backend specified via URL passed as first parameter + # Detects backend type depending on the URL schema and assigns + # default port numbers if not specified in the URL. + # Then it loops until connection to the host/port specified can be established + # It tries `CONNECTION_CHECK_MAX_COUNT` times and sleeps `CONNECTION_CHECK_SLEEP_TIME` between checks + local connection_url + connection_url="${1}" + local detected_backend + detected_backend=$(python -c "from urllib.parse import urlsplit; import sys; print(urlsplit(sys.argv[1]).scheme)" "${connection_url}") + local detected_host + detected_host=$(python -c "from urllib.parse import urlsplit; import sys; print(urlsplit(sys.argv[1]).hostname)" "${connection_url}") + local detected_port + detected_port=$(python -c "from urllib.parse import urlsplit; import sys; print(urlsplit(sys.argv[1]).port or '')" "${connection_url}") + + echo BACKEND="${BACKEND:=${detected_backend}}" + readonly BACKEND + + if [[ -z "${detected_port=}" ]]; then + if [[ ${BACKEND} == "postgres"* ]]; then + detected_port=5432 + elif [[ ${BACKEND} == "mysql"* ]]; then + detected_port=3306 + elif [[ ${BACKEND} == "mssql"* ]]; then + detected_port=1433 + elif [[ ${BACKEND} == "redis"* ]]; then + detected_port=6379 + elif [[ ${BACKEND} == "amqp"* ]]; then + detected_port=5672 + fi + fi + + detected_host=${detected_host:="localhost"} + + # Allow the DB parameters to be overridden by environment variable + echo DB_HOST="${DB_HOST:=${detected_host}}" + readonly DB_HOST + + echo DB_PORT="${DB_PORT:=${detected_port}}" + readonly DB_PORT + run_check_with_retries "run_nc ${DB_HOST@Q} ${DB_PORT@Q}" +} + +function create_www_user() { + local local_password="" + # Warning: command environment variables (*_CMD) have priority over usual configuration variables + # for configuration parameters that require sensitive information. This is the case for the SQL database + # and the broker backend in this entrypoint script. + if [[ -n "${_AIRFLOW_WWW_USER_PASSWORD_CMD=}" ]]; then + local_password=$(eval "${_AIRFLOW_WWW_USER_PASSWORD_CMD}") + unset _AIRFLOW_WWW_USER_PASSWORD_CMD + elif [[ -n "${_AIRFLOW_WWW_USER_PASSWORD=}" ]]; then + local_password="${_AIRFLOW_WWW_USER_PASSWORD}" + unset _AIRFLOW_WWW_USER_PASSWORD + fi + if [[ -z ${local_password} ]]; then + echo + echo "ERROR! Airflow Admin password not set via _AIRFLOW_WWW_USER_PASSWORD or _AIRFLOW_WWW_USER_PASSWORD_CMD variables!" + echo + exit 1 + fi + + airflow users create \ + --username "${_AIRFLOW_WWW_USER_USERNAME="admin"}" \ + --firstname "${_AIRFLOW_WWW_USER_FIRSTNAME="Airflow"}" \ + --lastname "${_AIRFLOW_WWW_USER_LASTNAME="Admin"}" \ + --email "${_AIRFLOW_WWW_USER_EMAIL="airflowadmin@example.com"}" \ + --role "${_AIRFLOW_WWW_USER_ROLE="Admin"}" \ + --password "${local_password}" || true +} + +function create_system_user_if_missing() { + # This is needed in case of OpenShift-compatible container execution. In case of OpenShift random + # User id is used when starting the image, however group 0 is kept as the user group. Our production + # Image is OpenShift compatible, so all permissions on all folders are set so that 0 group can exercise + # the same privileges as the default "airflow" user, this code checks if the user is already + # present in /etc/passwd and will create the system user dynamically, including setting its + # HOME directory to the /home/airflow so that (for example) the ${HOME}/.local folder where airflow is + # Installed can be automatically added to PYTHONPATH + if ! whoami &> /dev/null; then + if [[ -w /etc/passwd ]]; then + echo "${USER_NAME:-default}:x:$(id -u):0:${USER_NAME:-default} user:${AIRFLOW_USER_HOME_DIR}:/sbin/nologin" \ + >> /etc/passwd + fi + export HOME="${AIRFLOW_USER_HOME_DIR}" + fi +} + +function set_pythonpath_for_root_user() { + # Airflow is installed as a local user application which means that if the container is running as root + # the application is not available. because Python then only load system-wide applications. + # Now also adds applications installed as local user "airflow". + if [[ $UID == "0" ]]; then + local python_major_minor + python_major_minor="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)" + export PYTHONPATH="${AIRFLOW_USER_HOME_DIR}/.local/lib/python${python_major_minor}/site-packages:${PYTHONPATH:-}" + >&2 echo "The container is run as root user. For security, consider using a regular user account." + fi +} + +function wait_for_airflow_db() { + # Wait for the command to run successfully to validate the database connection. + run_check_with_retries "airflow db check" +} + +function upgrade_db() { + local airflow_minor_version + airflow_minor_version="$(echo $AIRFLOW_VERSION | cut -d . -f 2)" + + # https://airflow.apache.org/docs/apache-airflow/stable/installation/upgrading.html#why-you-need-to-upgrade + # Runs airflow db upgrade (< 2.8.x) or migrate (>= 2.8.x) according to the version + if [[ "${airflow_minor_version}" -ge 8 ]]; then + airflow db migrate || true + else + airflow db upgrade + fi +} + +function wait_for_celery_broker() { + # Verifies connection to Celery Broker + local executor + executor="$(airflow config get-value core executor)" + if [[ "${executor}" == "CeleryExecutor" ]]; then + local connection_url + connection_url="$(airflow config get-value celery broker_url)" + wait_for_connection "${connection_url}" + fi +} + +function exec_to_bash_or_python_command_if_specified() { + # If one of the commands: 'bash', 'python' is used, either run appropriate + # command with exec + if [[ ${AIRFLOW_COMMAND} == "bash" ]]; then + shift + exec "/bin/bash" "${@}" + elif [[ ${AIRFLOW_COMMAND} == "python" ]]; then + shift + exec "python" "${@}" + fi +} + +function check_uid_gid() { + if [[ $(id -g) == "0" ]]; then + return + fi + if [[ $(id -u) == "50000" ]]; then + >&2 echo + >&2 echo "WARNING! You should run the image with GID (Group ID) set to 0" + >&2 echo " even if you use 'airflow' user (UID=50000)" + >&2 echo + >&2 echo " You started the image with UID=$(id -u) and GID=$(id -g)" + >&2 echo + >&2 echo " This is to make sure you can run the image with an arbitrary UID in the future." + >&2 echo + >&2 echo " See more about it in the Airflow's docker image documentation" + >&2 echo " http://airflow.apache.org/docs/docker-stack/entrypoint" + >&2 echo + # We still allow the image to run with `airflow` user. + return + else + >&2 echo + >&2 echo "ERROR! You should run the image with GID=0" + >&2 echo + >&2 echo " You started the image with UID=$(id -u) and GID=$(id -g)" + >&2 echo + >&2 echo "The image should always be run with GID (Group ID) set to 0 regardless of the UID used." + >&2 echo " This is to make sure you can run the image with an arbitrary UID." + >&2 echo + >&2 echo " See more about it in the Airflow's docker image documentation" + >&2 echo " http://airflow.apache.org/docs/docker-stack/entrypoint" + # This will not work so we fail hard + exit 1 + fi +} + +# In Airflow image we are setting PIP_USER variable to true, in order to install all the packages +# by default with the ``--user`` flag. However this is a problem if a virtualenv is created later +# which happens in PythonVirtualenvOperator. We are unsetting this variable here, so that it is +# not set when PIP is run by Airflow later on +unset PIP_USER + +check_uid_gid + +# Set umask to 0002 to make all the directories created by the current user group-writeable +# This allows the same directories to be writeable for any arbitrary user the image will be +# run with, when the directory is created on a mounted volume and when that volume is later +# reused with a different UID (but with GID=0) +umask 0002 + +CONNECTION_CHECK_MAX_COUNT=${CONNECTION_CHECK_MAX_COUNT:=20} +readonly CONNECTION_CHECK_MAX_COUNT + +CONNECTION_CHECK_SLEEP_TIME=${CONNECTION_CHECK_SLEEP_TIME:=3} +readonly CONNECTION_CHECK_SLEEP_TIME + +create_system_user_if_missing +set_pythonpath_for_root_user +if [[ "${CONNECTION_CHECK_MAX_COUNT}" -gt "0" ]]; then + wait_for_airflow_db +fi + +if [[ -n "${_AIRFLOW_DB_UPGRADE=}" ]] ; then + upgrade_db +fi + +if [[ -n "${_AIRFLOW_WWW_USER_CREATE=}" ]] ; then + create_www_user +fi + +if [[ -n "${_PIP_ADDITIONAL_REQUIREMENTS=}" ]] ; then + >&2 echo + >&2 echo "!!!!! Installing additional requirements: '${_PIP_ADDITIONAL_REQUIREMENTS}' !!!!!!!!!!!!" + >&2 echo + >&2 echo "WARNING: This is a developpment/test feature only. NEVER use it in production!" + >&2 echo " Instead, build a custom image as described in" + >&2 echo + >&2 echo " https://airflow.apache.org/docs/docker-stack/build.html" + >&2 echo + >&2 echo " Adding requirements at container startup is fragile and is done every time" + >&2 echo " the container starts, so it is onlny useful for testing and trying out" + >&2 echo " of adding dependencies." + >&2 echo + pip install --no-cache-dir ${_PIP_ADDITIONAL_REQUIREMENTS} +fi + + +# The `bash` and `python` commands should also verify the basic connections +# So they are run after the DB check +exec_to_bash_or_python_command_if_specified "${@}" + +# Remove "airflow" if it is specified as airflow command +# This way both command types work the same way: +# +# docker run IMAGE airflow webserver +# docker run IMAGE webserver +# +if [[ ${AIRFLOW_COMMAND} == "airflow" ]]; then + AIRFLOW_COMMAND="${2:-}" + shift +fi + +# Note: the broker backend configuration concerns only a subset of Airflow components +if [[ ${AIRFLOW_COMMAND} =~ ^(scheduler|celery)$ ]] \ + && [[ "${CONNECTION_CHECK_MAX_COUNT}" -gt "0" ]]; then + wait_for_celery_broker +fi + +exec "airflow" "${@}" diff --git a/docker/airflow/2/debian12/2.10/source_code.txt b/docker/airflow/2/debian12/2.10/source_code.txt new file mode 100644 index 0000000000..fc09c05344 --- /dev/null +++ b/docker/airflow/2/debian12/2.10/source_code.txt @@ -0,0 +1,17 @@ +https://github.com/ronf/asyncssh +https://github.com/dequelabs/axe-core +https://github.com/browserslist/caniuse-lite +https://github.com/certifi/python-certifi +https://github.com/chardet/chardet +https://github.com/kieler/elkjs +https://github.com/mattcg/language-subtag-registry +https://github.com/cannatag/ldap3 +https://github.com/mdn/data +https://github.com/PyMySQL/mysqlclient +https://github.com/paramiko/paramiko +https://github.com/cpburnz/python-pathspec +https://github.com/psycopg/psycopg2 +https://github.com/kemitchell/spdx-exceptions.json +https://github.com/jslicense/spdx-license-ids +https://github.com/zopefoundation/zope.event +https://github.com/zopefoundation/zope.interface diff --git a/docker/airflow/2/debian12/2.6/Dockerfile b/docker/airflow/2/debian12/2.6/Dockerfile new file mode 100644 index 0000000000..049c24e452 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/Dockerfile @@ -0,0 +1,311 @@ +ARG AIRFLOW_VERSION="2.6.3" +ARG AIRFLOW_EXTRAS="amazon,async,celery,cncf.kubernetes,dask,docker,elasticsearch,ftp,google,google_auth,grpc,hashicorp,http,ldap,microsoft.azure,mysql,odbc,pandas,postgres,redis,sendgrid,sftp,slack,ssh,statsd,virtualenv,apache-airflow-providers-cncf-kubernetes" + +ARG AIRFLOW_HOME=/opt/airflow +ARG AIRFLOW_UID="50000" +ARG AIRFLOW_USER_HOME_DIR=/home/airflow +ARG AIRFLOW_PIP_VERSION="24.2" + + +FROM marketplace.gcr.io/google/debian12 as ospo + +# Download Licenses and restricted source-code +COPY components.csv /components.csv +COPY source_code.txt /source_code.txt + +RUN apt update && apt -y install ca-certificates curl + +RUN curl -o /download-licenses.sh -L https://raw.githubusercontent.com/GoogleCloudPlatform/click-to-deploy/master/scripts/download-licenses.sh \ + && curl -o /download-ref-repos.sh -L https://raw.githubusercontent.com/GoogleCloudPlatform/click-to-deploy/master/scripts/download-ref-repos.sh \ + && chmod +x /download-licenses.sh \ + && chmod +x /download-ref-repos.sh + +RUN mkdir -p /usr/src/licenses \ + && /download-licenses.sh /components.csv /usr/src/licenses \ + && /download-ref-repos.sh /source_code.txt /usr/src + + +FROM marketplace.gcr.io/google/debian12 as airflow-build-image + +SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "nounset", "-o", "nolog", "-c"] +ENV DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \ + LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends python3 python3-venv python3-pip + +# Create and activate virtual environment +RUN python3 -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Additional development dependencies +ENV DEV_APT_DEPS="\ + apt-transport-https \ + apt-utils \ + build-essential \ + ca-certificates \ + dirmngr \ + freetds-bin \ + freetds-dev \ + gosu \ + krb5-user \ + ldap-utils \ + libffi-dev \ + libkrb5-dev \ + libldap2-dev \ + libpq-dev \ + libsasl2-2 \ + libsasl2-dev \ + libsasl2-modules \ + libssl-dev \ + locales \ + lsb-release \ + nodejs \ + openssh-client \ + pkg-config \ + postgresql-client \ + python3 \ + python3-pip \ + python3-dev \ + sasl2-bin \ + software-properties-common \ + sqlite3 \ + sudo \ + unixodbc \ + unixodbc-dev \ + yarn" + +ENV DEV_APT_COMMAND="\ + curl --silent --fail --location https://deb.nodesource.com/setup_18.x | \ + bash -o pipefail -o errexit -o nolog - \ + && curl --silent https://dl.yarnpkg.com/debian/pubkey.gpg | \ + apt-key add - >/dev/null 2>&1\ + && echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list" + +RUN apt-get update \ + && apt-get install --no-install-recommends -yqq apt-utils >/dev/null 2>&1 \ + && apt-get install -y --no-install-recommends curl ca-certificates gnupg2 \ + && mkdir -pv /usr/share/man/man1 \ + && mkdir -pv /usr/share/man/man7 \ + && bash -o pipefail -o errexit -o nounset -o nolog -c "${DEV_APT_COMMAND}" \ + && apt-get update \ + && apt-get install -y --no-install-recommends ${DEV_APT_DEPS} \ + && apt-get autoremove -yqq --purge \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ARG AIRFLOW_EXTRAS +ARG AIRFLOW_VERSION +ARG AIRFLOW_PIP_VERSION +ARG AIRFLOW_HOME +ARG AIRFLOW_USER_HOME_DIR +ARG AIRFLOW_UID + +# Set additional environment variables +ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \ + AIRFLOW_VERSION=${AIRFLOW_VERSION} \ + AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS} \ + AIRFLOW_PRE_CACHED_PIP_PACKAGES="false" \ + INSTALL_PROVIDERS_FROM_SOURCES="false" \ + AIRFLOW_INSTALLATION_METHOD="apache-airflow" \ + PATH=${PATH}:${AIRFLOW_USER_HOME_DIR}/.local/bin \ + AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \ + AIRFLOW_USER_HOME_DIR=${AIRFLOW_USER_HOME_DIR} \ + AIRFLOW_HOME=${AIRFLOW_HOME} \ + AIRFLOW_UID=${AIRFLOW_UID} \ + INSTALL_MYSQL_CLIENT="true" \ + INSTALL_MSSQL_CLIENT="true" \ + PIP_USER="false" + +# Install required tools +COPY scripts/docker/install_mysql.sh scripts/docker/install_mssql.sh /scripts/docker/ +RUN /scripts/docker/install_mysql.sh dev && /scripts/docker/install_mssql.sh +ENV PATH=${PATH}:/opt/mssql-tools/bin + +# Add airflow user +RUN adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password \ + --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" && \ + mkdir -p ${AIRFLOW_HOME} && mkdir -p ${AIRFLOW_USER_HOME_DIR}/.local && \ + chown -R "airflow:0" "${AIRFLOW_USER_HOME_DIR}" ${AIRFLOW_HOME} + +# Change user to root then run pip install script and revert back to airflow user +USER root +COPY --chown=airflow:0 scripts/docker/install_pip_version.sh /scripts/docker/ +RUN /scripts/docker/install_pip_version.sh +USER airflow + +# Final environment settings and running installations +ENV INSTALL_FROM_PYPI="true" \ + EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3 certifi<2021.0.0 google-ads<14.0.1" + +WORKDIR /opt/airflow +COPY --chown=airflow:0 scripts/docker/install_airflow.sh /scripts/docker/ + +RUN /scripts/docker/install_airflow.sh \ + && find "${AIRFLOW_USER_HOME_DIR}/.local/" -name '*.pyc' -print0 | xargs -0 rm -f || true \ + && find "${AIRFLOW_USER_HOME_DIR}/.local/" -type d -name '__pycache__' -print0 | xargs -0 rm -rf || true \ + && find "${AIRFLOW_USER_HOME_DIR}/.local" -executable -print0 | xargs --null chmod g+x \ + && find "${AIRFLOW_USER_HOME_DIR}/.local" -print0 | xargs --null chmod g+rw + +FROM marketplace.gcr.io/google/debian12 as main + +# Copy necessary binaries and settings from build stage +COPY --from=ospo /usr/src /usr/src + +SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "nounset", "-o", "nolog", "-c"] + +# Set up necessary privileges +ARG AIRFLOW_USER_HOME_DIR +ARG AIRFLOW_HOME +ARG AIRFLOW_UID +ARG AIRFLOW_PIP_VERSION +ARG AIRFLOW_VERSION + +ENV AIRFLOW_VERSION=${AIRFLOW_VERSION} \ + DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \ + LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 \ + AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} + +# Runtime dependencies +ENV RUNTIME_APT_DEPS="\ + apt-transport-https \ + apt-utils \ + ca-certificates \ + curl \ + dumb-init \ + freetds-bin \ + krb5-user \ + ldap-utils \ + libffi8 \ + libldap-common \ + libsasl2-2 \ + libsasl2-modules \ + libssl-dev \ + locales \ + lsb-release \ + netcat-traditional \ + openssh-client \ + pkg-config \ + postgresql-client \ + dh-python \ + python3 \ + python3-pip \ + python3-venv \ + pkg-config \ + rsync \ + sasl2-bin \ + sqlite3 \ + sudo \ + unixodbc" + +ENV RUNTIME_APT_COMMAND="echo" \ + INSTALL_MYSQL_CLIENT="true" \ + INSTALL_MSSQL_CLIENT="true" \ + AIRFLOW_INSTALLATION_METHOD="apache-airflow" \ + AIRFLOW_UID=${AIRFLOW_UID} \ + AIRFLOW__CORE__LOAD_EXAMPLES="false" \ + AIRFLOW_USER_HOME_DIR=${AIRFLOW_USER_HOME_DIR} \ + AIRFLOW_HOME=${AIRFLOW_HOME} \ + PATH="${AIRFLOW_USER_HOME_DIR}/.local/bin:${PATH}" \ + GUNICORN_CMD_ARGS="--worker-tmp-dir /dev/shm" \ + PIP_USER="false" + +# Install and configure runtime environment +RUN apt-get update \ + && apt-get install --no-install-recommends -yqq apt-utils >/dev/null 2>&1 \ + && apt-get install -y --no-install-recommends curl ca-certificates gnupg2 \ + && mkdir -pv /usr/share/man/man1 \ + && mkdir -pv /usr/share/man/man7 \ + && bash -o pipefail -o errexit -o nounset -o nolog -c "${RUNTIME_APT_COMMAND}" \ + && apt-get update \ + && apt-get install -y --no-install-recommends ${RUNTIME_APT_DEPS} \ + && apt-get autoremove -yqq --purge \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/log/* \ + && ln -s /usr/bin/python3 /usr/bin/python + +# Install Gosu +# /usr/sbin/gosu +ENV GOSU_VERSION 1.17 +RUN set -eux; \ + apt-get update; \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + gpg \ + gpgv \ + libjemalloc2 \ + pwgen \ + tzdata \ + xz-utils \ + zstd ; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get install -y --no-install-recommends \ + dirmngr \ + gpg-agent \ + wget; \ + rm -rf /var/lib/apt/lists/*; \ + dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ + wget -q -O /usr/sbin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \ + wget -q -O /usr/sbin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \ + GNUPGHOME="$(mktemp -d)"; \ + export GNUPGHOME; \ + gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \ + gpg --batch --verify /usr/sbin/gosu.asc /usr/sbin/gosu; \ + gpgconf --kill all; \ + rm -rf "$GNUPGHOME" /usr/sbin/gosu.asc; \ + apt-mark auto '.*' > /dev/null; \ + [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark >/dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + chmod +x /usr/sbin/gosu; \ + gosu --version; \ + gosu nobody true + + +# Continue installation and set up user permissions +COPY scripts/docker/install_mysql.sh /scripts/docker/install_mssql.sh /scripts/docker/ +RUN chmod a+x /scripts/docker/install_mysql.sh /scripts/docker/install_mssql.sh \ + && sync \ + && /scripts/docker/install_mysql.sh prod \ + && /scripts/docker/install_mssql.sh \ + && adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" \ + && mkdir -pv "${AIRFLOW_HOME}" \ + && mkdir -pv "${AIRFLOW_HOME}/dags" \ + && mkdir -pv "${AIRFLOW_HOME}/logs" \ + && chown -R airflow:0 "${AIRFLOW_USER_HOME_DIR}" "${AIRFLOW_HOME}" \ + && chmod -R g+rw "${AIRFLOW_USER_HOME_DIR}" "${AIRFLOW_HOME}" \ + && find "${AIRFLOW_HOME}" -executable -print0 | xargs -0 chmod g+x \ + && find "${AIRFLOW_USER_HOME_DIR}" -executable -print0 | xargs -0 chmod g+x + +# Copy pre-built local environment for Airflow and set up entry points +COPY --chown=airflow:0 --from=airflow-build-image \ + "${AIRFLOW_USER_HOME_DIR}/.local" "${AIRFLOW_USER_HOME_DIR}/.local" +COPY --chown=airflow:0 scripts/prod/entrypoint_prod.sh /entrypoint +COPY --chown=airflow:0 scripts/prod/clean-logs.sh /clean-logs + +# Ensure scripts are executable and adjust file permissions appropriately +RUN chmod a+x /entrypoint /clean-logs \ + && chmod g=u /etc/passwd \ + && chmod g+w "${AIRFLOW_USER_HOME_DIR}/.local" + +# Modify secure path to include virtual environment +RUN sed --in-place=.bak "s/secure_path=\"/secure_path=\"\/.venv\/bin:/" /etc/sudoers + +# Environment settings for runtime +ENV DUMB_INIT_SETSID="1" \ + PS1="(airflow)" \ + LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libstdc++.so.6" + +# Set work directory and expose port for webserver +WORKDIR ${AIRFLOW_HOME} +EXPOSE 8080 + +# Run as airflow user +USER ${AIRFLOW_UID} + +# Define Airflow release version +ENV C2D_RELEASE 2.6.3 + +# Set default entrypoint and command for the container +ENTRYPOINT ["/usr/bin/dumb-init", "--", "/entrypoint"] +CMD [""] diff --git a/docker/airflow/2/debian12/2.6/components.csv b/docker/airflow/2/debian12/2.6/components.csv new file mode 100644 index 0000000000..972c4783d9 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/components.csv @@ -0,0 +1,1594 @@ +ampproject_remapping;https://github.com/ampproject/remapping +babel_code-frame;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_compat-data;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_core;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_eslint-parser;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_generator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-annotate-as-pure;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-builder-binary-assignment-operator-visitor;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-compilation-targets;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-create-class-features-plugin;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-create-regexp-features-plugin;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-define-polyfill-provider;https://github.com/babel/babel-polyfills +babel_helper-environment-visitor;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-explode-assignable-expression;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-function-name;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-get-function-arity;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-hoist-variables;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-member-expression-to-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-module-imports;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-module-transforms;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-optimise-call-expression;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-plugin-utils;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-remap-async-to-generator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-replace-supers;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-simple-access;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-skip-transparent-expression-wrappers;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-split-export-declaration;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-string-parser;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-validator-identifier;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-validator-option;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helper-wrap-function;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_helpers;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_highlight;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_parser;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-bugfix-safari-id-destructuring-collision-in-function-expression;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-bugfix-v8-spread-parameters-in-optional-chaining;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-async-generator-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-class-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-class-static-block;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-dynamic-import;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-export-namespace-from;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-json-strings;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-logical-assignment-operators;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-nullish-coalescing-operator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-numeric-separator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-object-rest-spread;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-optional-catch-binding;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-optional-chaining;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-private-methods;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-private-property-in-object;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-proposal-unicode-property-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-async-generators;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-bigint;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-class-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-class-static-block;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-dynamic-import;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-export-namespace-from;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-import-meta;https://github.com/babel/babel +babel_plugin-syntax-json-strings;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-jsx;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-logical-assignment-operators;https://github.com/babel/babel +babel_plugin-syntax-nullish-coalescing-operator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-numeric-separator;https://github.com/babel/babel +babel_plugin-syntax-object-rest-spread;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-optional-catch-binding;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-optional-chaining;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-private-property-in-object;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-top-level-await;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-syntax-typescript;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-arrow-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-async-to-generator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-block-scoped-functions;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-block-scoping;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-classes;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-computed-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-destructuring;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-dotall-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-duplicate-keys;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-exponentiation-operator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-for-of;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-function-name;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-member-expression-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-amd;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-commonjs;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-systemjs;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-modules-umd;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-named-capturing-groups-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-new-target;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-object-super;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-parameters;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-property-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-display-name;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-jsx;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-jsx-development;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-react-pure-annotations;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-regenerator;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-reserved-words;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-runtime;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-shorthand-properties;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-spread;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-sticky-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-template-literals;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-typeof-symbol;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-typescript;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-unicode-escapes;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_plugin-transform-unicode-regex;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_preset-env;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_preset-modules;https://github.com/babel/preset-modules +babel_preset-react;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_preset-typescript;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_runtime;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_runtime-corejs3;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_template;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_traverse;https://raw.githubusercontent.com/babel/babel/master/LICENSE +babel_types;https://raw.githubusercontent.com/babel/babel/master/LICENSE +bcoe_v8-coverage;https://github.com/demurgos/v8-coverage +chakra-ui_accordion;https://github.com/chakra-ui/chakra-ui +chakra-ui_alert;https://github.com/chakra-ui/chakra-ui +chakra-ui_anatomy;https://github.com/chakra-ui/chakra-ui +chakra-ui_avatar;https://github.com/chakra-ui/chakra-ui +chakra-ui_breadcrumb;https://github.com/chakra-ui/chakra-ui +chakra-ui_breakpoint-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_button;https://github.com/chakra-ui/chakra-ui +chakra-ui_card;https://github.com/chakra-ui/chakra-ui +chakra-ui_checkbox;https://github.com/chakra-ui/chakra-ui +chakra-ui_clickable;https://github.com/chakra-ui/chakra-ui +chakra-ui_close-button;https://github.com/chakra-ui/chakra-ui +chakra-ui_color-mode;https://github.com/chakra-ui/chakra-ui +chakra-ui_control-box;https://github.com/chakra-ui/chakra-ui +chakra-ui_counter;https://github.com/chakra-ui/chakra-ui +chakra-ui_css-reset;https://github.com/chakra-ui/chakra-ui +chakra-ui_descendant;https://github.com/chakra-ui/chakra-ui +chakra-ui_dom-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_editable;https://github.com/chakra-ui/chakra-ui +chakra-ui_event-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_focus-lock;https://github.com/chakra-ui/chakra-ui +chakra-ui_form-control;https://github.com/chakra-ui/chakra-ui +chakra-ui_hooks;https://github.com/chakra-ui/chakra-ui +chakra-ui_icon;https://github.com/chakra-ui/chakra-ui +chakra-ui_image;https://github.com/chakra-ui/chakra-ui +chakra-ui_input;https://github.com/chakra-ui/chakra-ui +chakra-ui_layout;https://github.com/chakra-ui/chakra-ui +chakra-ui_lazy-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_live-region;https://github.com/chakra-ui/chakra-ui +chakra-ui_media-query;https://github.com/chakra-ui/chakra-ui +chakra-ui_menu;https://github.com/chakra-ui/chakra-ui +chakra-ui_modal;https://github.com/chakra-ui/chakra-ui +chakra-ui_number-input;https://github.com/chakra-ui/chakra-ui +chakra-ui_number-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_object-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_pin-input;https://github.com/chakra-ui/chakra-ui +chakra-ui_popover;https://github.com/chakra-ui/chakra-ui +chakra-ui_popper;https://github.com/chakra-ui/chakra-ui +chakra-ui_portal;https://github.com/chakra-ui/chakra-ui +chakra-ui_progress;https://github.com/chakra-ui/chakra-ui +chakra-ui_provider;https://github.com/chakra-ui/chakra-ui +chakra-ui_radio;https://github.com/chakra-ui/chakra-ui +chakra-ui_react;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-children-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-context;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-env;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-types;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-animation-state;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-callback-ref;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-controllable-state;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-disclosure;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-event-listener;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-focus-effect;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-focus-on-pointer-down;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-interval;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-latest-ref;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-merge-refs;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-outside-click;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-pan-event;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-previous;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-safe-layout-effect;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-size;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-timeout;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-use-update-effect;https://github.com/chakra-ui/chakra-ui +chakra-ui_react-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_select;https://github.com/chakra-ui/chakra-ui +chakra-ui_shared-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_skeleton;https://github.com/chakra-ui/chakra-ui +chakra-ui_slider;https://github.com/chakra-ui/chakra-ui +chakra-ui_spinner;https://github.com/chakra-ui/chakra-ui +chakra-ui_stat;https://github.com/chakra-ui/chakra-ui +chakra-ui_styled-system;https://github.com/chakra-ui/chakra-ui +chakra-ui_switch;https://github.com/chakra-ui/chakra-ui +chakra-ui_system;https://github.com/chakra-ui/chakra-ui +chakra-ui_table;https://github.com/chakra-ui/chakra-ui +chakra-ui_tabs;https://github.com/chakra-ui/chakra-ui +chakra-ui_tag;https://github.com/chakra-ui/chakra-ui +chakra-ui_textarea;https://github.com/chakra-ui/chakra-ui +chakra-ui_theme;https://github.com/chakra-ui/chakra-ui +chakra-ui_theme-tools;https://github.com/chakra-ui/chakra-ui +chakra-ui_theme-utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_toast;https://github.com/chakra-ui/chakra-ui +chakra-ui_tooltip;https://github.com/chakra-ui/chakra-ui +chakra-ui_transition;https://github.com/chakra-ui/chakra-ui +chakra-ui_utils;https://github.com/chakra-ui/chakra-ui +chakra-ui_visually-hidden;https://github.com/chakra-ui/chakra-ui +csstools_css-parser-algorithms;https://github.com/csstools/postcss-plugins +csstools_css-tokenizer;https://github.com/csstools/postcss-plugins +csstools_media-query-list-parser;https://github.com/csstools/postcss-plugins +csstools_selector-specificity;https://github.com/csstools/postcss-plugins +discoveryjs_json-ext;https://github.com/discoveryjs/json-ext +emotion_babel-plugin;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_cache;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_hash;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_is-prop-valid;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_memoize;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_react;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_serialize;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_sheet;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_styled;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_unitless;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_utils;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +emotion_weak-memoize;https://raw.githubusercontent.com/emotion-js/emotion/master/LICENSE +eslint_eslintrc;https://github.com/eslint/eslintrc +exodus_schemasafe;https://github.com/ExodusMovement/schemasafe +fastify_busboy;https://github.com/fastify/busboy +humanwhocodes_config-array;https://github.com/humanwhocodes/config-array +humanwhocodes_object-schema;https://github.com/humanwhocodes/object-schema +istanbuljs_load-nyc-config;https://github.com/istanbuljs/load-nyc-config +istanbuljs_schema;https://github.com/istanbuljs/schema +jest_console;https://github.com/facebook/jest +jest_core;https://github.com/facebook/jest +jest_environment;https://github.com/facebook/jest +jest_fake-timers;https://github.com/facebook/jest +jest_globals;https://github.com/facebook/jest +jest_reporters;https://github.com/facebook/jest +jest_source-map;https://github.com/facebook/jest +jest_test-result;https://github.com/facebook/jest +jest_test-sequencer;https://github.com/facebook/jest +jest_transform;https://github.com/facebook/jest +jest_types;https://github.com/facebook/jest +jridgewell_gen-mapping;https://github.com/jridgewell/gen-mapping +jridgewell_resolve-uri;https://github.com/jridgewell/resolve-uri +jridgewell_set-array;https://github.com/jridgewell/set-array +jridgewell_source-map;https://github.com/jridgewell/source-map +jridgewell_sourcemap-codec;https://github.com/jridgewell/sourcemap-codec +jridgewell_trace-mapping;https://github.com/jridgewell/trace-mapping +nodelib_fs.scandir;https://raw.githubusercontent.com/nodelib/nodelib/master/LICENSE +nodelib_fs.stat;https://raw.githubusercontent.com/nodelib/nodelib/master/LICENSE +nodelib_fs.walk;https://raw.githubusercontent.com/nodelib/nodelib/master/LICENSE +npmcli_move-file;https://github.com/npm/move-file +popperjs_core;https://raw.githubusercontent.com/popperjs/popper-core/master/LICENSE +reactflow_background;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_controls;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_core;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_minimap;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_node-resizer;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +reactflow_node-toolbar;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +redocly_ajv;https://github.com/ajv-validator/ajv +redocly_openapi-core;https://github.com/Redocly/redocly-cli +sinonjs_commons;https://github.com/sinonjs/commons +sinonjs_fake-timers;https://github.com/sinonjs/fake-timers +testing-library_dom;https://github.com/testing-library/dom-testing-library +testing-library_jest-dom;https://github.com/testing-library/jest-dom +testing-library_react;https://github.com/testing-library/react-testing-library +tootallnate_once;https://github.com/TooTallNate/once +trysound_sax;https://github.com/svg/sax +types_aria-query;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__core;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__generator;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__template;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_babel__traverse;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_color;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_color-convert;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_color-name;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-array;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-axis;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-brush;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-chord;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-color;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-contour;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-delaunay;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-dispatch;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-drag;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-dsv;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-ease;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-fetch;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-force;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-format;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-geo;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-hierarchy;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-interpolate;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-path;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-polygon;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-quadtree;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-random;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-scale;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-scale-chromatic;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-selection;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-shape;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-time;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-time-format;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-timer;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-transition;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_d3-zoom;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_debug;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_eslint;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_eslint-scope;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_estree;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_geojson;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_glob;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_graceful-fs;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_hast;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_istanbul-lib-coverage;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_istanbul-lib-report;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_istanbul-reports;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_jest;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_json-schema;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_json5;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_lodash;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_lodash.mergewith;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_mdast;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_minimatch;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_minimist;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_ms;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_node;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_normalize-package-data;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_parse-json;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_prettier;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_prop-types;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-dom;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-syntax-highlighter;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-table;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_react-transition-group;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_scheduler;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_source-list-map;https://www.github.com/DefinitelyTyped/DefinitelyTyped +types_stack-utils;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_tapable;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_testing-library__jest-dom;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_uglify-js;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_unist;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_webpack;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_webpack-sources;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_yargs;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +types_yargs-parser;https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/LICENSE +typescript-eslint_eslint-plugin;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_parser;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_scope-manager;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_type-utils;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_types;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_typescript-estree;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_utils;https://github.com/typescript-eslint/typescript-eslint +typescript-eslint_visitor-keys;https://github.com/typescript-eslint/typescript-eslint +visx_curve;https://github.com/airbnb/visx +visx_group;https://github.com/airbnb/visx +visx_scale;https://github.com/airbnb/visx +visx_shape;https://github.com/airbnb/visx +webassemblyjs_ast;https://github.com/xtuc/webassemblyjs +webassemblyjs_floating-point-hex-parser;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-api-error;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-buffer;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-numbers;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-wasm-bytecode;https://github.com/xtuc/webassemblyjs +webassemblyjs_helper-wasm-section;https://github.com/xtuc/webassemblyjs +webassemblyjs_ieee754;https://github.com/xtuc/webassemblyjs +webassemblyjs_leb128;https://github.com/xtuc/webassemblyjs +webassemblyjs_utf8;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-edit;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-gen;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-opt;https://github.com/xtuc/webassemblyjs +webassemblyjs_wasm-parser;https://github.com/xtuc/webassemblyjs +webassemblyjs_wast-printer;https://github.com/xtuc/webassemblyjs +webpack-cli_configtest;https://github.com/webpack/webpack-cli +webpack-cli_info;https://github.com/webpack/webpack-cli +webpack-cli_serve;https://github.com/webpack/webpack-cli +xtuc_ieee754;https://github.com/feross/ieee754 +xtuc_long;https://github.com/dcodeIO/long.js +zag-js_element-size;https://github.com/chakra-ui/zag.git#main +zag-js_focus-visible;https://github.com/chakra-ui/zag.git#main +Babel;https://raw.githubusercontent.com/python-babel/babel/master/LICENSE +ConfigUpdater;https://github.com/pyscaffold/configupdater +Deprecated;https://raw.githubusercontent.com/tantale/deprecated/master/LICENSE.rst +Flask;https://raw.githubusercontent.com/pallets/flask/master/LICENSE.rst +Flask-AppBuilder;https://raw.githubusercontent.com/dpgaspar/flask-appbuilder/master/LICENSE +Flask-Babel;https://raw.githubusercontent.com/python-babel/flask-babel/master/LICENSE +Flask-Caching;https://raw.githubusercontent.com/pallets-eco/flask-caching/master/LICENSE +Flask-JWT-Extended;https://raw.githubusercontent.com/vimalloc/flask-jwt-extended/master/LICENSE +Flask-Limiter;https://github.com/alisaifee/flask-limiter +Flask-Login;https://raw.githubusercontent.com/maxcountryman/flask-login/master/LICENSE +Flask-SQLAlchemy;https://raw.githubusercontent.com/pallets/flask-sqlalchemy/master/LICENSE.rst +Flask-Session;https://raw.githubusercontent.com/pallets-eco/flask-session/master/LICENSE.rst +Flask-WTF;https://raw.githubusercontent.com/wtforms/flask-wtf/master/LICENSE.rst +Jinja2;https://raw.githubusercontent.com/pallets/jinja/master/LICENSE.rst +Mako;https://raw.githubusercontent.com/sqlalchemy/mako/master/LICENSE +MarkupSafe;https://raw.githubusercontent.com/pallets/markupsafe/master/LICENSE.rst +PyAthena;https://github.com/laughingman7743/PyAthena +PyJWT;https://raw.githubusercontent.com/jpadilla/pyjwt/master/LICENSE +PyNaCl;https://raw.githubusercontent.com/pyca/pynacl/master/LICENSE +PyYAML;https://raw.githubusercontent.com/yaml/pyyaml/master/LICENSE +Pygments;https://raw.githubusercontent.com/pygments/pygments/master/LICENSE +SQLAlchemy;https://raw.githubusercontent.com/sqlalchemy/sqlalchemy/master/LICENSE +SQLAlchemy-JSONField;https://raw.githubusercontent.com/penguinolog/sqlalchemy_jsonfield/master/LICENSE +SQLAlchemy-Utils;https://raw.githubusercontent.com/kvesteri/sqlalchemy-utils/master/LICENSE +WTForms;https://raw.githubusercontent.com/wtforms/wtforms/master/LICENSE.rst +Werkzeug;https://raw.githubusercontent.com/pallets/werkzeug/master/LICENSE.rst +abab;https://github.com/jsdom/abab +acorn;https://github.com/acornjs/acorn +acorn-globals;https://raw.githubusercontent.com/ForbesLindesay/acorn-globals/master/LICENSE +acorn-import-assertions;https://github.com/xtuc/acorn-import-assertions +acorn-jsx;https://github.com/acornjs/acorn-jsx +acorn-walk;https://github.com/acornjs/acorn +agent-base;https://github.com/TooTallNate/node-agent-base +aggregate-error;https://github.com/sindresorhus/aggregate-error +aiofiles;https://raw.githubusercontent.com/Tinche/aiofiles/master/LICENSE +aiohttp;https://github.com/aio-libs/aiohttp +aiosignal;https://raw.githubusercontent.com/aio-libs/aiosignal/master/LICENSE +airflow-exporter;https://raw.githubusercontent.com/epoch8/airflow-exporter/master/LICENSE +airflow-www;https://airflow.apache.org/ +ajv;https://github.com/ajv-validator/ajv +ajv-formats;https://github.com/ajv-validator/ajv-formats +ajv-keywords;https://github.com/epoberezkin/ajv-keywords +alembic;https://raw.githubusercontent.com/sqlalchemy/alembic/master/LICENSE +amqp;https://raw.githubusercontent.com/celery/py-amqp/main/LICENSE +ansi-escapes;https://github.com/sindresorhus/ansi-escapes +ansi-regex;https://github.com/chalk/ansi-regex +ansi-styles;https://github.com/chalk/ansi-styles +anyio;https://raw.githubusercontent.com/agronholm/anyio/master/LICENSE +anymatch;https://github.com/micromatch/anymatch +apache-airflow;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-amazon;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-celery;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-common-io;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-common-sql;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-docker;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-elasticsearch;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-ftp;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-google;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-grpc;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-hashicorp;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-http;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-imap;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-mysql;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-odbc;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-postgres;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-redis;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-sendgrid;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-sftp;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-slack;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-sqlite;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apache-airflow-providers-ssh;https://raw.githubusercontent.com/apache/airflow/master/LICENSE +apispec;https://raw.githubusercontent.com/marshmallow-code/apispec/master/LICENSE +argcomplete;https://raw.githubusercontent.com/kislyuk/argcomplete/master/LICENSE.rst +argparse;https://github.com/nodeca/argparse +aria-hidden;https://github.com/theKashey/aria-hidden +aria-query;https://github.com/A11yance/aria-query +array-buffer-byte-length;https://github.com/inspect-js/array-buffer-byte-length +array-includes;https://github.com/es-shims/array-includes +array-union;https://github.com/sindresorhus/array-union +array-uniq;https://github.com/sindresorhus/array-uniq +array.prototype.flat;https://github.com/es-shims/Array.prototype.flat +array.prototype.flatmap;https://github.com/es-shims/Array.prototype.flatMap +arrify;https://github.com/sindresorhus/arrify +asap;https://github.com/kriskowal/asap +asgiref;https://raw.githubusercontent.com/django/asgiref/master/LICENSE +asn1crypto;https://github.com/wbond/asn1crypto +ast-types-flow;https://github.com/kyldvs/ast-types-flow +astral-regex;https://github.com/kevva/astral-regex +async-timeout;https://raw.githubusercontent.com/aio-libs/async-timeout/master/LICENSE +asynckit;https://github.com/alexindigo/asynckit +asyncssh;https://raw.githubusercontent.com/ronf/asyncssh/master/LICENSE +atob;https://git.coolaj86.com/coolaj86/atob.js/raw/branch/master/LICENSE +attrs;https://raw.githubusercontent.com/python-attrs/attrs/master/LICENSE +available-typed-arrays;https://github.com/inspect-js/available-typed-arrays +axe-core;https://github.com/dequelabs/axe-core +axios;https://github.com/axios/axios +axobject-query;https://github.com/A11yance/axobject-query +babel-jest;https://github.com/facebook/jest +babel-loader;https://raw.githubusercontent.com/babel/babel-loader/master/LICENSE +babel-plugin-dynamic-import-node;https://github.com/airbnb/babel-plugin-dynamic-import-node +babel-plugin-istanbul;https://github.com/istanbuljs/babel-plugin-istanbul +babel-plugin-jest-hoist;https://github.com/facebook/jest +babel-plugin-macros;https://github.com/kentcdodds/babel-plugin-macros +babel-plugin-polyfill-corejs2;https://github.com/babel/babel-polyfills +babel-plugin-polyfill-corejs3;https://github.com/babel/babel-polyfills +babel-plugin-polyfill-regenerator;https://github.com/babel/babel-polyfills +babel-preset-current-node-syntax;https://raw.githubusercontent.com/nicolo-ribaudo/babel-preset-current-node-syntax/master/LICENSE +babel-preset-jest;https://github.com/facebook/jest +backoff;https://raw.githubusercontent.com/litl/backoff/master/LICENSE +bail;https://github.com/wooorm/bail +balanced-match;https://github.com/juliangruber/balanced-match +base16;https://github.com/gaearon/base16-js +bcrypt;https://raw.githubusercontent.com/pyca/bcrypt/master/LICENSE +beautifulsoup4;https://www.crummy.com/software/BeautifulSoup/bs4/ +big-integer;ssh://git@github.com/peterolson/BigInteger.js +big.js;https://github.com/MikeMcl/big.js +billiard;https://raw.githubusercontent.com/celery/billiard/main/LICENSE.txt +blinker;https://raw.githubusercontent.com/pallets-eco/blinker/master/LICENSE.rst +boolbase;https://github.com/fb55/boolbase +bootstrap;https://github.com/twbs/bootstrap +bootstrap-3-typeahead;https://github.com/bassjobsen/Bootstrap-3-Typeahead +boto3;https://raw.githubusercontent.com/boto/boto/master/LICENSE +botocore;https://github.com/boto/botocore +brace-expansion;https://github.com/juliangruber/brace-expansion +braces;https://github.com/micromatch/braces +broadcast-channel;https://github.com/pubkey/broadcast-channel +browser-process-hrtime;https://github.com/kumavis/browser-process-hrtime +browserslist;https://github.com/browserslist/browserslist +bser;https://raw.githubusercontent.com/facebook/watchman/master/LICENSE +buffer-from;https://github.com/LinusU/buffer-from +cacache;https://github.com/npm/cacache +cachelib;https://raw.githubusercontent.com/pallets/cachelib/master/LICENSE.rst +cachetools;https://raw.githubusercontent.com/tkem/cachetools/master/LICENSE +call-bind;https://github.com/ljharb/call-bind +call-me-maybe;https://github.com/limulus/call-me-maybe +callsites;https://github.com/sindresorhus/callsites +camelcase;https://github.com/sindresorhus/camelcase +camelcase-keys;https://github.com/sindresorhus/camelcase-keys +caniuse-api;https://github.com/nyalab/caniuse-api +caniuse-lite;https://github.com/browserslist/caniuse-lite +cattrs;https://raw.githubusercontent.com/python-attrs/cattrs/master/LICENSE +ccount;https://github.com/wooorm/ccount +celery;https://raw.githubusercontent.com/celery/celery/master/LICENSE +certifi;https://raw.githubusercontent.com/certifi/python-certifi/master/LICENSE +cffi;https://raw.githubusercontent.com/python-cffi/cffi/master/LICENSE +chakra-react-select;https://github.com/csandman/chakra-react-select +chalk;https://github.com/chalk/chalk +char-regex;https://github.com/Richienb/char-regex +character-entities;https://github.com/wooorm/character-entities +character-entities-legacy;https://github.com/wooorm/character-entities-legacy +character-reference-invalid;https://github.com/wooorm/character-reference-invalid +chardet;https://raw.githubusercontent.com/chardet/chardet/master/LICENSE +charset-normalizer;https://raw.githubusercontent.com/Ousret/charset_normalizer/master/LICENSE +chownr;https://github.com/isaacs/chownr +chrome-trace-event;https://github.com/samccone/chrome-trace-event +ci-info;https://github.com/watson/ci-info +cjs-module-lexer;https://github.com/guybedford/cjs-module-lexer +classcat;https://github.com/jorgebucaran/classcat +classnames;https://github.com/JedWatson/classnames +clean-stack;https://github.com/sindresorhus/clean-stack +clean-webpack-plugin;https://github.com/johnagan/clean-webpack-plugin +cli;ssh://git@github.com/node-js-libs/cli +click;https://raw.githubusercontent.com/pallets/click/master/LICENSE.rst +click-didyoumean;https://raw.githubusercontent.com/click-contrib/click-didyoumean/master/LICENSE +click-plugins;https://github.com/click-contrib/click-plugins/blob/main/LICENSE.txt +click-repl;https://raw.githubusercontent.com/untitaker/click-repl/master/LICENSE +clickclick;https://raw.githubusercontent.com/hjacobs/python-clickclick/master/LICENSE +cliui;https://github.com/yargs/cliui +clone-deep;https://github.com/jonschlinkert/clone-deep +clsx;https://github.com/lukeed/clsx +co;https://github.com/tj/co +codemirror;https://github.com/codemirror/CodeMirror +collect-v8-coverage;https://github.com/SimenB/collect-v8-coverage +color;https://github.com/Qix-/color +color-convert;https://github.com/Qix-/color-convert +color-name;ssh://git@github.com/dfcreative/color-name +color-name;ssh://git@github.com/colorjs/color-name +color-string;https://github.com/Qix-/color-string +color2k;https://github.com/ricokahler/color2k +colorama;https://raw.githubusercontent.com/tartley/colorama/master/LICENSE.txt +colord;https://github.com/omgovich/colord +colorette;https://github.com/jorgebucaran/colorette +colorlog;https://raw.githubusercontent.com/borntyping/python-colorlog/master/LICENSE +combined-stream;https://github.com/felixge/node-combined-stream +comma-separated-tokens;https://github.com/wooorm/comma-separated-tokens +commander;https://github.com/tj/commander.js +commondir;http://github.com/substack/node-commondir +compute-scroll-into-view;https://github.com/stipsan/compute-scroll-into-view +concat-map;https://github.com/substack/node-concat-map +confusing-browser-globals;https://github.com/facebook/create-react-app +connexion;https://raw.githubusercontent.com/zalando/connexion/main/LICENSE +console-browserify;https://raw.githubusercontent.com/browserify/console-browserify/master/LICENCE +convert-source-map;https://github.com/thlorenz/convert-source-map +copy-to-clipboard;https://github.com/sudodoki/copy-to-clipboard +copy-webpack-plugin;https://github.com/webpack-contrib/copy-webpack-plugin +core-js-compat;https://github.com/zloirock/core-js +core-js-pure;https://github.com/zloirock/core-js +core-util-is;https://github.com/isaacs/core-util-is +cosmiconfig;https://github.com/davidtheclark/cosmiconfig +cosmiconfig;https://github.com/cosmiconfig/cosmiconfig +cron-descriptor;https://raw.githubusercontent.com/Salamek/cron-descriptor/master/LICENSE +croniter;http://github.com/kiorky/croniter +cross-fetch;https://github.com/lquixada/cross-fetch +cross-spawn;ssh://git@github.com/moxystudio/node-cross-spawn +cryptography;https://raw.githubusercontent.com/pyca/cryptography/master/LICENSE.APACHE +css;https://github.com/reworkcss/css +css-box-model;https://github.com/alexreardon/css-box-model +css-declaration-sorter;https://github.com/Siilwyn/css-declaration-sorter +css-functions-list;https://github.com/niksy/css-functions-list +css-loader;https://github.com/webpack-contrib/css-loader +css-minimizer-webpack-plugin;https://github.com/webpack-contrib/css-minimizer-webpack-plugin +css-select;https://github.com/fb55/css-select +css-tree;https://github.com/csstree/csstree +css-what;https://github.com/fb55/css-what +css.escape;https://github.com/mathiasbynens/CSS.escape +cssesc;https://github.com/mathiasbynens/cssesc +cssfontparser;https://github.com/tmpvar/cssfontparser +cssnano;https://github.com/cssnano/cssnano +cssnano-preset-default;https://github.com/cssnano/cssnano +cssnano-utils;cssnano/cssnano +csso;https://github.com/css/csso +cssom;https://github.com/NV/CSSOM +cssstyle;https://github.com/jsdom/cssstyle +csstype;https://github.com/frenic/csstype +d3;https://github.com/mbostock/d3 +d3;https://github.com/d3/d3 +d3-array;https://github.com/d3/d3-array +d3-axis;https://github.com/d3/d3-axis +d3-brush;https://github.com/d3/d3-brush +d3-chord;https://github.com/d3/d3-chord +d3-collection;https://github.com/d3/d3-collection +d3-color;https://github.com/d3/d3-color +d3-contour;https://github.com/d3/d3-contour +d3-dispatch;https://github.com/d3/d3-dispatch +d3-drag;https://github.com/d3/d3-drag +d3-dsv;https://github.com/d3/d3-dsv +d3-ease;https://github.com/d3/d3-ease +d3-fetch;https://github.com/d3/d3-fetch +d3-force;https://github.com/d3/d3-force +d3-format;https://github.com/d3/d3-format +d3-geo;https://github.com/d3/d3-geo +d3-hierarchy;https://github.com/d3/d3-hierarchy +d3-interpolate;https://github.com/d3/d3-interpolate +d3-path;https://github.com/d3/d3-path +d3-polygon;https://github.com/d3/d3-polygon +d3-quadtree;https://github.com/d3/d3-quadtree +d3-random;https://github.com/d3/d3-random +d3-scale;https://github.com/d3/d3-scale +d3-scale-chromatic;https://github.com/d3/d3-scale-chromatic +d3-selection;https://github.com/d3/d3-selection +d3-shape;https://github.com/d3/d3-shape +d3-time;https://github.com/d3/d3-time +d3-time-format;https://github.com/d3/d3-time-format +d3-timer;https://github.com/d3/d3-timer +d3-tip;https://github.com/Caged/d3-tip +d3-transition;https://github.com/d3/d3-transition +d3-voronoi;https://github.com/d3/d3-voronoi +d3-zoom;https://github.com/d3/d3-zoom +dagre;https://github.com/dagrejs/dagre +dagre-d3;https://github.com/dagrejs/dagre-d3 +damerau-levenshtein;https://github.com/tad-lispy/node-damerau-levenshtein +data-urls;https://github.com/jsdom/data-urls +datatables.net;https://github.com/DataTables/Dist-DataTables +datatables.net-bs;https://github.com/DataTables/Dist-DataTables-Bootstrap +date-now;https://raw.githubusercontent.com/Colingo/date-now/master/LICENCE +db-dtypes;https://raw.githubusercontent.com/googleapis/python-db-dtypes-pandas/master/LICENSE +debug;https://github.com/visionmedia/debug +debug;https://github.com/debug-js/debug +decamelize;https://github.com/sindresorhus/decamelize +decamelize-keys;https://github.com/dsblv/decamelize-keys +decimal.js;https://github.com/MikeMcl/decimal.js +decko;https://raw.githubusercontent.com/developit/decko/master/LICENSE +decode-named-character-reference;https://github.com/wooorm/decode-named-character-reference +decode-uri-component;https://github.com/SamVerschueren/decode-uri-component +decorator;https://raw.githubusercontent.com/micheles/decorator/master/LICENSE.txt +dedent;https://github.com/dmnd/dedent +deep-is;ssh://git@github.com/thlorenz/deep-is +deepmerge;https://github.com/TehShrike/deepmerge +define-properties;https://github.com/ljharb/define-properties +del;https://github.com/sindresorhus/del +delayed-stream;https://github.com/felixge/node-delayed-stream +dequal;https://github.com/lukeed/dequal +detect-newline;https://github.com/sindresorhus/detect-newline +detect-node;https://github.com/iliakan/detect-node +detect-node-es;https://github.com/thekashey/detect-node +diff;https://github.com/kpdecker/jsdiff +diff-sequences;https://github.com/facebook/jest +dill;https://raw.githubusercontent.com/uqfoundation/dill/master/LICENSE +dir-glob;https://github.com/kevva/dir-glob +distlib;https://github.com/pypa/distlib +dnspython;https://raw.githubusercontent.com/rthalley/dnspython/master/LICENSE +docker;https://raw.githubusercontent.com/docker/docker-py/master/LICENSE +doctrine;https://github.com/eslint/doctrine +docutils;https://raw.githubusercontent.com/docutils/docutils/master/docutils/licenses/BSD-2-Clause.txt +dom-accessibility-api;https://github.com/eps1lon/dom-accessibility-api +dom-helpers;https://github.com/react-bootstrap/dom-helpers +dom-serializer;https://github.com/cheeriojs/dom-renderer +domelementtype;https://github.com/fb55/domelementtype +domexception;https://github.com/jsdom/domexception +domhandler;https://github.com/fb55/DomHandler +domhandler;https://github.com/fb55/domhandler +dompurify;https://raw.githubusercontent.com/cure53/DOMPurify/main/LICENSE +domutils;https://github.com/FB55/domutils +domutils;https://github.com/fb55/domutils +echarts;https://github.com/apache/echarts +elastic-transport;https://raw.githubusercontent.com/elastic/elastic-transport-python/master/LICENSE +elasticsearch;https://raw.githubusercontent.com/elastic/elasticsearch-py/master/LICENSE +electron-to-chromium;https://github.com/kilian/electron-to-chromium +elkjs;https://github.com/kieler/elkjs +email-validator;https://raw.githubusercontent.com/JoshData/python-email-validator/master/LICENSE +emittery;https://github.com/sindresorhus/emittery +emoji-regex;https://github.com/mathiasbynens/emoji-regex +emojis-list;https://github.com/kikobeats/emojis-list +enhanced-resolve;https://github.com/webpack/enhanced-resolve +entities;https://raw.githubusercontent.com/fb55/entities/master/LICENSE +entities;https://github.com/fb55/entities +envinfo;https://github.com/tabrindle/envinfo +eonasdan-bootstrap-datetimepicker;https://github.com/eonasdan/bootstrap-datetimepicker +error-ex;https://github.com/qix-/node-error-ex +es-abstract;https://github.com/ljharb/es-abstract +es-module-lexer;https://github.com/guybedford/es-module-lexer +es-set-tostringtag;https://github.com/es-shims/es-set-tostringtag +es-shim-unscopables;https://github.com/ljharb/es-shim-unscopables +es-to-primitive;https://github.com/ljharb/es-to-primitive +es6-promise;https://github.com/stefanpenner/es6-promise +escalade;https://github.com/lukeed/escalade +escape-string-regexp;https://github.com/sindresorhus/escape-string-regexp +escodegen;ssh://git@github.com/estools/escodegen +eslint;https://github.com/eslint/eslint +eslint-config-airbnb;https://github.com/airbnb/javascript +eslint-config-airbnb-base;https://github.com/airbnb/javascript +eslint-config-airbnb-typescript;https://github.com/iamturns/eslint-config-airbnb-typescript +eslint-config-prettier;https://github.com/prettier/eslint-config-prettier +eslint-import-resolver-node;https://github.com/import-js/eslint-plugin-import +eslint-module-utils;https://github.com/import-js/eslint-plugin-import +eslint-plugin-es;https://github.com/mysticatea/eslint-plugin-es +eslint-plugin-html;https://github.com/BenoitZugmeyer/eslint-plugin-html +eslint-plugin-import;https://github.com/import-js/eslint-plugin-import +eslint-plugin-jsx-a11y;https://github.com/jsx-eslint/eslint-plugin-jsx-a11y +eslint-plugin-node;https://github.com/mysticatea/eslint-plugin-node +eslint-plugin-promise;https://github.com/xjamundx/eslint-plugin-promise +eslint-plugin-react;https://github.com/jsx-eslint/eslint-plugin-react +eslint-plugin-react-hooks;https://github.com/facebook/react +eslint-plugin-standard;https://github.com/standard/eslint-plugin-standard +eslint-scope;https://github.com/eslint/eslint-scope +eslint-utils;https://github.com/mysticatea/eslint-utils +eslint-visitor-keys;https://github.com/eslint/eslint-visitor-keys +espree;https://github.com/eslint/espree +esprima;https://github.com/jquery/esprima +esquery;https://github.com/estools/esquery +esrecurse;https://github.com/estools/esrecurse +estraverse;ssh://git@github.com/estools/estraverse +esutils;ssh://git@github.com/estools/esutils +eventemitter3;https://github.com/primus/eventemitter3 +eventlet;https://raw.githubusercontent.com/eventlet/eventlet/master/LICENSE +events;https://github.com/Gozala/events +exceptiongroup;https://raw.githubusercontent.com/agronholm/exceptiongroup/master/LICENSE +execa;https://github.com/sindresorhus/execa +exit;https://raw.githubusercontent.com/cowboy/node-exit/master/LICENSE-MIT +expect;https://github.com/facebook/jest +extend;https://github.com/justmoon/node-extend +fast-deep-equal;https://github.com/epoberezkin/fast-deep-equal +fast-glob;https://github.com/mrmlnc/fast-glob +fast-json-stable-stringify;https://github.com/epoberezkin/fast-json-stable-stringify +fast-levenshtein;https://github.com/hiddentao/fast-levenshtein +fast-safe-stringify;https://github.com/davidmarkclements/fast-safe-stringify +fastest-levenshtein;https://github.com/ka-weihe/fastest-levenshtein +fastq;https://github.com/mcollina/fastq +fault;https://github.com/wooorm/fault +fb-watchman;git@github.com:facebook/watchman +fbemitter;https://github.com/facebook/emitter +fbjs;https://raw.githubusercontent.com/facebook/fbjs/master/LICENSE +fbjs-css-vars;https://github.com/facebook/fbjs +file-entry-cache;https://github.com/royriojas/file-entry-cache +file-loader;https://github.com/webpack-contrib/file-loader +filelock;https://raw.githubusercontent.com/tox-dev/py-filelock/master/LICENSE +fill-range;https://github.com/jonschlinkert/fill-range +find-cache-dir;https://github.com/avajs/find-cache-dir +find-root;ssh://git@github.com/js-n/find-root +find-up;https://github.com/sindresorhus/find-up +flat-cache;https://github.com/royriojas/flat-cache +flatted;https://github.com/WebReflection/flatted +flower;https://raw.githubusercontent.com/mher/flower/master/LICENSE +flux;https://raw.githubusercontent.com/facebook/flux/master/LICENSE +focus-lock;https://github.com/theKashey/focus-lock +follow-redirects;ssh://git@github.com/follow-redirects/follow-redirects +for-each;https://github.com/Raynos/for-each +foreach;https://github.com/manuelstofer/foreach +form-data;https://github.com/form-data/form-data +format;https://raw.githubusercontent.com/samsonjs/format/main/License.md +framer-motion;https://github.com/framer/motion +framesync;https://github.com/Popmotion/popmotion +frozenlist;https://raw.githubusercontent.com/aio-libs/frozenlist/master/LICENSE +fs-minipass;https://github.com/npm/fs-minipass +fs.realpath;https://github.com/isaacs/fs.realpath +fsevents;https://github.com/fsevents/fsevents +fsspec;https://raw.githubusercontent.com/fsspec/filesystem_spec/master/LICENSE +function-bind;https://github.com/Raynos/function-bind +function.prototype.name;https://github.com/es-shims/Function.prototype.name +functional-red-black-tree;https://github.com/mikolalysenko/functional-red-black-tree +functions-have-names;https://github.com/inspect-js/functions-have-names +gcloud-aio-auth;https://github.com/talkiq/gcloud-aio +gcloud-aio-bigquery;https://github.com/talkiq/gcloud-aio +gcloud-aio-storage;https://github.com/talkiq/gcloud-aio +gcsfs;https://raw.githubusercontent.com/fsspec/gcsfs/main/LICENSE.txt +gensync;https://github.com/loganfsmyth/gensync +get-caller-file;https://github.com/stefanpenner/get-caller-file +get-intrinsic;https://github.com/ljharb/get-intrinsic +get-nonce;ssh://git@github.com/theKashey/get-nonce +get-npm-tarball-url;https://github.com/pnpm/get-npm-tarball-url +get-package-type;https://github.com/cfware/get-package-type +get-stream;https://github.com/sindresorhus/get-stream +get-symbol-description;https://github.com/inspect-js/get-symbol-description +gevent;https://raw.githubusercontent.com/gevent/gevent/master/LICENSE +github.com_moby_sys_user;https://raw.githubusercontent.com/moby/sys/master/LICENSE +github.com_tianon_gosu;https://raw.githubusercontent.com/tianon/gosu/master/LICENSE +glob;https://github.com/isaacs/node-glob +glob-parent;https://github.com/gulpjs/glob-parent +glob-to-regexp;https://github.com/fitzgen/glob-to-regexp +global-modules;https://github.com/jonschlinkert/global-modules +global-prefix;https://github.com/jonschlinkert/global-prefix +globals;https://github.com/sindresorhus/globals +globalthis;https://github.com/ljharb/System.global +globalyzer;https://github.com/terkelg/globalyzer +globby;https://github.com/sindresorhus/globby +globjoin;https://github.com/amobiz/globjoin +globrex;https://github.com/terkelg/globrex +golang.org_x_sys;https://go.googlesource.com/sys +google-ads;https://raw.githubusercontent.com/googleads/google-ads-python/master/LICENSE +google-analytics-admin;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-api-core;https://raw.githubusercontent.com/googleapis/python-api-core/master/LICENSE +google-api-python-client;https://raw.githubusercontent.com/googleapis/google-api-python-client/master/LICENSE +google-auth;https://raw.githubusercontent.com/googleapis/google-auth-library-python/master/LICENSE +google-auth-httplib2;https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2 +google-auth-oauthlib;https://raw.githubusercontent.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/master/LICENSE +google-cloud-aiplatform;https://raw.githubusercontent.com/googleapis/python-aiplatform/master/LICENSE +google-cloud-appengine-logging;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-audit-log;https://raw.githubusercontent.com/googleapis/python-audit-log/master/LICENSE +google-cloud-automl;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-batch;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-bigquery;https://raw.githubusercontent.com/googleapis/python-bigquery/master/LICENSE +google-cloud-bigquery-datatransfer;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-bigquery-storage;https://raw.githubusercontent.com/googleapis/python-bigquery-storage/master/LICENSE +google-cloud-bigtable;https://raw.githubusercontent.com/googleapis/python-bigtable/master/LICENSE +google-cloud-build;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-compute;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-container;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-core;https://raw.githubusercontent.com/googleapis/python-cloud-core/master/LICENSE +google-cloud-datacatalog;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataflow-client;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataform;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataplex;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataproc;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dataproc-metastore;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-dlp;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-kms;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-language;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-logging;https://raw.githubusercontent.com/googleapis/python-logging/master/LICENSE +google-cloud-memcache;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-monitoring;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-orchestration-airflow;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-os-login;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-pubsub;https://raw.githubusercontent.com/googleapis/python-pubsub/master/LICENSE +google-cloud-redis;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-resource-manager;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-run;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-secret-manager;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-spanner;https://raw.githubusercontent.com/googleapis/python-spanner/master/LICENSE +google-cloud-speech;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-storage;https://raw.githubusercontent.com/googleapis/python-storage/master/LICENSE +google-cloud-storage-transfer;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-tasks;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-texttospeech;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-translate;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-videointelligence;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-vision;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-cloud-workflows;https://raw.githubusercontent.com/googleapis/google-cloud-python/master/LICENSE +google-crc32c;https://github.com/googleapis/python-crc32c +google-re2;https://raw.githubusercontent.com/google/re2/main/LICENSE +google-resumable-media;https://raw.githubusercontent.com/googleapis/google-resumable-media-python/master/LICENSE +googleapis-common-protos;https://raw.githubusercontent.com/googleapis/python-api-common-protos/master/LICENSE +gopd;https://github.com/ljharb/gopd +graceful-fs;https://github.com/isaacs/node-graceful-fs +graphlib;https://github.com/dagrejs/graphlib +greenlet;https://raw.githubusercontent.com/python-greenlet/greenlet/master/LICENSE +grpc-google-iam-v1;https://github.com/googleapis/python-grpc-google-iam-v1 +grpc-interceptor;https://github.com/d5h-foss/grpc-interceptor +grpcio;https://raw.githubusercontent.com/grpc/grpc/master/LICENSE +grpcio-gcp;https://raw.githubusercontent.com/GoogleCloudPlatform/grpc-gcp-python/master/LICENSE +grpcio-status;https://pypi.org/project/grpcio-status/ +gunicorn;https://raw.githubusercontent.com/benoitc/gunicorn/master/LICENSE +h11;https://github.com/python-hyper/h11 +hard-rejection;https://github.com/sindresorhus/hard-rejection +has;https://github.com/tarruda/has +has-bigints;https://github.com/ljharb/has-bigints +has-flag;https://github.com/sindresorhus/has-flag +has-property-descriptors;https://github.com/inspect-js/has-property-descriptors +has-proto;https://github.com/inspect-js/has-proto +has-symbols;https://github.com/inspect-js/has-symbols +has-tostringtag;https://github.com/inspect-js/has-tostringtag +hast-util-parse-selector;https://github.com/syntax-tree/hast-util-parse-selector +hast-util-whitespace;https://github.com/syntax-tree/hast-util-whitespace +hastscript;https://github.com/syntax-tree/hastscript +hey-listen;https://github.com/Popmotion/hey-listen +highlight.js;https://github.com/highlightjs/highlight.js +history;https://github.com/remix-run/history +hoist-non-react-statics;https://github.com/mridgway/hoist-non-react-statics +hosted-git-info;https://github.com/npm/hosted-git-info +html-encoding-sniffer;https://github.com/jsdom/html-encoding-sniffer +html-escaper;https://github.com/WebReflection/html-escaper +html-tags;https://github.com/sindresorhus/html-tags +htmlparser2;https://github.com/fb55/htmlparser2 +http-proxy-agent;https://github.com/TooTallNate/node-http-proxy-agent +http2-client;https://github.com/hisco/http2-client +httpcore;https://raw.githubusercontent.com/encode/httpcore/master/LICENSE.md +httplib2;https://github.com/httplib2/httplib2 +https-proxy-agent;https://github.com/TooTallNate/node-https-proxy-agent +httpx;https://raw.githubusercontent.com/encode/httpx/master/LICENSE.md +human-signals;https://github.com/ehmicky/human-signals +humanize;https://github.com/python-humanize/humanize +hvac;https://github.com/hvac/hvac +iconv-lite;https://github.com/ashtuchkin/iconv-lite +icss-utils;https://github.com/css-modules/icss-utils +idna;https://raw.githubusercontent.com/kjd/idna/master/LICENSE.md +ignore;ssh://git@github.com/kaelzhang/node-ignore +import-fresh;https://github.com/sindresorhus/import-fresh +import-lazy;https://github.com/sindresorhus/import-lazy +import-local;https://github.com/sindresorhus/import-local +importlib-metadata;https://raw.githubusercontent.com/python/importlib_metadata/master/LICENSE +importlib-resources;https://raw.githubusercontent.com/python/importlib_resources/master/LICENSE +imports-loader;https://github.com/webpack-contrib/imports-loader +imurmurhash;https://raw.githubusercontent.com/jensyt/imurmurhash-js/master/LICENSE +indent-string;https://github.com/sindresorhus/indent-string +infer-owner;https://github.com/npm/infer-owner +inflection;https://raw.githubusercontent.com/jpvanhal/inflection/master/LICENSE +inflight;https://github.com/npm/inflight +inherits;https://github.com/isaacs/inherits +ini;https://github.com/isaacs/ini +inline-style-parser;https://github.com/remarkablemark/inline-style-parser +internal-slot;https://github.com/ljharb/internal-slot +internmap;https://github.com/mbostock/internmap +interpret;https://github.com/gulpjs/interpret +invariant;https://github.com/zertosh/invariant +is-alphabetical;https://github.com/wooorm/is-alphabetical +is-alphanumerical;https://github.com/wooorm/is-alphanumerical +is-array-buffer;https://github.com/inspect-js/is-array-buffer +is-arrayish;https://github.com/qix-/node-is-arrayish +is-bigint;https://github.com/inspect-js/is-bigint +is-boolean-object;https://github.com/inspect-js/is-boolean-object +is-buffer;https://github.com/feross/is-buffer +is-callable;https://github.com/ljharb/is-callable +is-callable;https://github.com/inspect-js/is-callable +is-core-module;https://github.com/inspect-js/is-core-module +is-date-object;https://github.com/inspect-js/is-date-object +is-decimal;https://github.com/wooorm/is-decimal +is-extglob;https://github.com/jonschlinkert/is-extglob +is-fullwidth-code-point;https://github.com/sindresorhus/is-fullwidth-code-point +is-generator-fn;https://github.com/sindresorhus/is-generator-fn +is-glob;https://github.com/micromatch/is-glob +is-hexadecimal;https://github.com/wooorm/is-hexadecimal +is-negative-zero;https://github.com/inspect-js/is-negative-zero +is-number;https://github.com/jonschlinkert/is-number +is-number-object;https://github.com/inspect-js/is-number-object +is-path-cwd;https://github.com/sindresorhus/is-path-cwd +is-path-in-cwd;https://github.com/sindresorhus/is-path-in-cwd +is-path-inside;https://github.com/sindresorhus/is-path-inside +is-plain-obj;https://github.com/sindresorhus/is-plain-obj +is-plain-object;https://github.com/jonschlinkert/is-plain-object +is-plain-object;https://raw.githubusercontent.com/jonschlinkert/is-plain-object/master/LICENSE +is-potential-custom-element-name;https://github.com/mathiasbynens/is-potential-custom-element-name +is-regex;https://github.com/inspect-js/is-regex +is-shared-array-buffer;https://github.com/inspect-js/is-shared-array-buffer +is-stream;https://github.com/sindresorhus/is-stream +is-string;https://github.com/ljharb/is-string +is-symbol;https://github.com/inspect-js/is-symbol +is-typed-array;https://github.com/inspect-js/is-typed-array +is-typedarray;https://github.com/hughsk/is-typedarray +is-weakref;https://github.com/inspect-js/is-weakref +isarray;https://github.com/juliangruber/isarray +isexe;https://github.com/isaacs/isexe +isobject;https://github.com/jonschlinkert/isobject +istanbul-lib-coverage;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-lib-instrument;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-lib-report;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-lib-source-maps;ssh://git@github.com/istanbuljs/istanbuljs +istanbul-reports;ssh://git@github.com/istanbuljs/istanbuljs +itsdangerous;https://raw.githubusercontent.com/pallets/itsdangerous/master/LICENSE.rst +jest;https://github.com/facebook/jest +jest-canvas-mock;https://github.com/hustcc/jest-canvas-mock +jest-changed-files;https://github.com/facebook/jest +jest-circus;https://github.com/facebook/jest +jest-cli;https://github.com/facebook/jest +jest-config;https://github.com/facebook/jest +jest-diff;https://github.com/facebook/jest +jest-docblock;https://github.com/facebook/jest +jest-each;https://github.com/facebook/jest +jest-environment-jsdom;https://github.com/facebook/jest +jest-environment-node;https://github.com/facebook/jest +jest-get-type;https://github.com/facebook/jest +jest-haste-map;https://github.com/facebook/jest +jest-jasmine2;https://github.com/facebook/jest +jest-leak-detector;https://github.com/facebook/jest +jest-matcher-utils;https://github.com/facebook/jest +jest-message-util;https://github.com/facebook/jest +jest-mock;https://github.com/facebook/jest +jest-pnp-resolver;https://github.com/arcanis/jest-pnp-resolver +jest-regex-util;https://github.com/facebook/jest +jest-resolve;https://github.com/facebook/jest +jest-resolve-dependencies;https://github.com/facebook/jest +jest-runner;https://github.com/facebook/jest +jest-runtime;https://github.com/facebook/jest +jest-serializer;https://github.com/facebook/jest +jest-snapshot;https://github.com/facebook/jest +jest-util;https://github.com/facebook/jest +jest-validate;https://github.com/facebook/jest +jest-watcher;https://github.com/facebook/jest +jest-worker;https://github.com/facebook/jest +jmespath;https://github.com/jmespath/jmespath.py +jquery;https://github.com/jquery/jquery +js-levenshtein;https://github.com/gustf/js-levenshtein +js-sha3;https://github.com/emn178/js-sha3 +js-tokens;https://github.com/lydell/js-tokens +js-yaml;https://github.com/nodeca/js-yaml +jsdom;https://github.com/jsdom/jsdom +jsesc;https://github.com/mathiasbynens/jsesc +jshint;https://github.com/jshint/jshint +json-merge-patch;https://raw.githubusercontent.com/open-contracting/json-merge-patch/master/LICENSE +json-parse-even-better-errors;https://github.com/npm/json-parse-even-better-errors +json-pointer;https://github.com/manuelstofer/json-pointer +json-schema-traverse;https://github.com/epoberezkin/json-schema-traverse +json-stable-stringify-without-jsonify;https://github.com/samn/json-stable-stringify +json-stringify-safe;https://github.com/isaacs/json-stringify-safe +json5;https://github.com/json5/json5 +jsonpath-ng;https://github.com/h2non/jsonpath-ng +jsonschema;https://github.com/python-jsonschema/jsonschema +jsonschema-specifications;https://github.com/python-jsonschema/jsonschema-specifications +jsx-ast-utils;https://github.com/jsx-eslint/jsx-ast-utils +kind-of;https://github.com/jonschlinkert/kind-of +kleur;https://github.com/lukeed/kleur +known-css-properties;https://github.com/known-css/known-css-properties +kombu;https://raw.githubusercontent.com/celery/kombu/master/LICENSE +language-subtag-registry;https://raw.githubusercontent.com/mattcg/language-subtag-registry/master/README.md +language-tags;https://github.com/mattcg/language-tags +lazy-object-proxy;https://raw.githubusercontent.com/ionelmc/python-lazy-object-proxy/master/LICENSE +ldap3;https://github.com/cannatag/ldap3 +leven;https://github.com/sindresorhus/leven +levn;https://github.com/gkz/levn +lilconfig;https://github.com/antonk52/lilconfig +limits;https://github.com/alisaifee/limits +lines-and-columns;https://github.com/eventualbuddha/lines-and-columns +linkify-it-py;https://github.com/tsutsu3/linkify-it-py +loader-runner;https://github.com/webpack/loader-runner +loader-utils;https://github.com/webpack/loader-utils +locate-path;https://github.com/sindresorhus/locate-path +lodash;https://github.com/lodash/lodash +lodash.curry;https://github.com/lodash/lodash +lodash.debounce;https://github.com/lodash/lodash +lodash.difference;https://github.com/lodash/lodash +lodash.flow;https://github.com/lodash/lodash +lodash.isequal;https://github.com/lodash/lodash +lodash.memoize;https://github.com/lodash/lodash +lodash.merge;https://github.com/lodash/lodash +lodash.mergewith;https://github.com/lodash/lodash +lodash.set;https://github.com/lodash/lodash +lodash.truncate;https://github.com/lodash/lodash +lodash.uniq;https://github.com/lodash/lodash +longest-streak;https://github.com/wooorm/longest-streak +looker-sdk;https://raw.githubusercontent.com/looker-open-source/sdk-codegen/main/LICENSE +loose-envify;https://github.com/zertosh/loose-envify +lowlight;https://github.com/wooorm/lowlight +lru-cache;https://github.com/isaacs/node-lru-cache +lunr;https://github.com/olivernn/lunr.js +lxml;https://github.com/lxml/lxml +lz-string;https://raw.githubusercontent.com/pieroxy/lz-string/master/LICENSE.md +make-dir;https://github.com/sindresorhus/make-dir +makeerror;https://github.com/daaku/nodejs-makeerror +map-obj;https://github.com/sindresorhus/map-obj +mark.js;https://github.com/julmot/mark.js +markdown-it-py;https://raw.githubusercontent.com/executablebooks/markdown-it-py/master/LICENSE +markdown-table;https://github.com/wooorm/markdown-table +marked;https://github.com/markedjs/marked +marshmallow;https://raw.githubusercontent.com/marshmallow-code/marshmallow/master/LICENSE +marshmallow-oneofschema;https://raw.githubusercontent.com/marshmallow-code/marshmallow-oneofschema/master/LICENSE +marshmallow-sqlalchemy;https://raw.githubusercontent.com/marshmallow-code/marshmallow-sqlalchemy/master/LICENSE +match-sorter;https://github.com/kentcdodds/match-sorter +mathml-tag-names;https://github.com/wooorm/mathml-tag-names +mdast-util-definitions;https://github.com/syntax-tree/mdast-util-definitions +mdast-util-find-and-replace;https://github.com/syntax-tree/mdast-util-find-and-replace +mdast-util-from-markdown;https://github.com/syntax-tree/mdast-util-from-markdown +mdast-util-gfm;https://github.com/syntax-tree/mdast-util-gfm +mdast-util-gfm-autolink-literal;https://github.com/syntax-tree/mdast-util-gfm-autolink-literal +mdast-util-gfm-footnote;https://github.com/syntax-tree/mdast-util-gfm-footnote +mdast-util-gfm-strikethrough;https://github.com/syntax-tree/mdast-util-gfm-strikethrough +mdast-util-gfm-table;https://github.com/syntax-tree/mdast-util-gfm-table +mdast-util-gfm-task-list-item;https://github.com/syntax-tree/mdast-util-gfm-task-list-item +mdast-util-to-hast;https://github.com/syntax-tree/mdast-util-to-hast +mdast-util-to-markdown;https://github.com/syntax-tree/mdast-util-to-markdown +mdast-util-to-string;https://github.com/syntax-tree/mdast-util-to-string +mdit-py-plugins;https://raw.githubusercontent.com/executablebooks/mdit-py-plugins/master/LICENSE +mdn-data;https://github.com/mdn/data +mdurl;https://raw.githubusercontent.com/executablebooks/mdurl/master/LICENSE +memoize-one;https://github.com/alexreardon/memoize-one +meow;https://github.com/sindresorhus/meow +merge-stream;https://github.com/grncdr/merge-stream +merge2;ssh://git@github.com/teambition/merge2 +micromark;https://github.com/micromark/micromark.git#main +micromark-core-commonmark;https://github.com/micromark/micromark.git#main +micromark-extension-gfm;https://github.com/micromark/micromark-extension-gfm +micromark-extension-gfm-autolink-literal;https://github.com/micromark/micromark-extension-gfm-autolink-literal +micromark-extension-gfm-footnote;https://github.com/micromark/micromark-extension-gfm-footnote +micromark-extension-gfm-strikethrough;https://github.com/micromark/micromark-extension-gfm-strikethrough +micromark-extension-gfm-table;https://github.com/micromark/micromark-extension-gfm-table +micromark-extension-gfm-tagfilter;https://github.com/micromark/micromark-extension-gfm-tagfilter +micromark-extension-gfm-task-list-item;https://github.com/micromark/micromark-extension-gfm-task-list-item +micromark-factory-destination;https://github.com/micromark/micromark.git#main +micromark-factory-label;https://github.com/micromark/micromark.git#main +micromark-factory-space;https://github.com/micromark/micromark.git#main +micromark-factory-title;https://github.com/micromark/micromark.git#main +micromark-factory-whitespace;https://github.com/micromark/micromark.git#main +micromark-util-character;https://github.com/micromark/micromark.git#main +micromark-util-chunked;https://github.com/micromark/micromark.git#main +micromark-util-classify-character;https://github.com/micromark/micromark.git#main +micromark-util-combine-extensions;https://github.com/micromark/micromark.git#main +micromark-util-decode-numeric-character-reference;https://github.com/micromark/micromark.git#main +micromark-util-decode-string;https://github.com/micromark/micromark.git#main +micromark-util-encode;https://github.com/micromark/micromark.git#main +micromark-util-html-tag-name;https://github.com/micromark/micromark.git#main +micromark-util-normalize-identifier;https://github.com/micromark/micromark.git#main +micromark-util-resolve-all;https://github.com/micromark/micromark.git#main +micromark-util-sanitize-uri;https://github.com/micromark/micromark.git#main +micromark-util-subtokenize;https://github.com/micromark/micromark.git#main +micromark-util-symbol;https://github.com/micromark/micromark.git#main +micromark-util-types;https://github.com/micromark/micromark.git#main +micromatch;https://github.com/micromatch/micromatch +microseconds;https://raw.githubusercontent.com/kamicane/microseconds/master/LICENSE +mime;https://github.com/broofa/mime +mime-db;https://github.com/jshttp/mime-db +mime-types;https://github.com/jshttp/mime-types +mimic-fn;https://github.com/sindresorhus/mimic-fn +min-indent;https://github.com/thejameskyle/min-indent +mini-css-extract-plugin;https://github.com/webpack-contrib/mini-css-extract-plugin +minimatch;https://github.com/isaacs/minimatch +minimist;https://github.com/minimistjs/minimist +minimist-options;https://github.com/vadimdemedes/minimist-options +minipass;https://github.com/isaacs/minipass +minipass-collect;https://github.com/isaacs/minipass-collect +minipass-flush;https://github.com/isaacs/minipass-flush +minipass-pipeline;https://registry.npmjs.org/minipass-pipeline/1.2.4 +minizlib;https://github.com/isaacs/minizlib +mkdirp;https://github.com/isaacs/node-mkdirp +mobx-react;https://github.com/mobxjs/mobx +mobx-react-lite;https://github.com/mobxjs/mobx +moment;https://github.com/moment/moment +moment-locales-webpack-plugin;https://github.com/iamakulov/moment-locales-webpack-plugin +moment-timezone;https://raw.githubusercontent.com/moment/moment-timezone/master/LICENSE +moment-timezone;https://github.com/moment/moment-timezone +moo-color;https://github.com/archco/moo-color +more-itertools;https://raw.githubusercontent.com/more-itertools/more-itertools/master/LICENSE +mri;https://github.com/lukeed/mri +ms;https://github.com/zeit/ms +ms;https://github.com/vercel/ms +multidict;https://raw.githubusercontent.com/aio-libs/multidict/master/LICENSE +mysqlclient;https://raw.githubusercontent.com/PyMySQL/mysqlclient/master/LICENSE +nano-time;https://github.com/sazze/node-nanotime +nanoid;https://github.com/ai/nanoid +natural-compare;https://github.com/litejs/natural-compare-lite +needle;https://github.com/tomas/needle +neo-async;ssh://git@github.com/suguru03/neo-async +nock;https://github.com/nock/nock +node-fetch;https://github.com/bitinn/node-fetch +node-fetch-h2;https://github.com/mikeralphson/node-fetch-h2 +node-int64;https://github.com/broofa/node-int64 +node-modules-regexp;https://github.com/jamestalmage/node-modules-regexp +node-readfiles;https://github.com/guatedude2/node-readfiles +node-releases;https://github.com/chicoxyzzy/node-releases +normalize-package-data;https://github.com/npm/normalize-package-data +normalize-path;https://github.com/jonschlinkert/normalize-path +normalize-registry-url;https://github.com/pnpm/normalize-registry-url +normalize-url;https://github.com/sindresorhus/normalize-url +npm-run-path;https://github.com/sindresorhus/npm-run-path +nth-check;https://github.com/fb55/nth-check +numpy;https://github.com/numpy/numpy +nvd3;https://github.com/novus/nvd3 +nwsapi;https://github.com/dperini/nwsapi +oas-kit-common;https://github.com/Mermade/oas-kit +oas-linter;https://github.com/Mermade/oas-kit +oas-resolver;https://github.com/Mermade/oas-kit +oas-schema-walker;https://github.com/Mermade/oas-kit +oas-validator;https://github.com/Mermade/oas-kit +oauthlib;https://raw.githubusercontent.com/oauthlib/oauthlib/master/LICENSE +object-assign;https://github.com/sindresorhus/object-assign +object-inspect;https://github.com/inspect-js/object-inspect +object-keys;https://github.com/ljharb/object-keys +object.assign;https://github.com/ljharb/object.assign +object.entries;https://github.com/es-shims/Object.entries +object.fromentries;https://github.com/es-shims/Object.fromEntries +object.hasown;https://github.com/es-shims/Object.hasOwn +object.values;https://github.com/es-shims/Object.values +oblivious-set;https://github.com/pubkey/oblivious-set +once;https://github.com/isaacs/once +onetime;https://github.com/sindresorhus/onetime +openapi-sampler;https://github.com/APIs-guru/openapi-sampler +openapi-typescript;https://github.com/drwpow/openapi-typescript +opentelemetry-api;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp-proto-common;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp-proto-grpc;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-exporter-otlp-proto-http;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-proto;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-sdk;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +opentelemetry-semantic-conventions;https://raw.githubusercontent.com/open-telemetry/opentelemetry-python/master/LICENSE +optionator;https://github.com/gkz/optionator +ordered-set;https://github.com/rspeer/ordered-set +p-limit;https://github.com/sindresorhus/p-limit +p-locate;https://github.com/sindresorhus/p-locate +p-map;https://github.com/sindresorhus/p-map +p-try;https://github.com/sindresorhus/p-try +packaging;https://raw.githubusercontent.com/pypa/packaging/master/LICENSE.APACHE +pandas;https://raw.githubusercontent.com/pandas-dev/pandas/master/LICENSE +pandas-gbq;https://github.com/googleapis/python-bigquery-pandas +paramiko;https://raw.githubusercontent.com/paramiko/paramiko/master/LICENSE +parent-module;https://github.com/sindresorhus/parent-module +parse-entities;https://github.com/wooorm/parse-entities +parse-json;https://github.com/sindresorhus/parse-json +parse5;https://github.com/inikulin/parse5 +path-browserify;https://github.com/browserify/path-browserify +path-exists;https://github.com/sindresorhus/path-exists +path-is-absolute;https://github.com/sindresorhus/path-is-absolute +path-is-inside;https://raw.githubusercontent.com/domenic/path-is-inside/master/LICENSE.txt +path-key;https://github.com/sindresorhus/path-key +path-parse;https://github.com/jbgutierrez/path-parse +path-type;https://github.com/sindresorhus/path-type +pathspec;https://raw.githubusercontent.com/cpburnz/python-pathspec/master/LICENSE +pendulum;https://raw.githubusercontent.com/sdispater/pendulum/master/LICENSE +perfect-scrollbar;https://github.com/mdbootstrap/perfect-scrollbar +picocolors;https://github.com/alexeyraspopov/picocolors +picomatch;https://github.com/micromatch/picomatch +pify;https://github.com/sindresorhus/pify +pinkie;floatdrop/pinkie +pinkie-promise;https://github.com/floatdrop/pinkie-promise +pip;https://github.com/pypa/pip +pirates;https://github.com/ariporad/pirates +pirates;https://github.com/danez/pirates +pkg-dir;https://github.com/sindresorhus/pkg-dir +platformdirs;https://raw.githubusercontent.com/platformdirs/platformdirs/master/LICENSE +pluggy;https://raw.githubusercontent.com/pytest-dev/pluggy/master/LICENSE +pluralize;https://github.com/blakeembrey/pluralize +ply;https://www.dabeaz.com/ply/index.html +polished;https://github.com/styled-components/polished +popmotion;https://github.com/Popmotion/popmotion.git#master +postcss;https://github.com/postcss/postcss +postcss-calc;https://raw.githubusercontent.com/postcss/postcss-calc/master/LICENSE +postcss-colormin;cssnano/cssnano +postcss-convert-values;https://github.com/cssnano/cssnano +postcss-discard-comments;https://github.com/cssnano/cssnano +postcss-discard-duplicates;cssnano/cssnano +postcss-discard-empty;cssnano/cssnano +postcss-discard-overridden;cssnano/cssnano +postcss-merge-longhand;https://github.com/cssnano/cssnano +postcss-merge-rules;https://github.com/cssnano/cssnano +postcss-minify-font-values;cssnano/cssnano +postcss-minify-gradients;cssnano/cssnano +postcss-minify-params;https://github.com/cssnano/cssnano +postcss-minify-selectors;https://github.com/cssnano/cssnano +postcss-modules-extract-imports;https://github.com/css-modules/postcss-modules-extract-imports +postcss-modules-local-by-default;https://github.com/css-modules/postcss-modules-local-by-default +postcss-modules-scope;https://github.com/css-modules/postcss-modules-scope +postcss-modules-values;https://github.com/css-modules/postcss-modules-values +postcss-normalize-charset;cssnano/cssnano +postcss-normalize-display-values;cssnano/cssnano +postcss-normalize-positions;cssnano/cssnano +postcss-normalize-repeat-style;cssnano/cssnano +postcss-normalize-string;cssnano/cssnano +postcss-normalize-timing-functions;cssnano/cssnano +postcss-normalize-unicode;cssnano/cssnano +postcss-normalize-url;cssnano/cssnano +postcss-normalize-whitespace;cssnano/cssnano +postcss-ordered-values;https://github.com/cssnano/cssnano +postcss-reduce-initial;cssnano/cssnano +postcss-reduce-transforms;cssnano/cssnano +postcss-resolve-nested-selector;https://registry.npmjs.org/postcss-resolve-nested-selector/0.1.1 +postcss-safe-parser;https://github.com/postcss/postcss-safe-parser +postcss-selector-parser;https://github.com/postcss/postcss-selector-parser +postcss-svgo;cssnano/cssnano +postcss-unique-selectors;cssnano/cssnano +postcss-value-parser;https://github.com/TrySound/postcss-value-parser +prelude-ls;https://github.com/gkz/prelude-ls +prettier;https://github.com/prettier/prettier +pretty-format;https://github.com/facebook/jest +prismjs;https://github.com/PrismJS/prism +prison;https://raw.githubusercontent.com/betodealmeida/python-rison/master/LICENSE +prometheus_client;https://raw.githubusercontent.com/prometheus/client_python/master/LICENSE +promise;https://github.com/then/promise +promise-inflight;https://github.com/iarna/promise-inflight +prompt-toolkit;https://raw.githubusercontent.com/prompt-toolkit/python-prompt-toolkit/master/LICENSE +prompts;https://github.com/terkelg/prompts +prop-types;https://raw.githubusercontent.com/facebook/prop-types/master/LICENSE +prop-types;https://github.com/facebook/prop-types +propagate;https://github.com/nock/propagate +property-information;https://github.com/wooorm/property-information +proto-plus;https://raw.githubusercontent.com/googleapis/proto-plus-python/master/LICENSE +protobuf;https://raw.githubusercontent.com/protocolbuffers/protobuf/main/LICENSE +proxy-from-env;https://github.com/Rob--W/proxy-from-env +psl;ssh://git@github.com/lupomontero/psl +psutil;https://raw.githubusercontent.com/giampaolo/psutil/master/LICENSE +psycopg2-binary;https://raw.githubusercontent.com/psycopg/psycopg2/master/LICENSE +punycode;https://github.com/bestiejs/punycode.js +pure-color;ssh://git@github.com/WickyNilliams/pure-color +pyOpenSSL;https://raw.githubusercontent.com/pyca/pyopenssl/master/LICENSE +pyarrow;https://github.com/apache/arrow +pyasn1;https://github.com/pyasn1/pyasn1 +pyasn1-modules;https://raw.githubusercontent.com/pyasn1/pyasn1-modules/main/LICENSE.txt +pycparser;https://raw.githubusercontent.com/eliben/pycparser/master/LICENSE +pydata-google-auth;https://raw.githubusercontent.com/pydata/pydata-google-auth/main/LICENSE.txt +pyodbc;https://github.com/mkleehammer/pyodbc +pyparsing;https://raw.githubusercontent.com/pyparsing/pyparsing/master/LICENSE +python-daemon;https://pagure.io/python-daemon/issues +python-dateutil;https://raw.githubusercontent.com/dateutil/dateutil/master/LICENSE +python-dotenv;https://raw.githubusercontent.com/theskumar/python-dotenv/master/LICENSE +python-http-client;https://raw.githubusercontent.com/sendgrid/python-http-client/master/LICENSE +python-ldap;https://raw.githubusercontent.com/python-ldap/python-ldap/main/LICENCE +python-nvd3;https://raw.githubusercontent.com/areski/python-nvd3/develop/LICENSE +python-slugify;https://github.com/un33k/python-slugify +pytz;https://raw.githubusercontent.com/stub42/pytz/master/LICENSE.txt +querystringify;https://github.com/unshiftio/querystringify +queue-microtask;https://github.com/feross/queue-microtask +quick-lru;https://github.com/sindresorhus/quick-lru +randombytes;ssh://git@github.com/crypto-browserify/randombytes +react;https://github.com/facebook/react +react-base16-styling;https://github.com/alexkuz/react-base16-styling +react-clientside-effect;https://github.com/thekashey/react-clientside-effect +react-dom;https://github.com/facebook/react +react-fast-compare;https://github.com/FormidableLabs/react-fast-compare +react-focus-lock;https://github.com/theKashey/react-focus-lock +react-icons;ssh://git@github.com/react-icons/react-icons +react-is;https://github.com/facebook/react +react-json-view;https://github.com/mac-s-g/react-json-view +react-lifecycles-compat;https://github.com/reactjs/react-lifecycles-compat +react-markdown;https://github.com/remarkjs/react-markdown +react-query;https://github.com/tannerlinsley/react-query +react-remove-scroll;https://github.com/theKashey/react-remove-scroll +react-remove-scroll-bar;https://github.com/theKashey/react-remove-scroll-bar +react-router;https://github.com/remix-run/react-router +react-router-dom;https://github.com/remix-run/react-router +react-select;https://raw.githubusercontent.com/JedWatson/react-select/master/LICENSE +react-style-singleton;https://github.com/theKashey/react-style-singleton#readme +react-syntax-highlighter;https://github.com/react-syntax-highlighter/react-syntax-highlighter +react-table;https://raw.githubusercontent.com/tannerlinsley/react-table/master/LICENSE +react-tabs;https://github.com/reactjs/react-tabs +react-textarea-autosize;https://github.com/Andarist/react-textarea-autosize +react-transition-group;https://github.com/reactjs/react-transition-group +reactflow;https://raw.githubusercontent.com/wbkd/react-flow/master/LICENSE +read-pkg;https://github.com/sindresorhus/read-pkg +read-pkg-up;https://github.com/sindresorhus/read-pkg-up +readable-stream;https://github.com/isaacs/readable-stream +rechoir;https://github.com/gulpjs/rechoir +redent;https://github.com/sindresorhus/redent +redis;https://raw.githubusercontent.com/redis/redis-py/master/LICENSE +redoc;https://github.com/Redocly/redoc +redshift-connector;https://raw.githubusercontent.com/aws/amazon-redshift-python-driver/master/LICENSE +referencing;https://github.com/python-jsonschema/referencing +refractor;https://github.com/wooorm/refractor +reftools;https://github.com/Mermade/oas-kit +regenerate;https://github.com/mathiasbynens/regenerate +regenerate-unicode-properties;https://github.com/mathiasbynens/regenerate-unicode-properties +regenerator-runtime;https://github.com/facebook/regenerator.git#main +regenerator-runtime;https://raw.githubusercontent.com/facebook/regenerator/master/LICENSE +regenerator-transform;https://raw.githubusercontent.com/facebook/regenerator/master/LICENSE +regexp.prototype.flags;https://github.com/es-shims/RegExp.prototype.flags +regexpp;https://github.com/mysticatea/regexpp +regexpu-core;https://github.com/mathiasbynens/regexpu-core +regjsgen;https://github.com/bnjmnt4n/regjsgen +regjsparser;ssh://git@github.com/jviereck/regjsparser +remark-gfm;https://github.com/remarkjs/remark-gfm +remark-parse;https://github.com/remarkjs/remark.git#main +remark-rehype;https://github.com/remarkjs/remark-rehype +remove-accents;https://github.com/tyxla/remove-accents +requests;https://raw.githubusercontent.com/psf/requests/master/LICENSE +requests-oauthlib;https://raw.githubusercontent.com/requests/requests-oauthlib/master/LICENSE +requests-toolbelt;https://raw.githubusercontent.com/requests/toolbelt/master/LICENSE +require-directory;https://github.com/troygoode/node-require-directory +require-from-string;https://github.com/floatdrop/require-from-string +requires-port;https://github.com/unshiftio/requires-port +resolve;https://github.com/browserify/resolve +resolve-cwd;https://github.com/sindresorhus/resolve-cwd +resolve-from;https://github.com/sindresorhus/resolve-from +resolve.exports;https://github.com/lukeed/resolve.exports +reusify;https://github.com/mcollina/reusify +rfc3339-validator;https://github.com/naimetti/rfc3339-validator +rfc3986;https://raw.githubusercontent.com/python-hyper/rfc3986/main/LICENSE +rich;https://raw.githubusercontent.com/Textualize/rich/master/LICENSE +rich-argparse;https://raw.githubusercontent.com/hamdanal/rich-argparse/master/LICENSE +rimraf;https://github.com/isaacs/rimraf +rpds-py;https://raw.githubusercontent.com/crate-py/rpds/master/LICENSE +rsa;https://raw.githubusercontent.com/sybrenstuvel/python-rsa/master/LICENSE +run-parallel;https://github.com/feross/run-parallel +rw;ssh://git@github.com/mbostock/rw +s3transfer;https://github.com/boto/s3transfer +sade;https://github.com/lukeed/sade +safe-buffer;https://github.com/feross/safe-buffer +safe-regex-test;https://github.com/ljharb/safe-regex-test +safer-buffer;https://github.com/ChALkeR/safer-buffer +sax;https://github.com/isaacs/sax-js +saxes;https://github.com/lddubeau/saxes +scheduler;https://github.com/facebook/react +schema-utils;https://github.com/webpack/schema-utils +scramp;https://raw.githubusercontent.com/tlocke/scramp/master/LICENSE +semver;https://github.com/npm/node-semver +sendgrid;https://raw.githubusercontent.com/sendgrid/sendgrid-python/master/LICENSE +serialize-javascript;https://github.com/yahoo/serialize-javascript +setimmediate;https://github.com/yuzujs/setImmediate +setproctitle;https://github.com/dvarrazzo/py-setproctitle +setuptools;https://raw.githubusercontent.com/pypa/setuptools/master/LICENSE +shallow-clone;https://github.com/jonschlinkert/shallow-clone +shapely;https://github.com/shapely/shapely +shebang-command;https://github.com/kevva/shebang-command +shebang-regex;https://github.com/sindresorhus/shebang-regex +should;https://github.com/shouldjs/should.js +should-equal;https://github.com/shouldjs/equal +should-format;https://github.com/shouldjs/format +should-type;https://github.com/shouldjs/type +should-type-adaptors;https://github.com/shouldjs/type-adaptors +should-util;https://github.com/shouldjs/util +side-channel;https://github.com/ljharb/side-channel +signal-exit;https://github.com/tapjs/signal-exit +simple-swizzle;https://github.com/qix-/node-simple-swizzle +sisteransi;https://github.com/terkelg/sisteransi +six;https://raw.githubusercontent.com/benjaminp/six/master/LICENSE +slack_sdk;https://raw.githubusercontent.com/slackapi/python-slack-sdk/master/LICENSE +slash;https://github.com/sindresorhus/slash +slice-ansi;https://github.com/chalk/slice-ansi +slugify;https://github.com/simov/slugify +sniffio;https://raw.githubusercontent.com/python-trio/sniffio/master/LICENSE.APACHE2 +soupsieve;https://raw.githubusercontent.com/facelessuser/soupsieve/master/LICENSE.md +source-list-map;https://github.com/webpack/source-list-map +source-map;ssh://git@github.com/mozilla/source-map +source-map-js;https://github.com/7rulnik/source-map-js +source-map-resolve;https://github.com/lydell/source-map-resolve +source-map-support;https://github.com/evanw/node-source-map-support +space-separated-tokens;https://github.com/wooorm/space-separated-tokens +spdx-correct;https://github.com/jslicense/spdx-correct.js +spdx-exceptions;https://github.com/kemitchell/spdx-exceptions.json +spdx-expression-parse;https://github.com/jslicense/spdx-expression-parse.js +spdx-expression-validate;https://raw.githubusercontent.com/jslicense/spdx-expression-validate.js/master/LICENSE +spdx-license-ids;https://github.com/jslicense/spdx-license-ids +sprintf-js;https://github.com/alexei/sprintf.js +sqlalchemy-bigquery;https://raw.githubusercontent.com/googleapis/python-bigquery-sqlalchemy/master/LICENSE +sqlalchemy-redshift;https://raw.githubusercontent.com/sqlalchemy-redshift/sqlalchemy-redshift/master/LICENSE +sqlalchemy-spanner;https://raw.githubusercontent.com/cloudspannerecosystem/python-spanner-sqlalchemy/master/LICENSE +sqlparse;https://raw.githubusercontent.com/andialbrecht/sqlparse/master/LICENSE +sshtunnel;https://raw.githubusercontent.com/pahaz/sshtunnel/master/LICENSE +ssri;https://github.com/npm/ssri +stable;https://github.com/Two-Screen/stable +stack-utils;https://github.com/tapjs/stack-utils +starkbank-ecdsa;https://raw.githubusercontent.com/starkbank/ecdsa-python/master/LICENSE +statsd;https://raw.githubusercontent.com/jsocol/pystatsd/master/LICENSE +stickyfill;https://raw.githubusercontent.com/webmodules/stickyfill/master/LICENSE +string-length;https://github.com/sindresorhus/string-length +string-width;https://github.com/sindresorhus/string-width +string.prototype.matchall;https://github.com/es-shims/String.prototype.matchAll +string.prototype.trim;https://github.com/es-shims/String.prototype.trim +string.prototype.trimend;https://github.com/es-shims/String.prototype.trimEnd +string.prototype.trimstart;https://github.com/es-shims/String.prototype.trimStart +string_decoder;https://github.com/rvagg/string_decoder +strip-ansi;https://github.com/chalk/strip-ansi +strip-bom;https://github.com/sindresorhus/strip-bom +strip-comments;https://github.com/jonschlinkert/strip-comments +strip-final-newline;https://github.com/sindresorhus/strip-final-newline +strip-indent;https://github.com/sindresorhus/strip-indent +strip-json-comments;https://github.com/sindresorhus/strip-json-comments +style-loader;https://github.com/webpack-contrib/style-loader +style-search;https://github.com/davidtheclark/style-search +style-to-object;https://github.com/remarkablemark/style-to-object +style-value-types;https://github.com/Popmotion/popmotion.git#master +stylehacks;cssnano/cssnano +stylelint;https://github.com/stylelint/stylelint +stylelint-config-prettier;https://github.com/prettier/stylelint-config-prettier +stylelint-config-recommended;https://github.com/stylelint/stylelint-config-recommended +stylelint-config-standard;https://github.com/stylelint/stylelint-config-standard +stylis;https://github.com/thysultan/stylis.js +supports-color;https://github.com/chalk/supports-color +supports-hyperlinks;https://github.com/jamestalmage/supports-hyperlinks +supports-preserve-symlinks-flag;https://github.com/inspect-js/node-supports-preserve-symlinks-flag +svg-tags;https://raw.githubusercontent.com/element-io/svg-tags/master/LICENSE +svgo;https://github.com/svg/svgo +swagger-ui-dist;ssh://git@github.com/swagger-api/swagger-ui +swagger2openapi;https://github.com/Mermade/oas-kit +symbol-tree;https://github.com/jsdom/js-symbol-tree +table;https://github.com/gajus/table +tabulate;https://raw.githubusercontent.com/astanin/python-tabulate/master/LICENSE +tapable;ssh://git@github.com/webpack/tapable +tar;https://github.com/npm/node-tar +tenacity;https://raw.githubusercontent.com/jd/tenacity/master/LICENSE +termcolor;https://github.com/termcolor/termcolor +terminal-link;https://github.com/sindresorhus/terminal-link +terser;https://github.com/terser/terser +terser-webpack-plugin;https://github.com/webpack-contrib/terser-webpack-plugin +test-exclude;https://github.com/istanbuljs/test-exclude +text-table;https://github.com/substack/text-table +text-unidecode;https://raw.githubusercontent.com/kmike/text-unidecode/master/LICENSE +throat;https://github.com/ForbesLindesay/throat +time-machine;https://raw.githubusercontent.com/adamchainz/time-machine/master/LICENSE +tiny-glob;https://github.com/terkelg/tiny-glob +tiny-invariant;https://github.com/alexreardon/tiny-invariant +tmpl;https://github.com/daaku/nodejs-tmpl +to-fast-properties;https://github.com/sindresorhus/to-fast-properties +to-regex-range;https://github.com/micromatch/to-regex-range +toggle-selection;https://github.com/sudodoki/toggle-selection +tornado;https://raw.githubusercontent.com/tornadoweb/tornado/master/LICENSE +tough-cookie;https://github.com/salesforce/tough-cookie +tr46;https://github.com/Sebmaster/tr46.js +tr46;https://github.com/jsdom/tr46 +trim-lines;https://github.com/wooorm/trim-lines +trim-newlines;https://github.com/sindresorhus/trim-newlines +trough;https://github.com/wooorm/trough +tsconfig-paths;https://raw.githubusercontent.com/dividab/tsconfig-paths/master/LICENSE +tslib;https://github.com/Microsoft/tslib +tsutils;https://github.com/ajafff/tsutils +type-check;https://github.com/gkz/type-check +type-detect;ssh://git@github.com/chaijs/type-detect +type-fest;https://raw.githubusercontent.com/sindresorhus/type-fest/main/license-mit +typed-array-length;https://github.com/inspect-js/typed-array-length +typedarray-to-buffer;https://github.com/feross/typedarray-to-buffer +typescript;https://github.com/Microsoft/TypeScript +typing_extensions;https://raw.githubusercontent.com/python/typing_extensions/master/LICENSE +tzdata;https://raw.githubusercontent.com/python/tzdata/master/LICENSE +ua-parser-js;https://github.com/faisalman/ua-parser-js +uc-micro-py;https://github.com/tsutsu3/uc.micro-py +unbox-primitive;https://github.com/ljharb/unbox-primitive +undici;https://github.com/nodejs/undici +unicode-canonical-property-names-ecmascript;https://github.com/mathiasbynens/unicode-canonical-property-names-ecmascript +unicode-match-property-ecmascript;https://github.com/mathiasbynens/unicode-match-property-ecmascript +unicode-match-property-value-ecmascript;https://github.com/mathiasbynens/unicode-match-property-value-ecmascript +unicode-property-aliases-ecmascript;https://github.com/mathiasbynens/unicode-property-aliases-ecmascript +unicodecsv;https://raw.githubusercontent.com/jdunck/python-unicodecsv/master/LICENSE +unified;https://github.com/unifiedjs/unified +unique-filename;https://github.com/iarna/unique-filename +unique-slug;https://github.com/iarna/unique-slug +unist-builder;https://github.com/syntax-tree/unist-builder +unist-util-generated;https://github.com/syntax-tree/unist-util-generated +unist-util-is;https://github.com/syntax-tree/unist-util-is +unist-util-position;https://github.com/syntax-tree/unist-util-position +unist-util-stringify-position;https://github.com/syntax-tree/unist-util-stringify-position +unist-util-visit;https://github.com/syntax-tree/unist-util-visit +unist-util-visit-parents;https://github.com/syntax-tree/unist-util-visit-parents +universal-pathlib;https://raw.githubusercontent.com/fsspec/universal_pathlib/master/LICENSE +universalify;https://github.com/RyanZim/universalify +unload;https://github.com/pubkey/unload +uri-js;ssh://git@github.com/garycourt/uri-js +uritemplate;https://raw.githubusercontent.com/python-hyper/uritemplate/main/LICENSE.APACHE +url-loader;https://github.com/webpack-contrib/url-loader +url-parse;https://github.com/unshiftio/url-parse +url-search-params-polyfill;https://github.com/jerrybendy/url-search-params-polyfill +url-template;https://raw.githubusercontent.com/bramstein/url-template/main/LICENSE +urllib3;https://github.com/urllib3/urllib3 +use-callback-ref;https://github.com/theKashey/use-callback-ref +use-composed-ref;https://github.com/Andarist/use-composed-ref +use-isomorphic-layout-effect;https://github.com/Andarist/use-isomorphic-layout-effect +use-latest;https://github.com/Andarist/use-latest +use-sidecar;https://github.com/theKashey/use-sidecar +use-sync-external-store;https://github.com/facebook/react +util-deprecate;https://github.com/TooTallNate/util-deprecate +uvu;https://github.com/lukeed/uvu +v8-compile-cache;https://github.com/zertosh/v8-compile-cache +v8-to-istanbul;https://github.com/istanbuljs/v8-to-istanbul +validate-npm-package-license;https://github.com/kemitchell/validate-npm-package-license.js +validator;https://github.com/validatorjs/validator.js +vfile;https://github.com/vfile/vfile +vfile-message;https://github.com/vfile/vfile-message +vine;https://raw.githubusercontent.com/celery/vine/master/LICENSE +virtualenv;https://raw.githubusercontent.com/pypa/virtualenv/master/LICENSE +w3c-hr-time;https://github.com/jsdom/w3c-hr-time +w3c-xmlserializer;https://github.com/jsdom/w3c-xmlserializer +walker;https://github.com/daaku/nodejs-walker +watchpack;https://github.com/webpack/watchpack +watchtower;https://raw.githubusercontent.com/kislyuk/watchtower/master/LICENSE +wcwidth;https://raw.githubusercontent.com/jquast/wcwidth/master/LICENSE +web-worker;https://github.com/developit/web-worker +webidl-conversions;https://github.com/jsdom/webidl-conversions +webpack;https://github.com/webpack/webpack +webpack-cli;https://github.com/webpack/webpack-cli +webpack-license-plugin;https://github.com/codepunkt/webpack-license-plugin +webpack-manifest-plugin;https://github.com/shellscape/webpack-manifest-plugin +webpack-merge;https://github.com/survivejs/webpack-merge +webpack-sources;https://github.com/webpack/webpack-sources +whatwg-encoding;https://github.com/jsdom/whatwg-encoding +whatwg-mimetype;https://github.com/jsdom/whatwg-mimetype +whatwg-url;https://github.com/jsdom/whatwg-url +wheel;https://github.com/pypa/wheel +which;https://github.com/isaacs/node-which +which-boxed-primitive;https://github.com/inspect-js/which-boxed-primitive +which-typed-array;https://github.com/inspect-js/which-typed-array +wildcard;https://github.com/DamonOehlman/wildcard +word-wrap;https://github.com/jonschlinkert/word-wrap +wrap-ansi;https://github.com/chalk/wrap-ansi +wrappy;https://github.com/npm/wrappy +wrapt;https://raw.githubusercontent.com/GrahamDumpleton/wrapt/master/LICENSE +write-file-atomic;https://github.com/npm/write-file-atomic +ws;https://github.com/websockets/ws +wsgiref;https://raw.githubusercontent.com/Xowap/wsgiref/b24196886e77a71f17afef164f3644bce06c5382/setup.py +xml-name-validator;https://github.com/jsdom/xml-name-validator +xmlchars;https://github.com/lddubeau/xmlchars +xtend;https://github.com/Raynos/xtend +y18n;https://github.com/yargs/y18n +yallist;https://github.com/isaacs/yallist +yaml;https://github.com/eemeli/yaml +yaml-ast-parser;https://github.com/mulesoft-labs/yaml-ast-parser +yargs;https://github.com/yargs/yargs +yargs-parser;https://github.com/yargs/yargs-parser +yarl;https://raw.githubusercontent.com/aio-libs/yarl/master/LICENSE +yocto-queue;https://github.com/sindresorhus/yocto-queue +zipp;https://raw.githubusercontent.com/jaraco/zipp/master/LICENSE +zope.event;https://github.com/zopefoundation/zope.event +zope.interface;https://github.com/zopefoundation/zope.interface +zrender;https://github.com/ecomfe/zrender +zustand;https://github.com/pmndrs/zustand +zwitch;https://github.com/wooorm/zwitch diff --git a/docker/airflow/2/debian12/2.6/scripts/docker/install_airflow.sh b/docker/airflow/2/debian12/2.6/scripts/docker/install_airflow.sh new file mode 100755 index 0000000000..8a5a909060 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/scripts/docker/install_airflow.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +: "${AIRFLOW_PIP_VERSION:?Should be set}" + +function install_airflow() { + # Remove mysql from extras if client is not going to be installed + if [[ ${INSTALL_MYSQL_CLIENT} != "true" ]]; then + AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/mysql,} + fi + echo + echo "Installing all packages and upgrade if needed" + echo + + # https://airflow.apache.org/docs/apache-airflow/stable/installation/installing-from-pypi.html + # https://github.com/apache/airflow/issues/36883 + set -x + PY_MAJOR_VERSION="$(python3 -V | grep -o -P "\d+\.\d+")" + CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}-fix/constraints-${PY_MAJOR_VERSION}.txt" + + pip install \ + --constraint "${CONSTRAINT_URL}" \ + --upgrade \ + --upgrade-strategy only-if-needed "${AIRFLOW_INSTALLATION_METHOD}[${AIRFLOW_EXTRAS}]==${AIRFLOW_VERSION}" airflow-exporter + pip install apache-airflow-providers-cncf-kubernetes +} + +install_airflow diff --git a/docker/airflow/2/debian12/2.6/scripts/docker/install_mssql.sh b/docker/airflow/2/debian12/2.6/scripts/docker/install_mssql.sh new file mode 100755 index 0000000000..0f378c22e8 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/scripts/docker/install_mssql.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -euo pipefail + +: "${INSTALL_MSSQL_CLIENT:?Should be true or false}" + +function install_mssql_client() { + echo + echo "Installing mssql client" + echo + curl --silent https://packages.microsoft.com/keys/microsoft.asc | apt-key add - >/dev/null 2>&1 + curl --silent https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list + apt-get update -yqq + apt-get upgrade -yqq + ACCEPT_EULA=Y apt-get -yqq install -y --no-install-recommends msodbcsql17 mssql-tools + rm -rf /var/lib/apt/lists/* + apt-get autoremove -yqq --purge + apt-get clean && rm -rf /var/lib/apt/lists/* +} + +# Install MsSQL client from Microsoft repositories +if [[ ${INSTALL_MSSQL_CLIENT:="true"} == "true" ]]; then + install_mssql_client "${@}" +fi diff --git a/docker/airflow/2/debian12/2.6/scripts/docker/install_mysql.sh b/docker/airflow/2/debian12/2.6/scripts/docker/install_mysql.sh new file mode 100755 index 0000000000..9581a6e63a --- /dev/null +++ b/docker/airflow/2/debian12/2.6/scripts/docker/install_mysql.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +set -euo pipefail +declare -a packages + +MYSQL_VERSION="8.0" +readonly MYSQL_VERSION + +: "${INSTALL_MYSQL_CLIENT:?Should be true or false}" + +install_mysql_client() { + echo + echo "Installing mysql client version ${MYSQL_VERSION}" + echo + + if [[ "${1}" == "dev" ]]; then + packages=("libmysqlclient-dev" "mysql-client") + elif [[ "${1}" == "prod" ]]; then + packages=("libmysqlclient21" "mysql-client") + else + echo + echo "Specify either prod or dev" + echo + exit 1 + fi + + local key="B7B3B788A8D3785C" + readonly key + + GNUPGHOME="$(mktemp -d)" + export GNUPGHOME + set +e + for keyserver in $(shuf -e ha.pool.sks-keyservers.net hkp://p80.pool.sks-keyservers.net:80 \ + keyserver.ubuntu.com hkp://keyserver.ubuntu.com:80) + do + gpg --keyserver "${keyserver}" --recv-keys "${key}" 2>&1 && break + done + set -e + gpg --export "${key}" > /etc/apt/trusted.gpg.d/mysql.gpg + gpgconf --kill all + rm -rf "${GNUPGHOME}" + unset GNUPGHOME + echo "deb http://repo.mysql.com/apt/debian/ bookworm mysql-${MYSQL_VERSION}" | tee -a /etc/apt/sources.list.d/mysql.list + apt-get update + apt-get install --no-install-recommends -y "${packages[@]}" + apt-get autoremove -yqq --purge + apt-get clean && rm -rf /var/lib/apt/lists/* +} + +# Install MySQL client from Oracle repositories (Debian installs mariadb) +# But only if it is not disabled +if [[ ${INSTALL_MYSQL_CLIENT:="true"} == "true" ]]; then + install_mysql_client "${@}" +fi diff --git a/docker/airflow/2/debian12/2.6/scripts/docker/install_pip_version.sh b/docker/airflow/2/debian12/2.6/scripts/docker/install_pip_version.sh new file mode 100755 index 0000000000..a254e7f8d6 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/scripts/docker/install_pip_version.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +: "${AIRFLOW_PIP_VERSION:?Should be set}" + +function install_pip_version() { + echo + echo "Installing pip version ${AIRFLOW_PIP_VERSION}" + echo + pip install --disable-pip-version-check --no-cache-dir --upgrade "pip==${AIRFLOW_PIP_VERSION}" + # Usunięto linię tworzącą folder .local/bin, ponieważ może to być zbędne w środowisku wirtualnym +} + +install_pip_version \ No newline at end of file diff --git a/docker/airflow/2/debian12/2.6/scripts/prod/clean-logs.sh b/docker/airflow/2/debian12/2.6/scripts/prod/clean-logs.sh new file mode 100755 index 0000000000..57b6e8b605 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/scripts/prod/clean-logs.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -euo pipefail + +readonly DIRECTORY="${AIRFLOW_HOME:-/usr/local/airflow}" +readonly RETENTION="${AIRFLOW__LOG_RETENTION_DAYS:-15}" + +trap "exit" INT TERM + +readonly EVERY=$((15*60)) + +echo "Cleaning logs every $EVERY seconds" + +while true; do + echo "Trimming airflow logs to ${RETENTION} days." + find "${DIRECTORY}"/logs \ + -type d -name 'lost+found' -prune -o \ + -type f -mtime +"${RETENTION}" -name '*.log' -print0 | \ + xargs -0 rm -f + + seconds=$(( $(date -u +%s) % EVERY)) + (( seconds < 1 )) || sleep $((EVERY - seconds)) +done diff --git a/docker/airflow/2/debian12/2.6/scripts/prod/entrypoint_prod.sh b/docker/airflow/2/debian12/2.6/scripts/prod/entrypoint_prod.sh new file mode 100755 index 0000000000..c4a32075b6 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/scripts/prod/entrypoint_prod.sh @@ -0,0 +1,326 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# Might be empty +AIRFLOW_COMMAND="${1:-}" + +set -euo pipefail + +function run_check_with_retries { + local cmd + cmd="${1}" + local countdown + countdown="${CONNECTION_CHECK_MAX_COUNT}" + + while true + do + set +e + local last_check_result + local res + last_check_result=$(eval "${cmd} 2>&1") + res=$? + set -e + if [[ ${res} == 0 ]]; then + echo + break + else + echo -n "." + countdown=$((countdown-1)) + fi + if [[ ${countdown} == 0 ]]; then + echo + echo "ERROR! Maximum number of retries (${CONNECTION_CHECK_MAX_COUNT}) reached." + echo + echo "Last check result:" + echo "$ ${cmd}" + echo "${last_check_result}" + echo + exit 1 + else + sleep "${CONNECTION_CHECK_SLEEP_TIME}" + fi + done +} + +function run_nc() { + # Checks if it is possible to connect to the host using netcat. + # + # We want to avoid misleading messages and perform only forward lookup of the service IP address. + # Netcat when run without -n performs both forward and reverse lookup and fails if the reverse + # lookup name does not match the original name even if the host is reachable via IP. This happens + # randomly with docker-compose in GitHub Actions. + # Since we are not using reverse lookup elsewhere, we can perform forward lookup in python + # And use the IP in NC and add '-n' switch to disable any DNS use. + # Even if this message might be harmless, it might hide the real reason for the problem + # Which is the long time needed to start some services, seeing this message might be totally misleading + # when you try to analyse the problem, that's why it's best to avoid it, + local host="${1}" + local port="${2}" + local ip + ip=$(python -c "import socket; print(socket.gethostbyname('${host}'))") + nc -zvvn "${ip}" "${port}" +} + + +function wait_for_connection { + # Waits for Connection to the backend specified via URL passed as first parameter + # Detects backend type depending on the URL schema and assigns + # default port numbers if not specified in the URL. + # Then it loops until connection to the host/port specified can be established + # It tries `CONNECTION_CHECK_MAX_COUNT` times and sleeps `CONNECTION_CHECK_SLEEP_TIME` between checks + local connection_url + connection_url="${1}" + local detected_backend + detected_backend=$(python -c "from urllib.parse import urlsplit; import sys; print(urlsplit(sys.argv[1]).scheme)" "${connection_url}") + local detected_host + detected_host=$(python -c "from urllib.parse import urlsplit; import sys; print(urlsplit(sys.argv[1]).hostname)" "${connection_url}") + local detected_port + detected_port=$(python -c "from urllib.parse import urlsplit; import sys; print(urlsplit(sys.argv[1]).port or '')" "${connection_url}") + + echo BACKEND="${BACKEND:=${detected_backend}}" + readonly BACKEND + + if [[ -z "${detected_port=}" ]]; then + if [[ ${BACKEND} == "postgres"* ]]; then + detected_port=5432 + elif [[ ${BACKEND} == "mysql"* ]]; then + detected_port=3306 + elif [[ ${BACKEND} == "mssql"* ]]; then + detected_port=1433 + elif [[ ${BACKEND} == "redis"* ]]; then + detected_port=6379 + elif [[ ${BACKEND} == "amqp"* ]]; then + detected_port=5672 + fi + fi + + detected_host=${detected_host:="localhost"} + + # Allow the DB parameters to be overridden by environment variable + echo DB_HOST="${DB_HOST:=${detected_host}}" + readonly DB_HOST + + echo DB_PORT="${DB_PORT:=${detected_port}}" + readonly DB_PORT + run_check_with_retries "run_nc ${DB_HOST@Q} ${DB_PORT@Q}" +} + +function create_www_user() { + local local_password="" + # Warning: command environment variables (*_CMD) have priority over usual configuration variables + # for configuration parameters that require sensitive information. This is the case for the SQL database + # and the broker backend in this entrypoint script. + if [[ -n "${_AIRFLOW_WWW_USER_PASSWORD_CMD=}" ]]; then + local_password=$(eval "${_AIRFLOW_WWW_USER_PASSWORD_CMD}") + unset _AIRFLOW_WWW_USER_PASSWORD_CMD + elif [[ -n "${_AIRFLOW_WWW_USER_PASSWORD=}" ]]; then + local_password="${_AIRFLOW_WWW_USER_PASSWORD}" + unset _AIRFLOW_WWW_USER_PASSWORD + fi + if [[ -z ${local_password} ]]; then + echo + echo "ERROR! Airflow Admin password not set via _AIRFLOW_WWW_USER_PASSWORD or _AIRFLOW_WWW_USER_PASSWORD_CMD variables!" + echo + exit 1 + fi + + airflow users create \ + --username "${_AIRFLOW_WWW_USER_USERNAME="admin"}" \ + --firstname "${_AIRFLOW_WWW_USER_FIRSTNAME="Airflow"}" \ + --lastname "${_AIRFLOW_WWW_USER_LASTNAME="Admin"}" \ + --email "${_AIRFLOW_WWW_USER_EMAIL="airflowadmin@example.com"}" \ + --role "${_AIRFLOW_WWW_USER_ROLE="Admin"}" \ + --password "${local_password}" || true +} + +function create_system_user_if_missing() { + # This is needed in case of OpenShift-compatible container execution. In case of OpenShift random + # User id is used when starting the image, however group 0 is kept as the user group. Our production + # Image is OpenShift compatible, so all permissions on all folders are set so that 0 group can exercise + # the same privileges as the default "airflow" user, this code checks if the user is already + # present in /etc/passwd and will create the system user dynamically, including setting its + # HOME directory to the /home/airflow so that (for example) the ${HOME}/.local folder where airflow is + # Installed can be automatically added to PYTHONPATH + if ! whoami &> /dev/null; then + if [[ -w /etc/passwd ]]; then + echo "${USER_NAME:-default}:x:$(id -u):0:${USER_NAME:-default} user:${AIRFLOW_USER_HOME_DIR}:/sbin/nologin" \ + >> /etc/passwd + fi + export HOME="${AIRFLOW_USER_HOME_DIR}" + fi +} + +function set_pythonpath_for_root_user() { + # Airflow is installed as a local user application which means that if the container is running as root + # the application is not available. because Python then only load system-wide applications. + # Now also adds applications installed as local user "airflow". + if [[ $UID == "0" ]]; then + local python_major_minor + python_major_minor="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)" + export PYTHONPATH="${AIRFLOW_USER_HOME_DIR}/.local/lib/python${python_major_minor}/site-packages:${PYTHONPATH:-}" + >&2 echo "The container is run as root user. For security, consider using a regular user account." + fi +} + +function wait_for_airflow_db() { + # Wait for the command to run successfully to validate the database connection. + run_check_with_retries "airflow db check" +} + +function upgrade_db() { + local airflow_minor_version + airflow_minor_version="$(echo $AIRFLOW_VERSION | cut -d . -f 2)" + + # https://airflow.apache.org/docs/apache-airflow/stable/installation/upgrading.html#why-you-need-to-upgrade + # Runs airflow db upgrade (< 2.8.x) or migrate (>= 2.8.x) according to the version + if [[ "${airflow_minor_version}" -ge 8 ]]; then + airflow db migrate || true + else + airflow db upgrade + fi +} + +function wait_for_celery_broker() { + # Verifies connection to Celery Broker + local executor + executor="$(airflow config get-value core executor)" + if [[ "${executor}" == "CeleryExecutor" ]]; then + local connection_url + connection_url="$(airflow config get-value celery broker_url)" + wait_for_connection "${connection_url}" + fi +} + +function exec_to_bash_or_python_command_if_specified() { + # If one of the commands: 'bash', 'python' is used, either run appropriate + # command with exec + if [[ ${AIRFLOW_COMMAND} == "bash" ]]; then + shift + exec "/bin/bash" "${@}" + elif [[ ${AIRFLOW_COMMAND} == "python" ]]; then + shift + exec "python" "${@}" + fi +} + +function check_uid_gid() { + if [[ $(id -g) == "0" ]]; then + return + fi + if [[ $(id -u) == "50000" ]]; then + >&2 echo + >&2 echo "WARNING! You should run the image with GID (Group ID) set to 0" + >&2 echo " even if you use 'airflow' user (UID=50000)" + >&2 echo + >&2 echo " You started the image with UID=$(id -u) and GID=$(id -g)" + >&2 echo + >&2 echo " This is to make sure you can run the image with an arbitrary UID in the future." + >&2 echo + >&2 echo " See more about it in the Airflow's docker image documentation" + >&2 echo " http://airflow.apache.org/docs/docker-stack/entrypoint" + >&2 echo + # We still allow the image to run with `airflow` user. + return + else + >&2 echo + >&2 echo "ERROR! You should run the image with GID=0" + >&2 echo + >&2 echo " You started the image with UID=$(id -u) and GID=$(id -g)" + >&2 echo + >&2 echo "The image should always be run with GID (Group ID) set to 0 regardless of the UID used." + >&2 echo " This is to make sure you can run the image with an arbitrary UID." + >&2 echo + >&2 echo " See more about it in the Airflow's docker image documentation" + >&2 echo " http://airflow.apache.org/docs/docker-stack/entrypoint" + # This will not work so we fail hard + exit 1 + fi +} + +# In Airflow image we are setting PIP_USER variable to true, in order to install all the packages +# by default with the ``--user`` flag. However this is a problem if a virtualenv is created later +# which happens in PythonVirtualenvOperator. We are unsetting this variable here, so that it is +# not set when PIP is run by Airflow later on +unset PIP_USER + +check_uid_gid + +# Set umask to 0002 to make all the directories created by the current user group-writeable +# This allows the same directories to be writeable for any arbitrary user the image will be +# run with, when the directory is created on a mounted volume and when that volume is later +# reused with a different UID (but with GID=0) +umask 0002 + +CONNECTION_CHECK_MAX_COUNT=${CONNECTION_CHECK_MAX_COUNT:=20} +readonly CONNECTION_CHECK_MAX_COUNT + +CONNECTION_CHECK_SLEEP_TIME=${CONNECTION_CHECK_SLEEP_TIME:=3} +readonly CONNECTION_CHECK_SLEEP_TIME + +create_system_user_if_missing +set_pythonpath_for_root_user +if [[ "${CONNECTION_CHECK_MAX_COUNT}" -gt "0" ]]; then + wait_for_airflow_db +fi + +if [[ -n "${_AIRFLOW_DB_UPGRADE=}" ]] ; then + upgrade_db +fi + +if [[ -n "${_AIRFLOW_WWW_USER_CREATE=}" ]] ; then + create_www_user +fi + +if [[ -n "${_PIP_ADDITIONAL_REQUIREMENTS=}" ]] ; then + >&2 echo + >&2 echo "!!!!! Installing additional requirements: '${_PIP_ADDITIONAL_REQUIREMENTS}' !!!!!!!!!!!!" + >&2 echo + >&2 echo "WARNING: This is a developpment/test feature only. NEVER use it in production!" + >&2 echo " Instead, build a custom image as described in" + >&2 echo + >&2 echo " https://airflow.apache.org/docs/docker-stack/build.html" + >&2 echo + >&2 echo " Adding requirements at container startup is fragile and is done every time" + >&2 echo " the container starts, so it is onlny useful for testing and trying out" + >&2 echo " of adding dependencies." + >&2 echo + pip install --no-cache-dir ${_PIP_ADDITIONAL_REQUIREMENTS} +fi + + +# The `bash` and `python` commands should also verify the basic connections +# So they are run after the DB check +exec_to_bash_or_python_command_if_specified "${@}" + +# Remove "airflow" if it is specified as airflow command +# This way both command types work the same way: +# +# docker run IMAGE airflow webserver +# docker run IMAGE webserver +# +if [[ ${AIRFLOW_COMMAND} == "airflow" ]]; then + AIRFLOW_COMMAND="${2:-}" + shift +fi + +# Note: the broker backend configuration concerns only a subset of Airflow components +if [[ ${AIRFLOW_COMMAND} =~ ^(scheduler|celery)$ ]] \ + && [[ "${CONNECTION_CHECK_MAX_COUNT}" -gt "0" ]]; then + wait_for_celery_broker +fi + +exec "airflow" "${@}" diff --git a/docker/airflow/2/debian12/2.6/source_code.txt b/docker/airflow/2/debian12/2.6/source_code.txt new file mode 100644 index 0000000000..fc09c05344 --- /dev/null +++ b/docker/airflow/2/debian12/2.6/source_code.txt @@ -0,0 +1,17 @@ +https://github.com/ronf/asyncssh +https://github.com/dequelabs/axe-core +https://github.com/browserslist/caniuse-lite +https://github.com/certifi/python-certifi +https://github.com/chardet/chardet +https://github.com/kieler/elkjs +https://github.com/mattcg/language-subtag-registry +https://github.com/cannatag/ldap3 +https://github.com/mdn/data +https://github.com/PyMySQL/mysqlclient +https://github.com/paramiko/paramiko +https://github.com/cpburnz/python-pathspec +https://github.com/psycopg/psycopg2 +https://github.com/kemitchell/spdx-exceptions.json +https://github.com/jslicense/spdx-license-ids +https://github.com/zopefoundation/zope.event +https://github.com/zopefoundation/zope.interface diff --git a/docker/airflow/templates/Dockerfile.template b/docker/airflow/templates/Dockerfile.template index 28adde8d0e..1d39a27ace 100644 --- a/docker/airflow/templates/Dockerfile.template +++ b/docker/airflow/templates/Dockerfile.template @@ -17,7 +17,7 @@ FROM {{ .From }} as ospo COPY components.csv /components.csv COPY source_code.txt /source_code.txt -RUN apt update && apt -y install ca-certificates +RUN apt update && apt -y install ca-certificates curl RUN curl -o /download-licenses.sh -L https://raw.githubusercontent.com/GoogleCloudPlatform/click-to-deploy/master/scripts/download-licenses.sh \ && curl -o /download-ref-repos.sh -L https://raw.githubusercontent.com/GoogleCloudPlatform/click-to-deploy/master/scripts/download-ref-repos.sh \ @@ -35,6 +35,14 @@ SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "nounset", "-o", "n ENV DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \ LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 +RUN apt-get update \ + && apt-get install -y --no-install-recommends python3 python3-venv python3-pip + +# Create and activate virtual environment +RUN python3 -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Additional development dependencies ENV DEV_APT_DEPS="\ apt-transport-https \ apt-utils \ @@ -97,6 +105,7 @@ ARG AIRFLOW_HOME ARG AIRFLOW_USER_HOME_DIR ARG AIRFLOW_UID +# Set additional environment variables ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \ AIRFLOW_VERSION=${AIRFLOW_VERSION} \ AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS} \ @@ -110,28 +119,30 @@ ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \ AIRFLOW_UID=${AIRFLOW_UID} \ INSTALL_MYSQL_CLIENT="true" \ INSTALL_MSSQL_CLIENT="true" \ - PIP_USER="true" + PIP_USER="false" +# Install required tools COPY scripts/docker/install_mysql.sh scripts/docker/install_mssql.sh /scripts/docker/ - RUN /scripts/docker/install_mysql.sh dev && /scripts/docker/install_mssql.sh ENV PATH=${PATH}:/opt/mssql-tools/bin +# Add airflow user RUN adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password \ --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" && \ - mkdir -p ${AIRFLOW_HOME} && chown -R "airflow:0" "${AIRFLOW_USER_HOME_DIR}" ${AIRFLOW_HOME} - -USER airflow + mkdir -p ${AIRFLOW_HOME} && mkdir -p ${AIRFLOW_USER_HOME_DIR}/.local && \ + chown -R "airflow:0" "${AIRFLOW_USER_HOME_DIR}" ${AIRFLOW_HOME} +# Change user to root then run pip install script and revert back to airflow user +USER root COPY --chown=airflow:0 scripts/docker/install_pip_version.sh /scripts/docker/ - RUN /scripts/docker/install_pip_version.sh +USER airflow +# Final environment settings and running installations ENV INSTALL_FROM_PYPI="true" \ EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3 certifi<2021.0.0 google-ads<14.0.1" WORKDIR /opt/airflow - COPY --chown=airflow:0 scripts/docker/install_airflow.sh /scripts/docker/ RUN /scripts/docker/install_airflow.sh \ @@ -142,10 +153,12 @@ RUN /scripts/docker/install_airflow.sh \ FROM {{ .From }} as main +# Copy necessary binaries and settings from build stage COPY --from=ospo /usr/src /usr/src SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "nounset", "-o", "nolog", "-c"] +# Set up necessary privileges ARG AIRFLOW_USER_HOME_DIR ARG AIRFLOW_HOME ARG AIRFLOW_UID @@ -157,6 +170,7 @@ ENV AIRFLOW_VERSION=${AIRFLOW_VERSION} \ LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 \ AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} +# Runtime dependencies ENV RUNTIME_APT_DEPS="\ apt-transport-https \ apt-utils \ @@ -166,20 +180,22 @@ ENV RUNTIME_APT_DEPS="\ freetds-bin \ krb5-user \ ldap-utils \ - libffi7 \ - libldap-2.4-2 \ + libffi8 \ + libldap-common \ libsasl2-2 \ libsasl2-modules \ - libssl1.1 \ + libssl-dev \ locales \ lsb-release \ - netcat \ + netcat-traditional \ openssh-client \ pkg-config \ postgresql-client \ - python2 \ + dh-python \ python3 \ python3-pip \ + python3-venv \ + pkg-config \ rsync \ sasl2-bin \ sqlite3 \ @@ -196,8 +212,9 @@ ENV RUNTIME_APT_COMMAND="echo" \ AIRFLOW_HOME=${AIRFLOW_HOME} \ PATH="${AIRFLOW_USER_HOME_DIR}/.local/bin:${PATH}" \ GUNICORN_CMD_ARGS="--worker-tmp-dir /dev/shm" \ - PIP_USER="true" + PIP_USER="false" +# Install and configure runtime environment RUN apt-get update \ && apt-get install --no-install-recommends -yqq apt-utils >/dev/null 2>&1 \ && apt-get install -y --no-install-recommends curl ca-certificates gnupg2 \ @@ -249,42 +266,50 @@ RUN set -eux; \ gosu nobody true +# Continue installation and set up user permissions COPY scripts/docker/install_mysql.sh /scripts/docker/install_mssql.sh /scripts/docker/ RUN chmod a+x /scripts/docker/install_mysql.sh /scripts/docker/install_mssql.sh \ && sync \ && /scripts/docker/install_mysql.sh prod \ && /scripts/docker/install_mssql.sh \ - && adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password \ - --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" \ + && adduser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password --quiet "airflow" --uid "${AIRFLOW_UID}" --gid "0" --home "${AIRFLOW_USER_HOME_DIR}" \ && mkdir -pv "${AIRFLOW_HOME}" \ && mkdir -pv "${AIRFLOW_HOME}/dags" \ && mkdir -pv "${AIRFLOW_HOME}/logs" \ && chown -R airflow:0 "${AIRFLOW_USER_HOME_DIR}" "${AIRFLOW_HOME}" \ && chmod -R g+rw "${AIRFLOW_USER_HOME_DIR}" "${AIRFLOW_HOME}" \ - && find "${AIRFLOW_HOME}" -executable -print0 | xargs --null chmod g+x \ - && find "${AIRFLOW_USER_HOME_DIR}" -executable -print0 | xargs --null chmod g+x + && find "${AIRFLOW_HOME}" -executable -print0 | xargs -0 chmod g+x \ + && find "${AIRFLOW_USER_HOME_DIR}" -executable -print0 | xargs -0 chmod g+x +# Copy pre-built local environment for Airflow and set up entry points COPY --chown=airflow:0 --from=airflow-build-image \ "${AIRFLOW_USER_HOME_DIR}/.local" "${AIRFLOW_USER_HOME_DIR}/.local" COPY --chown=airflow:0 scripts/prod/entrypoint_prod.sh /entrypoint COPY --chown=airflow:0 scripts/prod/clean-logs.sh /clean-logs +# Ensure scripts are executable and adjust file permissions appropriately RUN chmod a+x /entrypoint /clean-logs \ && chmod g=u /etc/passwd \ - && chmod g+w "${AIRFLOW_USER_HOME_DIR}/.local" \ - && usermod -g 0 airflow -G 0 + && chmod g+w "${AIRFLOW_USER_HOME_DIR}/.local" +# Modify secure path to include virtual environment RUN sed --in-place=.bak "s/secure_path=\"/secure_path=\"\/.venv\/bin:/" /etc/sudoers +# Environment settings for runtime ENV DUMB_INIT_SETSID="1" \ PS1="(airflow)" \ LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libstdc++.so.6" +# Set work directory and expose port for webserver WORKDIR ${AIRFLOW_HOME} EXPOSE 8080 + +# Run as airflow user USER ${AIRFLOW_UID} +# Define Airflow release version ENV C2D_RELEASE {{ $airflow.Version }} +# Set default entrypoint and command for the container ENTRYPOINT ["/usr/bin/dumb-init", "--", "/entrypoint"] CMD [""] diff --git a/docker/airflow/templates/scripts/docker/install_mysql.sh b/docker/airflow/templates/scripts/docker/install_mysql.sh index 3a37bc93a0..9581a6e63a 100755 --- a/docker/airflow/templates/scripts/docker/install_mysql.sh +++ b/docker/airflow/templates/scripts/docker/install_mysql.sh @@ -40,7 +40,7 @@ install_mysql_client() { gpgconf --kill all rm -rf "${GNUPGHOME}" unset GNUPGHOME - echo "deb http://repo.mysql.com/apt/debian/ buster mysql-${MYSQL_VERSION}" | tee -a /etc/apt/sources.list.d/mysql.list + echo "deb http://repo.mysql.com/apt/debian/ bookworm mysql-${MYSQL_VERSION}" | tee -a /etc/apt/sources.list.d/mysql.list apt-get update apt-get install --no-install-recommends -y "${packages[@]}" apt-get autoremove -yqq --purge diff --git a/docker/airflow/templates/scripts/docker/install_pip_version.sh b/docker/airflow/templates/scripts/docker/install_pip_version.sh index ba15c70501..a254e7f8d6 100755 --- a/docker/airflow/templates/scripts/docker/install_pip_version.sh +++ b/docker/airflow/templates/scripts/docker/install_pip_version.sh @@ -6,8 +6,8 @@ function install_pip_version() { echo echo "Installing pip version ${AIRFLOW_PIP_VERSION}" echo - pip install --disable-pip-version-check --no-cache-dir --upgrade "pip==${AIRFLOW_PIP_VERSION}" && - mkdir -p ${HOME}/.local/bin + pip install --disable-pip-version-check --no-cache-dir --upgrade "pip==${AIRFLOW_PIP_VERSION}" + # Usunięto linię tworzącą folder .local/bin, ponieważ może to być zbędne w środowisku wirtualnym } -install_pip_version +install_pip_version \ No newline at end of file diff --git a/docker/airflow/versions.yaml b/docker/airflow/versions.yaml index d5df139c0d..7c03d2b07f 100644 --- a/docker/airflow/versions.yaml +++ b/docker/airflow/versions.yaml @@ -16,27 +16,27 @@ cloudbuild: enable_parallel: false versions: -- dir: 2/debian11/2.8 - from: marketplace.gcr.io/google/c2d-debian11 +- dir: 2/debian12/2.10 + from: marketplace.gcr.io/google/debian12 packages: airflow: - version: 2.8.2 + version: 2.10.2 pip: - version: 22.3.1 + version: 24.2 gosu: gpg: B42F6819007F00F88E364FD4036A9C25BF357DD4 version: '1.17' repo: airflow2 tags: - - 2.8.2-debian11 - - 2.8-debian11 - - 2-debian11 - - 2.8.2 - - '2.8' + - 2.10.2-debian12 + - 2.10-debian12 + - 2-debian12 + - 2.10.2 + - '2.10' - '2' - latest -- dir: 2/debian11/2.6 - from: marketplace.gcr.io/google/c2d-debian11 +- dir: 2/debian12/2.6 + from: marketplace.gcr.io/google/debian12 packages: airflow: version: 2.6.3 @@ -44,10 +44,10 @@ versions: gpg: B42F6819007F00F88E364FD4036A9C25BF357DD4 version: '1.17' pip: - version: 22.3.1 + version: 24.2 repo: airflow2 tags: - - 2.6.3-debian11 - - 2.6-debian11 + - 2.6.3-debian12 + - 2.6-debian12 - 2.6.3 - '2.6' From 31493803cbbec9818d64608a8f97e808d81c9aea Mon Sep 17 00:00:00 2001 From: Adrian Manikowski Date: Wed, 9 Oct 2024 11:40:05 +0000 Subject: [PATCH 2/2] Docker - Airflow - BUMP to 2.10.2 & debian12 --- docker/airflow/tests/functional_tests/running_test.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/airflow/tests/functional_tests/running_test.yaml b/docker/airflow/tests/functional_tests/running_test.yaml index 5cc2a4119d..85a5129441 100644 --- a/docker/airflow/tests/functional_tests/running_test.yaml +++ b/docker/airflow/tests/functional_tests/running_test.yaml @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ setup: - 'MYSQL_ROOT_PASSWORD=some-password' - '-d' - 'marketplace.gcr.io/google/postgresql13' -- command: [sleep, '20s'] +- command: [sleep, '180s'] - command: - 'docker' - 'run' @@ -54,7 +54,7 @@ setup: - '-d' - '$IMAGE' - 'webserver' -- command: [sleep, '70s'] +- command: [sleep, '180s'] teardown: - command: [docker, stop, some-airflow-$UNIQUE-id, some-postgres-$UNIQUE-id]